pmxtjs 2.35.8 → 2.35.10

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 (53) hide show
  1. package/dist/esm/generated/src/apis/DefaultApi.d.ts +196 -13
  2. package/dist/esm/generated/src/apis/DefaultApi.js +292 -13
  3. package/dist/esm/generated/src/models/FetchEventMatchesParams.d.ts +13 -1
  4. package/dist/esm/generated/src/models/FetchEventMatchesParams.js +4 -0
  5. package/dist/esm/generated/src/models/FetchMarketMatchesParams.d.ts +34 -1
  6. package/dist/esm/generated/src/models/FetchMarketMatchesParams.js +16 -0
  7. package/dist/esm/generated/src/models/FetchMatchedMarkets200Response.d.ts +46 -0
  8. package/dist/esm/generated/src/models/FetchMatchedMarkets200Response.js +47 -0
  9. package/dist/esm/generated/src/models/FetchMatchedMarketsParams.d.ts +61 -0
  10. package/dist/esm/generated/src/models/FetchMatchedMarketsParams.js +57 -0
  11. package/dist/esm/generated/src/models/MatchResult.d.ts +6 -0
  12. package/dist/esm/generated/src/models/MatchResult.js +2 -0
  13. package/dist/esm/generated/src/models/MatchedMarketPair.d.ts +98 -0
  14. package/dist/esm/generated/src/models/MatchedMarketPair.js +84 -0
  15. package/dist/esm/generated/src/models/index.d.ts +3 -0
  16. package/dist/esm/generated/src/models/index.js +3 -0
  17. package/dist/esm/pmxt/client.js +20 -0
  18. package/dist/generated/src/apis/DefaultApi.d.ts +196 -13
  19. package/dist/generated/src/apis/DefaultApi.js +293 -14
  20. package/dist/generated/src/models/FetchEventMatchesParams.d.ts +13 -1
  21. package/dist/generated/src/models/FetchEventMatchesParams.js +4 -0
  22. package/dist/generated/src/models/FetchMarketMatchesParams.d.ts +34 -1
  23. package/dist/generated/src/models/FetchMarketMatchesParams.js +17 -1
  24. package/dist/generated/src/models/FetchMatchedMarkets200Response.d.ts +46 -0
  25. package/dist/generated/src/models/FetchMatchedMarkets200Response.js +54 -0
  26. package/dist/generated/src/models/FetchMatchedMarketsParams.d.ts +61 -0
  27. package/dist/generated/src/models/FetchMatchedMarketsParams.js +65 -0
  28. package/dist/generated/src/models/MatchResult.d.ts +6 -0
  29. package/dist/generated/src/models/MatchResult.js +2 -0
  30. package/dist/generated/src/models/MatchedMarketPair.d.ts +98 -0
  31. package/dist/generated/src/models/MatchedMarketPair.js +92 -0
  32. package/dist/generated/src/models/index.d.ts +3 -0
  33. package/dist/generated/src/models/index.js +3 -0
  34. package/dist/pmxt/client.js +20 -0
  35. package/generated/.openapi-generator/FILES +6 -0
  36. package/generated/docs/DefaultApi.md +307 -21
  37. package/generated/docs/FetchEventMatchesParams.md +4 -0
  38. package/generated/docs/FetchMarketMatchesParams.md +8 -0
  39. package/generated/docs/FetchMatchedMarkets200Response.md +38 -0
  40. package/generated/docs/FetchMatchedMarketsParams.md +40 -0
  41. package/generated/docs/MatchResult.md +2 -0
  42. package/generated/docs/MatchedMarketPair.md +52 -0
  43. package/generated/package.json +1 -1
  44. package/generated/src/apis/DefaultApi.ts +408 -12
  45. package/generated/src/models/FetchEventMatchesParams.ts +17 -1
  46. package/generated/src/models/FetchMarketMatchesParams.ts +43 -1
  47. package/generated/src/models/FetchMatchedMarkets200Response.ts +96 -0
  48. package/generated/src/models/FetchMatchedMarketsParams.ts +103 -0
  49. package/generated/src/models/MatchResult.ts +8 -0
  50. package/generated/src/models/MatchedMarketPair.ts +166 -0
  51. package/generated/src/models/index.ts +3 -0
  52. package/package.json +2 -2
  53. package/pmxt/client.ts +28 -0
@@ -0,0 +1,47 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ /**
4
+ * PMXT Sidecar API
5
+ * A unified local sidecar API for prediction markets (Polymarket, Kalshi, Limitless). This API acts as a JSON-RPC-style gateway. Each endpoint corresponds to a specific method on the generic exchange implementation.
6
+ *
7
+ * The version of the OpenAPI document: 0.4.4
8
+ *
9
+ *
10
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
11
+ * https://openapi-generator.tech
12
+ * Do not edit the class manually.
13
+ */
14
+ import { ErrorDetailFromJSON, ErrorDetailToJSON, } from './ErrorDetail.js';
15
+ import { MatchedMarketPairFromJSON, MatchedMarketPairToJSON, } from './MatchedMarketPair.js';
16
+ /**
17
+ * Check if a given object implements the FetchMatchedMarkets200Response interface.
18
+ */
19
+ export function instanceOfFetchMatchedMarkets200Response(value) {
20
+ return true;
21
+ }
22
+ export function FetchMatchedMarkets200ResponseFromJSON(json) {
23
+ return FetchMatchedMarkets200ResponseFromJSONTyped(json, false);
24
+ }
25
+ export function FetchMatchedMarkets200ResponseFromJSONTyped(json, ignoreDiscriminator) {
26
+ if (json == null) {
27
+ return json;
28
+ }
29
+ return {
30
+ 'success': json['success'] == null ? undefined : json['success'],
31
+ 'error': json['error'] == null ? undefined : ErrorDetailFromJSON(json['error']),
32
+ 'data': json['data'] == null ? undefined : (json['data'].map(MatchedMarketPairFromJSON)),
33
+ };
34
+ }
35
+ export function FetchMatchedMarkets200ResponseToJSON(json) {
36
+ return FetchMatchedMarkets200ResponseToJSONTyped(json, false);
37
+ }
38
+ export function FetchMatchedMarkets200ResponseToJSONTyped(value, ignoreDiscriminator = false) {
39
+ if (value == null) {
40
+ return value;
41
+ }
42
+ return {
43
+ 'success': value['success'],
44
+ 'error': ErrorDetailToJSON(value['error']),
45
+ 'data': value['data'] == null ? undefined : (value['data'].map(MatchedMarketPairToJSON)),
46
+ };
47
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * PMXT Sidecar API
3
+ * A unified local sidecar API for prediction markets (Polymarket, Kalshi, Limitless). This API acts as a JSON-RPC-style gateway. Each endpoint corresponds to a specific method on the generic exchange implementation.
4
+ *
5
+ * The version of the OpenAPI document: 0.4.4
6
+ *
7
+ *
8
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
9
+ * https://openapi-generator.tech
10
+ * Do not edit the class manually.
11
+ */
12
+ /**
13
+ *
14
+ * @export
15
+ * @interface FetchMatchedMarketsParams
16
+ */
17
+ export interface FetchMatchedMarketsParams {
18
+ /**
19
+ *
20
+ * @type {number}
21
+ * @memberof FetchMatchedMarketsParams
22
+ */
23
+ minDifference?: number;
24
+ /**
25
+ *
26
+ * @type {string}
27
+ * @memberof FetchMatchedMarketsParams
28
+ */
29
+ category?: string;
30
+ /**
31
+ *
32
+ * @type {number}
33
+ * @memberof FetchMatchedMarketsParams
34
+ */
35
+ limit?: number;
36
+ /**
37
+ * Comma-separated relation types to include (default: 'identity').
38
+ * @type {Array<string>}
39
+ * @memberof FetchMatchedMarketsParams
40
+ */
41
+ relations?: Array<FetchMatchedMarketsParamsRelationsEnum>;
42
+ }
43
+ /**
44
+ * @export
45
+ */
46
+ export declare const FetchMatchedMarketsParamsRelationsEnum: {
47
+ readonly Identity: "identity";
48
+ readonly Subset: "subset";
49
+ readonly Superset: "superset";
50
+ readonly Overlap: "overlap";
51
+ readonly Disjoint: "disjoint";
52
+ };
53
+ export type FetchMatchedMarketsParamsRelationsEnum = typeof FetchMatchedMarketsParamsRelationsEnum[keyof typeof FetchMatchedMarketsParamsRelationsEnum];
54
+ /**
55
+ * Check if a given object implements the FetchMatchedMarketsParams interface.
56
+ */
57
+ export declare function instanceOfFetchMatchedMarketsParams(value: object): value is FetchMatchedMarketsParams;
58
+ export declare function FetchMatchedMarketsParamsFromJSON(json: any): FetchMatchedMarketsParams;
59
+ export declare function FetchMatchedMarketsParamsFromJSONTyped(json: any, ignoreDiscriminator: boolean): FetchMatchedMarketsParams;
60
+ export declare function FetchMatchedMarketsParamsToJSON(json: any): FetchMatchedMarketsParams;
61
+ export declare function FetchMatchedMarketsParamsToJSONTyped(value?: FetchMatchedMarketsParams | null, ignoreDiscriminator?: boolean): any;
@@ -0,0 +1,57 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ /**
4
+ * PMXT Sidecar API
5
+ * A unified local sidecar API for prediction markets (Polymarket, Kalshi, Limitless). This API acts as a JSON-RPC-style gateway. Each endpoint corresponds to a specific method on the generic exchange implementation.
6
+ *
7
+ * The version of the OpenAPI document: 0.4.4
8
+ *
9
+ *
10
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
11
+ * https://openapi-generator.tech
12
+ * Do not edit the class manually.
13
+ */
14
+ /**
15
+ * @export
16
+ */
17
+ export const FetchMatchedMarketsParamsRelationsEnum = {
18
+ Identity: 'identity',
19
+ Subset: 'subset',
20
+ Superset: 'superset',
21
+ Overlap: 'overlap',
22
+ Disjoint: 'disjoint'
23
+ };
24
+ /**
25
+ * Check if a given object implements the FetchMatchedMarketsParams interface.
26
+ */
27
+ export function instanceOfFetchMatchedMarketsParams(value) {
28
+ return true;
29
+ }
30
+ export function FetchMatchedMarketsParamsFromJSON(json) {
31
+ return FetchMatchedMarketsParamsFromJSONTyped(json, false);
32
+ }
33
+ export function FetchMatchedMarketsParamsFromJSONTyped(json, ignoreDiscriminator) {
34
+ if (json == null) {
35
+ return json;
36
+ }
37
+ return {
38
+ 'minDifference': json['minDifference'] == null ? undefined : json['minDifference'],
39
+ 'category': json['category'] == null ? undefined : json['category'],
40
+ 'limit': json['limit'] == null ? undefined : json['limit'],
41
+ 'relations': json['relations'] == null ? undefined : json['relations'],
42
+ };
43
+ }
44
+ export function FetchMatchedMarketsParamsToJSON(json) {
45
+ return FetchMatchedMarketsParamsToJSONTyped(json, false);
46
+ }
47
+ export function FetchMatchedMarketsParamsToJSONTyped(value, ignoreDiscriminator = false) {
48
+ if (value == null) {
49
+ return value;
50
+ }
51
+ return {
52
+ 'minDifference': value['minDifference'],
53
+ 'category': value['category'],
54
+ 'limit': value['limit'],
55
+ 'relations': value['relations'],
56
+ };
57
+ }
@@ -22,6 +22,12 @@ export interface MatchResult {
22
22
  * @memberof MatchResult
23
23
  */
24
24
  market: UnifiedMarket;
25
+ /**
26
+ * The source market this was matched against. Present in browse mode (no marketId), absent in lookup mode.
27
+ * @type {UnifiedMarket}
28
+ * @memberof MatchResult
29
+ */
30
+ sourceMarket?: UnifiedMarket;
25
31
  /**
26
32
  *
27
33
  * @type {string}
@@ -49,6 +49,7 @@ export function MatchResultFromJSONTyped(json, ignoreDiscriminator) {
49
49
  }
50
50
  return {
51
51
  'market': UnifiedMarketFromJSON(json['market']),
52
+ 'sourceMarket': json['sourceMarket'] == null ? undefined : UnifiedMarketFromJSON(json['sourceMarket']),
52
53
  'relation': json['relation'],
53
54
  'confidence': json['confidence'],
54
55
  'reasoning': json['reasoning'],
@@ -65,6 +66,7 @@ export function MatchResultToJSONTyped(value, ignoreDiscriminator = false) {
65
66
  }
66
67
  return {
67
68
  'market': UnifiedMarketToJSON(value['market']),
69
+ 'sourceMarket': UnifiedMarketToJSON(value['sourceMarket']),
68
70
  'relation': value['relation'],
69
71
  'confidence': value['confidence'],
70
72
  'reasoning': value['reasoning'],
@@ -0,0 +1,98 @@
1
+ /**
2
+ * PMXT Sidecar API
3
+ * A unified local sidecar API for prediction markets (Polymarket, Kalshi, Limitless). This API acts as a JSON-RPC-style gateway. Each endpoint corresponds to a specific method on the generic exchange implementation.
4
+ *
5
+ * The version of the OpenAPI document: 0.4.4
6
+ *
7
+ *
8
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
9
+ * https://openapi-generator.tech
10
+ * Do not edit the class manually.
11
+ */
12
+ import type { UnifiedMarket } from './UnifiedMarket.js';
13
+ /**
14
+ *
15
+ * @export
16
+ * @interface MatchedMarketPair
17
+ */
18
+ export interface MatchedMarketPair {
19
+ /**
20
+ *
21
+ * @type {UnifiedMarket}
22
+ * @memberof MatchedMarketPair
23
+ */
24
+ marketA: UnifiedMarket;
25
+ /**
26
+ *
27
+ * @type {UnifiedMarket}
28
+ * @memberof MatchedMarketPair
29
+ */
30
+ marketB: UnifiedMarket;
31
+ /**
32
+ *
33
+ * @type {number}
34
+ * @memberof MatchedMarketPair
35
+ */
36
+ priceDifference: number;
37
+ /**
38
+ *
39
+ * @type {string}
40
+ * @memberof MatchedMarketPair
41
+ */
42
+ venueA: string;
43
+ /**
44
+ *
45
+ * @type {string}
46
+ * @memberof MatchedMarketPair
47
+ */
48
+ venueB: string;
49
+ /**
50
+ *
51
+ * @type {number}
52
+ * @memberof MatchedMarketPair
53
+ */
54
+ priceA: number;
55
+ /**
56
+ *
57
+ * @type {number}
58
+ * @memberof MatchedMarketPair
59
+ */
60
+ priceB: number;
61
+ /**
62
+ * The set-theoretic relation between the two markets (e.g. identity, subset).
63
+ * @type {string}
64
+ * @memberof MatchedMarketPair
65
+ */
66
+ relation?: MatchedMarketPairRelationEnum;
67
+ /**
68
+ * Match confidence score (0.0 to 1.0).
69
+ * @type {number}
70
+ * @memberof MatchedMarketPair
71
+ */
72
+ confidence?: number;
73
+ /**
74
+ *
75
+ * @type {string}
76
+ * @memberof MatchedMarketPair
77
+ */
78
+ reasoning?: string | null;
79
+ }
80
+ /**
81
+ * @export
82
+ */
83
+ export declare const MatchedMarketPairRelationEnum: {
84
+ readonly Identity: "identity";
85
+ readonly Subset: "subset";
86
+ readonly Superset: "superset";
87
+ readonly Overlap: "overlap";
88
+ readonly Disjoint: "disjoint";
89
+ };
90
+ export type MatchedMarketPairRelationEnum = typeof MatchedMarketPairRelationEnum[keyof typeof MatchedMarketPairRelationEnum];
91
+ /**
92
+ * Check if a given object implements the MatchedMarketPair interface.
93
+ */
94
+ export declare function instanceOfMatchedMarketPair(value: object): value is MatchedMarketPair;
95
+ export declare function MatchedMarketPairFromJSON(json: any): MatchedMarketPair;
96
+ export declare function MatchedMarketPairFromJSONTyped(json: any, ignoreDiscriminator: boolean): MatchedMarketPair;
97
+ export declare function MatchedMarketPairToJSON(json: any): MatchedMarketPair;
98
+ export declare function MatchedMarketPairToJSONTyped(value?: MatchedMarketPair | null, ignoreDiscriminator?: boolean): any;
@@ -0,0 +1,84 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ /**
4
+ * PMXT Sidecar API
5
+ * A unified local sidecar API for prediction markets (Polymarket, Kalshi, Limitless). This API acts as a JSON-RPC-style gateway. Each endpoint corresponds to a specific method on the generic exchange implementation.
6
+ *
7
+ * The version of the OpenAPI document: 0.4.4
8
+ *
9
+ *
10
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
11
+ * https://openapi-generator.tech
12
+ * Do not edit the class manually.
13
+ */
14
+ import { UnifiedMarketFromJSON, UnifiedMarketToJSON, } from './UnifiedMarket.js';
15
+ /**
16
+ * @export
17
+ */
18
+ export const MatchedMarketPairRelationEnum = {
19
+ Identity: 'identity',
20
+ Subset: 'subset',
21
+ Superset: 'superset',
22
+ Overlap: 'overlap',
23
+ Disjoint: 'disjoint'
24
+ };
25
+ /**
26
+ * Check if a given object implements the MatchedMarketPair interface.
27
+ */
28
+ export function instanceOfMatchedMarketPair(value) {
29
+ if (!('marketA' in value) || value['marketA'] === undefined)
30
+ return false;
31
+ if (!('marketB' in value) || value['marketB'] === undefined)
32
+ return false;
33
+ if (!('priceDifference' in value) || value['priceDifference'] === undefined)
34
+ return false;
35
+ if (!('venueA' in value) || value['venueA'] === undefined)
36
+ return false;
37
+ if (!('venueB' in value) || value['venueB'] === undefined)
38
+ return false;
39
+ if (!('priceA' in value) || value['priceA'] === undefined)
40
+ return false;
41
+ if (!('priceB' in value) || value['priceB'] === undefined)
42
+ return false;
43
+ return true;
44
+ }
45
+ export function MatchedMarketPairFromJSON(json) {
46
+ return MatchedMarketPairFromJSONTyped(json, false);
47
+ }
48
+ export function MatchedMarketPairFromJSONTyped(json, ignoreDiscriminator) {
49
+ if (json == null) {
50
+ return json;
51
+ }
52
+ return {
53
+ 'marketA': UnifiedMarketFromJSON(json['marketA']),
54
+ 'marketB': UnifiedMarketFromJSON(json['marketB']),
55
+ 'priceDifference': json['priceDifference'],
56
+ 'venueA': json['venueA'],
57
+ 'venueB': json['venueB'],
58
+ 'priceA': json['priceA'],
59
+ 'priceB': json['priceB'],
60
+ 'relation': json['relation'] == null ? undefined : json['relation'],
61
+ 'confidence': json['confidence'] == null ? undefined : json['confidence'],
62
+ 'reasoning': json['reasoning'] == null ? undefined : json['reasoning'],
63
+ };
64
+ }
65
+ export function MatchedMarketPairToJSON(json) {
66
+ return MatchedMarketPairToJSONTyped(json, false);
67
+ }
68
+ export function MatchedMarketPairToJSONTyped(value, ignoreDiscriminator = false) {
69
+ if (value == null) {
70
+ return value;
71
+ }
72
+ return {
73
+ 'marketA': UnifiedMarketToJSON(value['marketA']),
74
+ 'marketB': UnifiedMarketToJSON(value['marketB']),
75
+ 'priceDifference': value['priceDifference'],
76
+ 'venueA': value['venueA'],
77
+ 'venueB': value['venueB'],
78
+ 'priceA': value['priceA'],
79
+ 'priceB': value['priceB'],
80
+ 'relation': value['relation'],
81
+ 'confidence': value['confidence'],
82
+ 'reasoning': value['reasoning'],
83
+ };
84
+ }
@@ -35,6 +35,8 @@ export * from './FetchMarketMatches200Response.js';
35
35
  export * from './FetchMarketMatchesParams.js';
36
36
  export * from './FetchMarkets200Response.js';
37
37
  export * from './FetchMarketsPaginated200Response.js';
38
+ export * from './FetchMatchedMarkets200Response.js';
39
+ export * from './FetchMatchedMarketsParams.js';
38
40
  export * from './FetchMyTrades200Response.js';
39
41
  export * from './FetchOHLCV200Response.js';
40
42
  export * from './FetchOpenOrders200Response.js';
@@ -64,6 +66,7 @@ export * from './MarketFilterCriteriaVolume24h.js';
64
66
  export * from './MarketFilterParams.js';
65
67
  export * from './MarketOutcome.js';
66
68
  export * from './MatchResult.js';
69
+ export * from './MatchedMarketPair.js';
67
70
  export * from './MyTradesParams.js';
68
71
  export * from './OHLCVParams.js';
69
72
  export * from './Order.js';
@@ -37,6 +37,8 @@ export * from './FetchMarketMatches200Response.js';
37
37
  export * from './FetchMarketMatchesParams.js';
38
38
  export * from './FetchMarkets200Response.js';
39
39
  export * from './FetchMarketsPaginated200Response.js';
40
+ export * from './FetchMatchedMarkets200Response.js';
41
+ export * from './FetchMatchedMarketsParams.js';
40
42
  export * from './FetchMyTrades200Response.js';
41
43
  export * from './FetchOHLCV200Response.js';
42
44
  export * from './FetchOpenOrders200Response.js';
@@ -66,6 +68,7 @@ export * from './MarketFilterCriteriaVolume24h.js';
66
68
  export * from './MarketFilterParams.js';
67
69
  export * from './MarketOutcome.js';
68
70
  export * from './MatchResult.js';
71
+ export * from './MatchedMarketPair.js';
69
72
  export * from './MyTradesParams.js';
70
73
  export * from './OHLCVParams.js';
71
74
  export * from './Order.js';
@@ -727,6 +727,11 @@ export class Exchange {
727
727
  }
728
728
  }
729
729
  async submitOrder(built) {
730
+ if (this.isHosted) {
731
+ throw new PmxtError("Trade execution is not available through the hosted API. " +
732
+ "Use the local PMXT SDK with your venue credentials instead. " +
733
+ "See https://pmxt.dev/docs/quickstart for setup instructions.");
734
+ }
730
735
  await this.initPromise;
731
736
  try {
732
737
  const args = [];
@@ -754,6 +759,11 @@ export class Exchange {
754
759
  }
755
760
  }
756
761
  async cancelOrder(orderId) {
762
+ if (this.isHosted) {
763
+ throw new PmxtError("Trade execution is not available through the hosted API. " +
764
+ "Use the local PMXT SDK with your venue credentials instead. " +
765
+ "See https://pmxt.dev/docs/quickstart for setup instructions.");
766
+ }
757
767
  await this.initPromise;
758
768
  try {
759
769
  const args = [];
@@ -1480,6 +1490,11 @@ export class Exchange {
1480
1490
  * ```
1481
1491
  */
1482
1492
  async buildOrder(params) {
1493
+ if (this.isHosted) {
1494
+ throw new PmxtError("Trade execution is not available through the hosted API. " +
1495
+ "Use the local PMXT SDK with your venue credentials instead. " +
1496
+ "See https://pmxt.dev/docs/quickstart for setup instructions.");
1497
+ }
1483
1498
  await this.initPromise;
1484
1499
  try {
1485
1500
  let marketId = params.marketId;
@@ -1549,6 +1564,11 @@ export class Exchange {
1549
1564
  * ```
1550
1565
  */
1551
1566
  async createOrder(params) {
1567
+ if (this.isHosted) {
1568
+ throw new PmxtError("Trade execution is not available through the hosted API. " +
1569
+ "Use the local PMXT SDK with your venue credentials instead. " +
1570
+ "See https://pmxt.dev/docs/quickstart for setup instructions.");
1571
+ }
1552
1572
  await this.initPromise;
1553
1573
  try {
1554
1574
  // Resolve outcome shorthand: extract marketId/outcomeId from outcome object