@openmarketsai/order-sheet 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.
Files changed (65) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/README.md +183 -0
  4. package/dist/auth.d.ts +24 -0
  5. package/dist/auth.js +36 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/client.d.ts +158 -0
  8. package/dist/client.js +253 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/errors.d.ts +34 -0
  11. package/dist/errors.js +34 -0
  12. package/dist/errors.js.map +1 -0
  13. package/dist/generated/contract.d.ts +28 -0
  14. package/dist/generated/contract.js +176 -0
  15. package/dist/generated/contract.js.map +1 -0
  16. package/dist/http.d.ts +19 -0
  17. package/dist/http.js +58 -0
  18. package/dist/http.js.map +1 -0
  19. package/dist/index.cjs +1742 -0
  20. package/dist/index.d.ts +41 -0
  21. package/dist/index.js +31 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/math.d.ts +22 -0
  24. package/dist/math.js +55 -0
  25. package/dist/math.js.map +1 -0
  26. package/dist/messages.d.ts +21 -0
  27. package/dist/messages.js +97 -0
  28. package/dist/messages.js.map +1 -0
  29. package/dist/odds.d.ts +12 -0
  30. package/dist/odds.js +33 -0
  31. package/dist/odds.js.map +1 -0
  32. package/dist/quote.d.ts +20 -0
  33. package/dist/quote.js +117 -0
  34. package/dist/quote.js.map +1 -0
  35. package/dist/react.cjs +2137 -0
  36. package/dist/react.d.ts +157 -0
  37. package/dist/react.js +297 -0
  38. package/dist/react.js.map +1 -0
  39. package/dist/sheet.d.ts +77 -0
  40. package/dist/sheet.js +648 -0
  41. package/dist/sheet.js.map +1 -0
  42. package/dist/stream.d.ts +71 -0
  43. package/dist/stream.js +160 -0
  44. package/dist/stream.js.map +1 -0
  45. package/dist/types.d.ts +287 -0
  46. package/dist/types.js +2 -0
  47. package/dist/types.js.map +1 -0
  48. package/dist/ui/styles.css +284 -0
  49. package/dist/ui/theme.d.ts +108 -0
  50. package/dist/ui/theme.js +180 -0
  51. package/dist/ui/theme.js.map +1 -0
  52. package/dist/ui.cjs +2606 -0
  53. package/dist/ui.d.ts +124 -0
  54. package/dist/ui.js +154 -0
  55. package/dist/ui.js.map +1 -0
  56. package/dist/validate.d.ts +20 -0
  57. package/dist/validate.js +126 -0
  58. package/dist/validate.js.map +1 -0
  59. package/dist/venues.d.ts +19 -0
  60. package/dist/venues.js +103 -0
  61. package/dist/venues.js.map +1 -0
  62. package/dist/wire.d.ts +382 -0
  63. package/dist/wire.js +2 -0
  64. package/dist/wire.js.map +1 -0
  65. package/package.json +78 -0
package/dist/wire.d.ts ADDED
@@ -0,0 +1,382 @@
1
+ /**
2
+ * Wire shapes — what the OpenMarkets Flow API actually sends and receives, in the
3
+ * API's own snake_case. Mirrors src/types/api-contracts/flow-v1.ts on the server;
4
+ * the repo's src/__tests__/sdk/order-sheet-contract.test.ts pins these to it at
5
+ * compile time so they cannot drift. Everything the SDK derives (camelCase
6
+ * `VenueOption`, `Quote`, `Issue`) lives in ./types.ts.
7
+ */
8
+ import type { IssueCode, IssueFix } from './generated/contract.js';
9
+ export type { IssueCode, IssueFix };
10
+ export type MoneyMode = 'paper' | 'real';
11
+ export type OrderType = 'market' | 'limit';
12
+ export type StakeUnit = 'amount' | 'shares';
13
+ export type PriceFormat = 'decimal_probability' | 'american' | 'cents';
14
+ export type ZeroFillMarketStatus = 'failed' | 'pending' | 'resting';
15
+ export type FeeDirection = 'on_top' | 'from_payout';
16
+ export type Environment = 'live' | 'test';
17
+ export type IssueSeverity = 'block' | 'warn' | 'info';
18
+ export type IssueScope = 'account' | 'venue' | 'leg' | 'request';
19
+ export interface SuccessEnvelope<T> {
20
+ data: T;
21
+ meta?: {
22
+ timestamp: string;
23
+ api_version: 'v1';
24
+ };
25
+ pagination?: {
26
+ next_cursor: string | null;
27
+ has_more: boolean;
28
+ limit: number;
29
+ };
30
+ }
31
+ export interface ErrorEnvelope {
32
+ error: {
33
+ code: string;
34
+ message: string;
35
+ details?: Record<string, unknown>;
36
+ };
37
+ }
38
+ /** One reason, as the server authors it (constraints reasons, preflight warnings, buy/preflight rejections). */
39
+ export interface OrderIssue {
40
+ code: IssueCode;
41
+ severity: IssueSeverity;
42
+ message: string;
43
+ detail: string | null;
44
+ fix: IssueFix;
45
+ scope: IssueScope;
46
+ }
47
+ export interface OrderEligibility {
48
+ ok: boolean;
49
+ issues: OrderIssue[];
50
+ }
51
+ export interface VenueSizeConstraints {
52
+ min_usd: number;
53
+ max_usd: number | null;
54
+ increment_usd: number | null;
55
+ whole_contracts: boolean;
56
+ min_contracts: number;
57
+ full_fill_bypasses_min: boolean;
58
+ }
59
+ export interface VenuePriceConstraints {
60
+ submitted: boolean;
61
+ format: PriceFormat;
62
+ /** Probability tick; null = the server snaps (non-linear ladder) and the client must not. */
63
+ tick: number | null;
64
+ min: number;
65
+ max: number;
66
+ native: {
67
+ tick: number;
68
+ min: number | null;
69
+ max: number | null;
70
+ };
71
+ }
72
+ export interface VenueFeeConstraints {
73
+ direction: FeeDirection | null;
74
+ sample: {
75
+ stake_usd: number;
76
+ price: number;
77
+ taker_fee: number;
78
+ maker_fee: number;
79
+ taker_price: number;
80
+ maker_price: number;
81
+ } | null;
82
+ }
83
+ export interface VenueAccountState {
84
+ connected: boolean;
85
+ status: 'active' | 'inactive' | null;
86
+ credential_status: 'pending' | 'failed' | 'connected' | null;
87
+ currency: string | null;
88
+ balance: number | null;
89
+ expected_balance: number | null;
90
+ pending: number | null;
91
+ is_stale: boolean;
92
+ balance_version: number | null;
93
+ scope_trade_execute: boolean;
94
+ }
95
+ export interface VenueConstraints {
96
+ partner_id: string;
97
+ name: string;
98
+ logo_url: string | null;
99
+ orders_allowed: boolean;
100
+ connectable: boolean;
101
+ cancel_supported: boolean;
102
+ order_types: OrderType[];
103
+ fill_semantics: {
104
+ zero_fill_market: ZeroFillMarketStatus;
105
+ };
106
+ account: VenueAccountState;
107
+ eligibility: {
108
+ paper: OrderEligibility;
109
+ real: OrderEligibility;
110
+ };
111
+ size: VenueSizeConstraints;
112
+ price: VenuePriceConstraints;
113
+ fees: VenueFeeConstraints;
114
+ }
115
+ export interface AccountConstraints {
116
+ router_account_id: string;
117
+ environment: Environment;
118
+ is_fiduciary: boolean;
119
+ can_execute: boolean;
120
+ can_practice: boolean;
121
+ money_modes: MoneyMode[];
122
+ issues: OrderIssue[];
123
+ practice_wallet: {
124
+ partner_id: string | null;
125
+ currency: string;
126
+ balance: number | null;
127
+ };
128
+ policy: {
129
+ practice_only: boolean;
130
+ max_stake_per_order: number | null;
131
+ venue_allowlist: string[] | null;
132
+ };
133
+ }
134
+ export interface OrderConstraints {
135
+ constraints_version: string;
136
+ account: AccountConstraints;
137
+ venues: VenueConstraints[];
138
+ }
139
+ export interface Me {
140
+ auth_method: 'api_key' | 'jwt';
141
+ router_account_id: string | null;
142
+ can_execute: boolean;
143
+ can_practice: boolean;
144
+ environment: Environment | null;
145
+ money_modes: MoneyMode[];
146
+ entitlements: string[];
147
+ }
148
+ export interface FeePacket {
149
+ taker_price: number;
150
+ maker_price: number;
151
+ /** Absolute fee on a canonical $100 stake. */
152
+ taker_fee: number;
153
+ maker_fee: number;
154
+ }
155
+ export interface PartnerLiquidity {
156
+ partner_id: string;
157
+ partner_name?: string;
158
+ /** Probability 0–1, before fees. 0 when not actionable. */
159
+ price: number;
160
+ american_odds: string | null;
161
+ /** USD buyable at `price`. */
162
+ available: number;
163
+ actionable: boolean;
164
+ /** Model edges keyed by distribution (always present upstream); the sheet does not read them. */
165
+ edges: Record<string, number>;
166
+ fee_packet?: FeePacket;
167
+ liquidity_hash?: string;
168
+ buy_id?: string;
169
+ }
170
+ export interface Position {
171
+ position_hash: string;
172
+ contest_id: string;
173
+ title: string;
174
+ market_key?: string;
175
+ market_label?: string;
176
+ variable?: number;
177
+ side_key?: string;
178
+ participant_id?: string;
179
+ participant_name?: string;
180
+ participant_image_url?: string | null;
181
+ consensus_price?: number;
182
+ partner_liquidities: PartnerLiquidity[];
183
+ paper_bettable: boolean;
184
+ }
185
+ export interface BuyLeg {
186
+ position_hash?: string;
187
+ liquidity_hash?: string;
188
+ amount?: number;
189
+ shares?: number;
190
+ max_price: number;
191
+ partner_id?: string;
192
+ /** The SDK ALWAYS sends it. The API's own default is 'real'. */
193
+ mode: MoneyMode;
194
+ order_type?: OrderType;
195
+ }
196
+ export interface BuyRequest {
197
+ orders: BuyLeg[];
198
+ verify_liquidity?: boolean;
199
+ on_leg_failure?: 'continue' | 'halt';
200
+ check_all_first?: boolean;
201
+ placement?: 'sequential' | 'parallel';
202
+ opportunity_id?: string;
203
+ model_id?: string;
204
+ }
205
+ export interface BuyLegVenue {
206
+ partner_id: string;
207
+ success: boolean;
208
+ router_order_id: string | null;
209
+ error: string | null;
210
+ }
211
+ export type BuyLegStatus = 'completed' | 'resting' | 'pending' | 'failed' | 'rejected';
212
+ export interface BuyLegResult {
213
+ index: number;
214
+ status: BuyLegStatus;
215
+ sor_decision_id: string | null;
216
+ requested_partner_id: string | null;
217
+ filled_notional: number;
218
+ filled_shares: number;
219
+ unfilled_notional: number;
220
+ avg_price: number | null;
221
+ rejected_reason: string | null;
222
+ rejected_code: IssueCode | null;
223
+ message_user: string | null;
224
+ fix: IssueFix | null;
225
+ venues: BuyLegVenue[];
226
+ }
227
+ export interface BuyResponse {
228
+ results: BuyLegResult[];
229
+ halted_at_index: number | null;
230
+ opportunity_id: string | null;
231
+ model_id: string | null;
232
+ }
233
+ export interface PreflightVenue {
234
+ partner_id: string;
235
+ expected_price: number;
236
+ allocated_amount: number;
237
+ fee_packet: FeePacket | null;
238
+ verified: boolean;
239
+ live_available: number | null;
240
+ live_price: number | null;
241
+ }
242
+ export interface PreflightLegResult {
243
+ index: number;
244
+ requested_partner_id: string | null;
245
+ accepted: boolean;
246
+ rejected_reason: string | null;
247
+ rejected_code: IssueCode | null;
248
+ message_user: string | null;
249
+ fix: IssueFix | null;
250
+ warnings: OrderIssue[];
251
+ normalized: {
252
+ max_price: number;
253
+ amount: number;
254
+ contracts: number;
255
+ price_basis: number;
256
+ };
257
+ would_rest: boolean;
258
+ expected_fill_price: number;
259
+ total_allocated: number;
260
+ unfilled_amount: number;
261
+ total_taker_fee: number;
262
+ total_maker_fee: number;
263
+ total_cost_taker: number;
264
+ venues: PreflightVenue[];
265
+ }
266
+ export interface PreflightResponse {
267
+ results: PreflightLegResult[];
268
+ halted_at_index: number | null;
269
+ }
270
+ export interface RestingOrder {
271
+ router_order_id: string;
272
+ title: string;
273
+ partner_id: string;
274
+ partner_name: string;
275
+ amount: number;
276
+ price: number;
277
+ fill_status: 'unfilled' | 'partially_filled' | 'filled';
278
+ filled_amt: number;
279
+ unfilled_amt: number;
280
+ placed_at: string;
281
+ seconds_since_placed: number;
282
+ }
283
+ export interface RestingOrdersResponse {
284
+ orders: RestingOrder[];
285
+ count: number;
286
+ }
287
+ export interface CancelRequest {
288
+ router_order_ids: string[];
289
+ }
290
+ export interface CancelResponse {
291
+ message: string;
292
+ /** The cancelled orders (full order rows upstream; the sheet reads the id). */
293
+ cancelled: Array<{
294
+ router_order_id: string;
295
+ }>;
296
+ skipped: {
297
+ router_order_id: string;
298
+ reason: string;
299
+ }[];
300
+ errors: {
301
+ router_order_id: string;
302
+ error: string;
303
+ }[];
304
+ }
305
+ /** The fields of GET /flow/v1/auth/orders rows the sheet's poll fallback reads. */
306
+ export interface OrderRow {
307
+ router_order_id: string;
308
+ partner_id: string;
309
+ contest_id: string;
310
+ status: string;
311
+ fill_status: 'unfilled' | 'partially_filled' | 'filled' | null;
312
+ filled_amt: number | null;
313
+ unfilled_amt: number | null;
314
+ price: number;
315
+ amount: number;
316
+ result?: 'win' | 'lose' | 'push' | null;
317
+ net_winnings?: number | null;
318
+ winnings?: number | null;
319
+ [k: string]: unknown;
320
+ }
321
+ export interface StreamConnected {
322
+ type: 'connected';
323
+ organization_id: string;
324
+ api_key_id: string;
325
+ server_time: string;
326
+ }
327
+ export interface StreamSubscribed {
328
+ type: 'subscribed';
329
+ channel: string;
330
+ contest_ids: string[];
331
+ account_ids?: string[];
332
+ all?: boolean;
333
+ }
334
+ export interface StreamOrderUpdate {
335
+ type: 'order.update';
336
+ router_order_id: string;
337
+ partner_id: string;
338
+ router_contest_id: string | null;
339
+ status: string;
340
+ fill_status: string;
341
+ filled_amt: number;
342
+ unfilled_amt: number;
343
+ avg_price: number | null;
344
+ timestamp: string;
345
+ }
346
+ export interface StreamOrderSettled {
347
+ type: 'order.settled';
348
+ router_order_id: string;
349
+ partner_id: string;
350
+ router_contest_id: string | null;
351
+ result: 'win' | 'lose' | 'push';
352
+ winnings: number;
353
+ net_winnings: number;
354
+ timestamp: string;
355
+ }
356
+ export interface StreamBalanceUpdate {
357
+ type: 'balance.update';
358
+ account_partner_id: string;
359
+ partner_id: string;
360
+ currency: string;
361
+ balance: number;
362
+ venue_balance?: number;
363
+ pending: number;
364
+ balance_version: number;
365
+ balance_as_of: string | null;
366
+ cause?: string;
367
+ router_order_id: string | null;
368
+ timestamp: string;
369
+ }
370
+ export interface StreamError {
371
+ type: 'error';
372
+ code: string;
373
+ message: string;
374
+ }
375
+ export interface StreamPong {
376
+ type: 'pong';
377
+ server_time: string;
378
+ }
379
+ export type StreamServerMessage = StreamConnected | StreamSubscribed | StreamOrderUpdate | StreamOrderSettled | StreamBalanceUpdate | StreamError | StreamPong | {
380
+ type: string;
381
+ [k: string]: unknown;
382
+ };
package/dist/wire.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../src/wire.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@openmarketsai/order-sheet",
3
+ "version": "0.1.0",
4
+ "description": "The bet slip, solved: every venue's rules, fees and balances checked before the tap \u2014 headless core, React hooks, and a themeable styled sheet for apps built on the OpenMarkets API.",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "sideEffects": [
8
+ "./dist/ui/styles.css"
9
+ ],
10
+ "files": [
11
+ "dist",
12
+ "README.md",
13
+ "LICENSE",
14
+ "NOTICE"
15
+ ],
16
+ "main": "./dist/index.cjs",
17
+ "module": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js",
23
+ "require": "./dist/index.cjs"
24
+ },
25
+ "./react": {
26
+ "types": "./dist/react.d.ts",
27
+ "import": "./dist/react.js",
28
+ "require": "./dist/react.cjs"
29
+ },
30
+ "./ui": {
31
+ "types": "./dist/ui.d.ts",
32
+ "import": "./dist/ui.js",
33
+ "require": "./dist/ui.cjs"
34
+ },
35
+ "./ui/styles.css": "./dist/ui/styles.css"
36
+ },
37
+ "scripts": {
38
+ "build": "node ./scripts/build.mjs",
39
+ "test": "vitest run",
40
+ "type-check": "tsc --noEmit",
41
+ "prepublishOnly": "npm run type-check && npm run test && npm run build",
42
+ "example": "esbuild example/demo.tsx --bundle --jsx=automatic --outfile=example/dist/demo.js --servedir=example --serve=8000"
43
+ },
44
+ "keywords": [
45
+ "openmarkets",
46
+ "bet-slip",
47
+ "order-sheet",
48
+ "prediction-markets",
49
+ "sports-betting",
50
+ "sdk",
51
+ "react"
52
+ ],
53
+ "peerDependencies": {
54
+ "react": ">=18"
55
+ },
56
+ "peerDependenciesMeta": {
57
+ "react": {
58
+ "optional": true
59
+ }
60
+ },
61
+ "devDependencies": {
62
+ "@types/react": "^19",
63
+ "esbuild": "^0.27",
64
+ "react": "^19",
65
+ "react-dom": "^19",
66
+ "typescript": "^5",
67
+ "vitest": "^4"
68
+ },
69
+ "publishConfig": {
70
+ "access": "public"
71
+ },
72
+ "homepage": "https://app.openmarkets.ai/developers",
73
+ "bugs": {
74
+ "url": "https://app.openmarkets.ai/developers",
75
+ "email": "james@openmarkets.ai"
76
+ },
77
+ "author": "OpenMarkets"
78
+ }