@vesper85/strategy-sdk 0.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.
@@ -0,0 +1,414 @@
1
+ import type { OHLCV, TAParams } from "@vesper85/technical-indicators";
2
+ import type { GammaMarket, Event as GammaEvent, Tag, Team, Sport, Series, Comment as GammaComment, SearchResults, PaginatedResponse, MarketFilters, EventFilters, EventPaginationFilters, PaginationParams, SearchParams } from "polymarket-gamma";
3
+ import type { ClearinghouseState, SpotMeta, SpotClearinghouseState, SpotMetaAndAssetCtxs, Meta, MetaAndAssetCtxs, UserFunding, UserNonFundingLedgerUpdates, FundingHistory, PredictedFundings, PerpsAtOpenInterestCap, PerpDexLimits, AllMids, UserOpenOrders, FrontendOpenOrders, UserFills, UserRateLimit, OrderStatus, L2Book, CandleSnapshot, HistoricalOrder, TwapSliceFill, SubAccount, VaultDetails, VaultEquity, UserRole, Delegation, DelegatorSummary, DelegatorHistoryEntry, DelegatorReward, ValidatorSummary, VaultSummary, UserFees, PortfolioPeriods, PreTransferCheck, Referral, ExtraAgent, LegalCheck, TwapHistory, MultiSigSigners, BuilderFeeApproval, UserOrderHistory } from "hyperliquid";
4
+ export interface OsirisState {
5
+ get(key: string): Promise<any>;
6
+ set(key: string, value: any): Promise<void>;
7
+ }
8
+ /**
9
+ * Order side for Polymarket trades
10
+ */
11
+ export type PolymarketOrderSide = 'BUY' | 'SELL';
12
+ /**
13
+ * Parameters for creating a limit order
14
+ */
15
+ export interface PolymarketLimitOrderParams {
16
+ /** Token ID of the outcome token */
17
+ tokenId: string;
18
+ /** Price per share (0-1 range) */
19
+ price: number;
20
+ /** Order side */
21
+ side: PolymarketOrderSide;
22
+ /** Number of shares */
23
+ size: number;
24
+ /** Fee rate in basis points (optional, default 0) */
25
+ feeRateBps?: string;
26
+ /** Time in force (optional) */
27
+ expiration?: number;
28
+ }
29
+ /**
30
+ * Parameters for creating a market order
31
+ */
32
+ export interface PolymarketMarketOrderParams {
33
+ /** Token ID of the outcome token */
34
+ tokenId: string;
35
+ /** Amount in USDC to spend (for BUY) or shares to sell (for SELL) */
36
+ amount: number;
37
+ /** Order side */
38
+ side: PolymarketOrderSide;
39
+ /** Slippage tolerance as a decimal (e.g., 0.05 for 5%) */
40
+ slippageTolerance?: number;
41
+ }
42
+ /**
43
+ * Response from order operations
44
+ */
45
+ export interface PolymarketOrderResponse {
46
+ success: boolean;
47
+ /** Order ID if successful */
48
+ orderId?: string;
49
+ /** Transaction hash if applicable */
50
+ transactionHash?: string;
51
+ /** Error message if failed */
52
+ errorMsg?: string;
53
+ }
54
+ /**
55
+ * Open order information
56
+ */
57
+ export interface PolymarketOpenOrder {
58
+ id: string;
59
+ market: string;
60
+ asset_id: string;
61
+ side: string;
62
+ original_size: string;
63
+ size_matched: string;
64
+ price: string;
65
+ outcome: string;
66
+ owner: string;
67
+ timestamp: number;
68
+ expiration: number;
69
+ order_type: string;
70
+ }
71
+ /**
72
+ * Response from cancel operations
73
+ */
74
+ export interface PolymarketCancelResponse {
75
+ /** Successfully canceled order IDs */
76
+ canceled: string[];
77
+ /** Orders that couldn't be canceled with reasons */
78
+ not_canceled: Record<string, string>;
79
+ }
80
+ /**
81
+ * Order book entry
82
+ */
83
+ export interface PolymarketOrderBookEntry {
84
+ price: string;
85
+ size: string;
86
+ }
87
+ /**
88
+ * Order book structure
89
+ */
90
+ export interface PolymarketOrderBook {
91
+ market: string;
92
+ asset_id: string;
93
+ bids: PolymarketOrderBookEntry[];
94
+ asks: PolymarketOrderBookEntry[];
95
+ hash: string;
96
+ timestamp: string;
97
+ }
98
+ /**
99
+ * Result from setting up approvals
100
+ */
101
+ export interface PolymarketApprovalResult {
102
+ /** USDC approval transaction hash (if approval was needed) */
103
+ usdcApprovalTx?: string;
104
+ /** CTF approval transaction hash (if approval was needed) */
105
+ ctfApprovalTx?: string;
106
+ /** Whether USDC was already approved */
107
+ usdcWasAlreadyApproved: boolean;
108
+ /** Whether CTF was already approved */
109
+ ctfWasAlreadyApproved: boolean;
110
+ }
111
+ /**
112
+ * Options for Polymarket client
113
+ *
114
+ * When using OsirisSigner, orders are placed via MCP tools which require
115
+ * MCP-specific authentication tokens (separate from backend OAuth tokens).
116
+ */
117
+ export interface PolymarketClientOptions {
118
+ /** Chain ID (default: 137 for Polygon mainnet) */
119
+ chainId?: number;
120
+ /** Auto-approve tokens before trades (default: false) */
121
+ autoApprove?: boolean;
122
+ /** CLOB API host (default: https://clob.polymarket.com) */
123
+ clobHost?: string;
124
+ /**
125
+ * MCP server URL for order placement via MCP tools
126
+ * Default: https://gateway.backend.osirislabs.xyz/@osiris/polymarket/mcp
127
+ */
128
+ mcpUrl?: string;
129
+ /**
130
+ * MCP OAuth access token for authenticated MCP calls.
131
+ * IMPORTANT: This must be an MCP-specific token obtained through the Osiris Hub
132
+ * OAuth flow for MCP packages (via /hub/authorize endpoint with MCP scopes).
133
+ * This is NOT the same as the general backend access token.
134
+ * Required scopes: osiris:auth, osiris:auth:action
135
+ */
136
+ mcpAccessToken?: string;
137
+ /**
138
+ * Flag to explicitly enable MCP mode for order placement.
139
+ * When true, orders are placed via MCP tools instead of direct CLOB client.
140
+ * Auto-detected based on signer type if not provided (enabled for OsirisSigner).
141
+ */
142
+ useMcpForOrders?: boolean;
143
+ }
144
+ /**
145
+ * Technical Analysis API
146
+ * Provides methods for calculating technical indicators
147
+ */
148
+ export interface TechnicalAnalysisAPI {
149
+ calculate(indicator: string, data: OHLCV[], params?: TAParams & {
150
+ component?: string;
151
+ }): number | number[];
152
+ }
153
+ /**
154
+ * Polymarket-specific API
155
+ * Combines data, account, and execution methods for Polymarket markets
156
+ */
157
+ export interface PolymarketAPI {
158
+ getPrice(ticker: string): Promise<number>;
159
+ getIndicator(ticker: string, indicator: string, params?: any): Promise<number>;
160
+ search(params: SearchParams): Promise<SearchResults>;
161
+ getMarket(idOrSlug: string): Promise<GammaMarket>;
162
+ getMarkets(filters?: MarketFilters & {
163
+ end_date_min?: string;
164
+ end_date_max?: string;
165
+ start_date_min?: string;
166
+ start_date_max?: string;
167
+ liquidity_num_min?: number;
168
+ liquidity_num_max?: number;
169
+ volume_num_min?: number;
170
+ volume_num_max?: number;
171
+ limit?: number;
172
+ offset?: number;
173
+ order?: string;
174
+ ascending?: boolean;
175
+ closed?: boolean;
176
+ }): Promise<GammaMarket[]>;
177
+ getMarketTags(marketId: string): Promise<Tag[]>;
178
+ getEvent(idOrSlug: string): Promise<GammaEvent>;
179
+ getEvents(filters?: EventFilters): Promise<GammaEvent[]>;
180
+ getEventTags(eventId: string): Promise<Tag[]>;
181
+ getEventsPaginated(filters?: EventPaginationFilters): Promise<PaginatedResponse<GammaEvent>>;
182
+ getTags(params?: PaginationParams): Promise<Tag[]>;
183
+ getTag(idOrSlug: string): Promise<Tag>;
184
+ getRelatedTags(idOrSlug: string): Promise<Tag[]>;
185
+ getRelatedTagsTags(idOrSlug: string): Promise<Tag[]>;
186
+ getTeams(params?: PaginationParams): Promise<Team[]>;
187
+ getSports(params?: PaginationParams): Promise<Sport[]>;
188
+ getSeries(params?: PaginationParams): Promise<Series[]>;
189
+ getSeriesById(seriesId: string): Promise<Series>;
190
+ getComments(params?: PaginationParams): Promise<GammaComment[]>;
191
+ getComment(commentId: string): Promise<GammaComment>;
192
+ getCommentsByUser(userAddress: string, params?: PaginationParams): Promise<GammaComment[]>;
193
+ getPositions(user: string, params?: any): Promise<any[]>;
194
+ getTrades(user: string, params?: any): Promise<any[]>;
195
+ getActivity(user: string, params?: any): Promise<any[]>;
196
+ getTopHolders(marketId: string): Promise<any[]>;
197
+ getPortfolioValue(user: string): Promise<number>;
198
+ getClosedPositions(user: string, params?: any): Promise<any[]>;
199
+ getTradedMarketsCount(user: string): Promise<number>;
200
+ getOpenInterest(marketId: string): Promise<number>;
201
+ getPosition(ticker: string): Promise<any | null>;
202
+ /**
203
+ * Initialize the CLOB trading client
204
+ * This generates API credentials and sets up the client for trading
205
+ * Must be called before placing orders
206
+ */
207
+ initializeTradingClient(): Promise<void>;
208
+ /**
209
+ * Check if the trading client is initialized
210
+ */
211
+ isTradingClientInitialized(): boolean;
212
+ /**
213
+ * Get current USDC allowance for the CTF Exchange contract
214
+ * @returns Current allowance in wei (as bigint)
215
+ */
216
+ getUsdcAllowance(): Promise<bigint>;
217
+ /**
218
+ * Approve USDC spending for the CTF Exchange contract
219
+ * @param amount Amount to approve in wei (defaults to max uint256)
220
+ * @returns Transaction hash
221
+ */
222
+ approveUsdc(amount?: bigint): Promise<string>;
223
+ /**
224
+ * Check if CTF (Conditional Tokens) are approved for the CTF Exchange
225
+ * @returns True if approved for all
226
+ */
227
+ isCtfApprovedForAll(): Promise<boolean>;
228
+ /**
229
+ * Approve CTF (Conditional Tokens) for the CTF Exchange contract
230
+ * @returns Transaction hash
231
+ */
232
+ approveCtf(): Promise<string>;
233
+ /**
234
+ * Set up all required approvals for trading
235
+ * @param options Approval options
236
+ * @returns Result containing transaction hashes
237
+ */
238
+ setupApprovals(options?: {
239
+ usdcAmount?: bigint;
240
+ }): Promise<PolymarketApprovalResult>;
241
+ /**
242
+ * Create and post a limit order
243
+ * @param params Order parameters
244
+ * @returns Order response
245
+ */
246
+ createLimitOrder(params: PolymarketLimitOrderParams): Promise<PolymarketOrderResponse>;
247
+ /**
248
+ * Create and post a market order (executes immediately at best price)
249
+ * @param params Order parameters
250
+ * @returns Order response
251
+ */
252
+ createMarketOrder(params: PolymarketMarketOrderParams): Promise<PolymarketOrderResponse>;
253
+ /**
254
+ * Get all open orders for the user
255
+ * @returns Array of open orders
256
+ */
257
+ getOpenOrders(): Promise<PolymarketOpenOrder[]>;
258
+ /**
259
+ * Cancel a specific order
260
+ * @param orderId Order ID to cancel
261
+ * @returns Cancel response
262
+ */
263
+ cancelOrder(orderId: string): Promise<PolymarketCancelResponse>;
264
+ /**
265
+ * Cancel multiple orders
266
+ * @param orderIds Array of order IDs to cancel
267
+ * @returns Cancel response
268
+ */
269
+ cancelOrders(orderIds: string[]): Promise<PolymarketCancelResponse>;
270
+ /**
271
+ * Cancel all open orders
272
+ * @returns Cancel response
273
+ */
274
+ cancelAllOrders(): Promise<PolymarketCancelResponse>;
275
+ /**
276
+ * Get the order book for a specific token
277
+ * @param tokenId Token ID
278
+ * @returns Order book data
279
+ */
280
+ getOrderBook(tokenId: string): Promise<PolymarketOrderBook>;
281
+ /**
282
+ * Place a limit buy order
283
+ * @param tokenId Token ID of the outcome
284
+ * @param price Price per share (0-1 range)
285
+ * @param size Number of shares to buy
286
+ * @returns Order response
287
+ */
288
+ buyLimit(tokenId: string, price: number, size: number): Promise<PolymarketOrderResponse>;
289
+ /**
290
+ * Place a limit sell order
291
+ * @param tokenId Token ID of the outcome
292
+ * @param price Price per share (0-1 range)
293
+ * @param size Number of shares to sell
294
+ * @returns Order response
295
+ */
296
+ sellLimit(tokenId: string, price: number, size: number): Promise<PolymarketOrderResponse>;
297
+ /**
298
+ * Place a market buy order (executes immediately at best price)
299
+ * @param tokenId Token ID of the outcome
300
+ * @param amount Amount in USDC to spend
301
+ * @param slippage Slippage tolerance as decimal (e.g., 0.05 for 5%). Default: 0.05
302
+ * @returns Order response
303
+ */
304
+ buyMarket(tokenId: string, amount: number, slippage?: number): Promise<PolymarketOrderResponse>;
305
+ /**
306
+ * Place a market sell order (executes immediately at best price)
307
+ * @param tokenId Token ID of the outcome
308
+ * @param size Number of shares to sell
309
+ * @param slippage Slippage tolerance as decimal (e.g., 0.05 for 5%). Default: 0.05
310
+ * @returns Order response
311
+ */
312
+ sellMarket(tokenId: string, size: number, slippage?: number): Promise<PolymarketOrderResponse>;
313
+ /**
314
+ * Buy shares of an outcome token (uses market order)
315
+ * @param tokenId Token ID of the outcome
316
+ * @param size Amount in USDC to spend
317
+ * @deprecated Use buyMarket() instead
318
+ */
319
+ buy(tokenId: string, size: number): Promise<void>;
320
+ /**
321
+ * Sell shares of an outcome token (uses market order)
322
+ * @param tokenId Token ID of the outcome
323
+ * @param size Number of shares to sell
324
+ * @deprecated Use sellMarket() instead
325
+ */
326
+ sell(tokenId: string, size: number): Promise<void>;
327
+ }
328
+ /**
329
+ * Hyperliquid-specific API
330
+ * Combines data, account, and execution methods for Hyperliquid markets
331
+ */
332
+ export interface HyperliquidAPI {
333
+ getPrice(ticker: string): Promise<number>;
334
+ getIndicator(ticker: string, indicator: string, params?: any): Promise<number>;
335
+ getSpotMeta(): Promise<SpotMeta>;
336
+ getSpotClearinghouseState(user: string): Promise<SpotClearinghouseState>;
337
+ getSpotMetaAndAssetCtxs(): Promise<SpotMetaAndAssetCtxs>;
338
+ getTokenDetails(tokenId: string): Promise<any>;
339
+ getSpotDeployState(user: string): Promise<any>;
340
+ getMeta(): Promise<Meta>;
341
+ getMetaAndAssetCtxs(): Promise<MetaAndAssetCtxs>;
342
+ getClearinghouseState(user: string): Promise<ClearinghouseState>;
343
+ getUserFunding(user: string, startTime: number, endTime?: number): Promise<UserFunding>;
344
+ getUserNonFundingLedgerUpdates(user: string, startTime: number, endTime?: number): Promise<UserNonFundingLedgerUpdates>;
345
+ getFundingHistory(coin: string, startTime: number, endTime?: number): Promise<FundingHistory>;
346
+ getPredictedFundings(): Promise<PredictedFundings>;
347
+ getPerpsAtOpenInterestCap(): Promise<PerpsAtOpenInterestCap>;
348
+ getPerpDexLimits(dex: string): Promise<PerpDexLimits>;
349
+ getAssetIndex(assetName: string): Promise<number | undefined>;
350
+ getInternalName(exchangeName: string): Promise<string | undefined>;
351
+ getAllAssets(): Promise<{
352
+ perp: string[];
353
+ spot: string[];
354
+ }>;
355
+ getAllMids(): Promise<AllMids>;
356
+ getUserOpenOrders(user: string): Promise<UserOpenOrders>;
357
+ getFrontendOpenOrders(user: string): Promise<FrontendOpenOrders>;
358
+ getUserFills(user: string): Promise<UserFills>;
359
+ getUserFillsByTime(user: string, startTime: number, endTime: number): Promise<UserFills>;
360
+ getUserRateLimit(user: string): Promise<UserRateLimit>;
361
+ getOrderStatus(user: string, oid: number | string): Promise<OrderStatus>;
362
+ getL2Book(coin: string): Promise<L2Book>;
363
+ getCandleSnapshot(coin: string, interval: string, startTime: number, endTime: number): Promise<CandleSnapshot>;
364
+ getMaxBuilderFee(user: string, builder: string): Promise<number>;
365
+ getHistoricalOrders(user: string): Promise<HistoricalOrder[]>;
366
+ getUserTwapSliceFills(user: string): Promise<TwapSliceFill[]>;
367
+ getSubAccounts(user: string): Promise<SubAccount[]>;
368
+ getVaultDetails(vaultAddress: string, user?: string): Promise<VaultDetails>;
369
+ getUserVaultEquities(user: string): Promise<VaultEquity[]>;
370
+ getUserRole(user: string): Promise<UserRole>;
371
+ getDelegations(user: string): Promise<Delegation[]>;
372
+ getDelegatorSummary(user: string): Promise<DelegatorSummary>;
373
+ getDelegatorHistory(user: string): Promise<DelegatorHistoryEntry[]>;
374
+ getDelegatorRewards(user: string): Promise<DelegatorReward[]>;
375
+ validatorSummaries(): Promise<ValidatorSummary[]>;
376
+ vaultSummaries(): Promise<VaultSummary[]>;
377
+ userFees(user: string): Promise<UserFees>;
378
+ portfolio(user: string): Promise<PortfolioPeriods>;
379
+ preTransferCheck(user: string, source: string): Promise<PreTransferCheck>;
380
+ referral(user: string): Promise<Referral>;
381
+ extraAgents(user: string): Promise<ExtraAgent[]>;
382
+ isVip(user: string): Promise<boolean>;
383
+ legalCheck(user: string): Promise<LegalCheck>;
384
+ userTwapSliceFillsByTime(user: string, startTime: number, endTime?: number): Promise<TwapSliceFill[]>;
385
+ twapHistory(user: string): Promise<TwapHistory[]>;
386
+ userToMultiSigSigners(user: string): Promise<MultiSigSigners | null>;
387
+ getBuilderFeeApproval(user: string, builderAddress: string): Promise<BuilderFeeApproval>;
388
+ getUserOrderHistory(user: string, startTime: number, endTime?: number): Promise<UserOrderHistory>;
389
+ getPosition(ticker: string): Promise<ClearinghouseState['assetPositions'][0] | null>;
390
+ getPositions(): Promise<ClearinghouseState['assetPositions']>;
391
+ }
392
+ /**
393
+ * Signer interface for transaction signing
394
+ */
395
+ export interface SignerAPI {
396
+ signTransaction(transaction: string | any, chain: string, walletAddress: string): Promise<string>;
397
+ signTypedData(typedData: any, chain: string, walletAddress: string): Promise<string>;
398
+ signMessage(message: string | Uint8Array, chain: string, walletAddress: string): Promise<string>;
399
+ getAddress(): string | undefined;
400
+ getPrivateKey(): string | undefined;
401
+ }
402
+ /**
403
+ * Osiris Context
404
+ * Provides market-specific APIs based on the strategy's configured market
405
+ */
406
+ export interface OsirisContext {
407
+ polymarket?: PolymarketAPI;
408
+ hyperliquid?: HyperliquidAPI;
409
+ ta: TechnicalAnalysisAPI;
410
+ state: OsirisState;
411
+ signer: SignerAPI;
412
+ log: (message: string, meta?: any) => void;
413
+ }
414
+ //# sourceMappingURL=osiris.d.ts.map
@@ -0,0 +1,35 @@
1
+ import type { OsirisContext } from "./osiris";
2
+ import type { EventSubscription, StrategyEvent } from "./event-types";
3
+ /**
4
+ * Strategy interface supporting both tick-based and event-based execution
5
+ *
6
+ * Tick-based strategies: Implement shouldTrigger() and onTrigger()
7
+ * Event-based strategies: Implement subscriptions[] and onEvent()
8
+ *
9
+ * These modes are mutually exclusive - a strategy should use one or the other.
10
+ */
11
+ export interface CodeStrategy {
12
+ /**
13
+ * Called on each tick to determine if the strategy should execute
14
+ * @returns true if onTrigger should be called
15
+ */
16
+ shouldTrigger?(osiris: OsirisContext): Promise<boolean>;
17
+ /**
18
+ * Called when shouldTrigger returns true
19
+ * Contains the main strategy logic for tick-based execution
20
+ */
21
+ onTrigger?(osiris: OsirisContext): Promise<void>;
22
+ /**
23
+ * List of events this strategy wants to subscribe to
24
+ * The EventRunner will subscribe to these events on the WebSocket connection
25
+ */
26
+ subscriptions?: EventSubscription[];
27
+ /**
28
+ * Called when a subscribed event is received
29
+ * Contains the main strategy logic for event-based execution
30
+ * @param event The event that triggered this call
31
+ * @param osiris The context with market APIs and utilities
32
+ */
33
+ onEvent?(event: StrategyEvent, osiris: OsirisContext): Promise<void>;
34
+ }
35
+ //# sourceMappingURL=strategy.d.ts.map
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Simple logger interface for the SDK
3
+ * Users can provide their own logger implementation or use the console logger
4
+ */
5
+ export interface Logger {
6
+ info(message: string, meta?: any): void;
7
+ error(message: string, error?: any): void;
8
+ warning(message: string, meta?: any): void;
9
+ debug(message: string, meta?: any): void;
10
+ }
11
+ /**
12
+ * Creates a simple console logger that matches the Logger interface
13
+ */
14
+ export declare function createConsoleLogger(): Logger;
15
+ //# sourceMappingURL=logger.d.ts.map
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@vesper85/strategy-sdk",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "SDK for writing and running trading strategies with Polymarket and Hyperliquid integrations",
6
+ "keywords": [
7
+ "trading",
8
+ "strategy",
9
+ "polymarket",
10
+ "hyperliquid",
11
+ "trading-bot",
12
+ "osiris"
13
+ ],
14
+ "main": "./dist/index.js",
15
+ "types": "./dist/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "import": "./dist/index.js",
19
+ "types": "./dist/index.d.ts"
20
+ },
21
+ "./package.json": "./package.json"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "README.md",
26
+ "LICENSE",
27
+ "!**/*.map"
28
+ ],
29
+ "sideEffects": false,
30
+ "license": "MIT",
31
+ "scripts": {
32
+ "build": "tsup && npm run types",
33
+ "types": "tsc --emitDeclarationOnly --declaration --outDir dist",
34
+ "build:watch": "tsup --watch",
35
+ "dev": "tsup --watch",
36
+ "lint": "eslint \"src/**/*.ts*\"",
37
+ "lint:fix": "eslint \"src/**/*.ts*\" --fix",
38
+ "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
39
+ "type-check": "tsc --noEmit",
40
+ "prepublishOnly": "npm run build",
41
+ "changeset": "changeset",
42
+ "version": "changeset version",
43
+ "release": "npm run build && changeset publish"
44
+ },
45
+ "dependencies": {
46
+ "@vesper85/technical-indicators": "^0.1.0",
47
+ "@polymarket/clob-client": "^4.6.0",
48
+ "axios": "^1.7.9",
49
+ "ethers": "^6.13.4",
50
+ "hyperliquid": "^1.7.7",
51
+ "polymarket-gamma": "^0.4.0",
52
+ "redis": "^4.7.0",
53
+ "superjson": "^2.2.6",
54
+ "viem": "^2.30.1"
55
+ },
56
+ "devDependencies": {
57
+ "@changesets/cli": "^2.29.8",
58
+ "@osiris-ai/eslint-config": "workspace:*",
59
+ "@osiris-ai/typescript-config": "workspace:*",
60
+ "@types/node": "^22.10.1",
61
+ "eslint": "^8.37.0",
62
+ "tsup": "^8.5.0",
63
+ "typescript": "^5.8.3"
64
+ },
65
+ "engines": {
66
+ "node": ">=18.0.0"
67
+ },
68
+ "repository": {
69
+ "type": "git",
70
+ "url": "https://github.com/FetcchX/legion-sdk.git"
71
+ },
72
+ "bugs": {
73
+ "url": "https://github.com/FetcchX/legion-sdk/issues"
74
+ },
75
+ "homepage": "https://github.com/FetcchX/legion-sdk#readme"
76
+ }