be-components 2.4.8 → 2.5.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 (165) hide show
  1. package/lib/commonjs/Components/Jerseys.js +14 -4
  2. package/lib/commonjs/Components/Jerseys.js.map +1 -1
  3. package/lib/commonjs/LocationTracker/LocationStatus.js +1 -0
  4. package/lib/commonjs/LocationTracker/LocationStatus.js.map +1 -1
  5. package/lib/commonjs/MarketComponents/api/index.js +40 -0
  6. package/lib/commonjs/MarketComponents/api/index.js.map +1 -1
  7. package/lib/commonjs/MarketComponents/components/AthleteTournamentMarket/index.js.map +1 -1
  8. package/lib/commonjs/MarketComponents/components/MatchMarket/index.js +231 -0
  9. package/lib/commonjs/MarketComponents/components/MatchMarket/index.js.map +1 -0
  10. package/lib/commonjs/MarketComponents/components/TeamEventMarket/index.js +91 -3
  11. package/lib/commonjs/MarketComponents/components/TeamEventMarket/index.js.map +1 -1
  12. package/lib/commonjs/MarketComponents/components/TeamTournamentMarket/index.js +202 -0
  13. package/lib/commonjs/MarketComponents/components/TeamTournamentMarket/index.js.map +1 -0
  14. package/lib/commonjs/MarketComponents/components/TournamentMarket/api/index.js +109 -0
  15. package/lib/commonjs/MarketComponents/components/TournamentMarket/api/index.js.map +1 -0
  16. package/lib/commonjs/MarketComponents/components/TournamentMarket/index.js +380 -0
  17. package/lib/commonjs/MarketComponents/components/TournamentMarket/index.js.map +1 -0
  18. package/lib/commonjs/MarketComponents/index.js +3 -1
  19. package/lib/commonjs/MarketComponents/index.js.map +1 -1
  20. package/lib/commonjs/MarketMaker/api/index.js +1146 -8
  21. package/lib/commonjs/MarketMaker/api/index.js.map +1 -1
  22. package/lib/commonjs/MarketMaker/components/Contest.js +169 -23
  23. package/lib/commonjs/MarketMaker/components/Contest.js.map +1 -1
  24. package/lib/commonjs/MarketMaker/components/ContestMarkets.js +662 -4
  25. package/lib/commonjs/MarketMaker/components/ContestMarkets.js.map +1 -1
  26. package/lib/commonjs/MarketMaker/components/Dashboard.js +77 -12
  27. package/lib/commonjs/MarketMaker/components/Dashboard.js.map +1 -1
  28. package/lib/commonjs/MarketMaker/components/FundActions.js +232 -0
  29. package/lib/commonjs/MarketMaker/components/FundActions.js.map +1 -0
  30. package/lib/commonjs/MarketMaker/components/FundOwnershipList.js +94 -0
  31. package/lib/commonjs/MarketMaker/components/FundOwnershipList.js.map +1 -0
  32. package/lib/commonjs/MarketMaker/components/FundSelector.js +99 -0
  33. package/lib/commonjs/MarketMaker/components/FundSelector.js.map +1 -0
  34. package/lib/commonjs/MarketMaker/components/FundingRequestList.js +112 -0
  35. package/lib/commonjs/MarketMaker/components/FundingRequestList.js.map +1 -0
  36. package/lib/commonjs/MarketMaker/components/ManageFundForm.js +122 -0
  37. package/lib/commonjs/MarketMaker/components/ManageFundForm.js.map +1 -0
  38. package/lib/commonjs/MarketMaker/components/OrderForm.js +186 -0
  39. package/lib/commonjs/MarketMaker/components/OrderForm.js.map +1 -0
  40. package/lib/commonjs/MarketMaker/components/SetMarketForm.js +449 -0
  41. package/lib/commonjs/MarketMaker/components/SetMarketForm.js.map +1 -0
  42. package/lib/commonjs/MarketMaker/components/WeightProgress.js +51 -0
  43. package/lib/commonjs/MarketMaker/components/WeightProgress.js.map +1 -0
  44. package/lib/commonjs/MarketMaker/index.js +399 -21
  45. package/lib/commonjs/MarketMaker/index.js.map +1 -1
  46. package/lib/commonjs/Socket/index.js +1 -1
  47. package/lib/commonjs/Socket/index.js.map +1 -1
  48. package/lib/module/Components/Jerseys.js +14 -4
  49. package/lib/module/Components/Jerseys.js.map +1 -1
  50. package/lib/module/LocationTracker/LocationStatus.js +1 -0
  51. package/lib/module/LocationTracker/LocationStatus.js.map +1 -1
  52. package/lib/module/MarketComponents/api/index.js +40 -0
  53. package/lib/module/MarketComponents/api/index.js.map +1 -1
  54. package/lib/module/MarketComponents/components/AthleteTournamentMarket/index.js.map +1 -1
  55. package/lib/module/MarketComponents/components/MatchMarket/index.js +222 -0
  56. package/lib/module/MarketComponents/components/MatchMarket/index.js.map +1 -0
  57. package/lib/module/MarketComponents/components/TeamEventMarket/index.js +91 -3
  58. package/lib/module/MarketComponents/components/TeamEventMarket/index.js.map +1 -1
  59. package/lib/module/MarketComponents/components/TeamTournamentMarket/index.js +193 -0
  60. package/lib/module/MarketComponents/components/TeamTournamentMarket/index.js.map +1 -0
  61. package/lib/module/MarketComponents/components/TournamentMarket/api/index.js +103 -0
  62. package/lib/module/MarketComponents/components/TournamentMarket/api/index.js.map +1 -0
  63. package/lib/module/MarketComponents/components/TournamentMarket/index.js +371 -0
  64. package/lib/module/MarketComponents/components/TournamentMarket/index.js.map +1 -0
  65. package/lib/module/MarketComponents/index.js +3 -1
  66. package/lib/module/MarketComponents/index.js.map +1 -1
  67. package/lib/module/MarketMaker/api/index.js +1146 -8
  68. package/lib/module/MarketMaker/api/index.js.map +1 -1
  69. package/lib/module/MarketMaker/components/Contest.js +168 -24
  70. package/lib/module/MarketMaker/components/Contest.js.map +1 -1
  71. package/lib/module/MarketMaker/components/ContestMarkets.js +663 -5
  72. package/lib/module/MarketMaker/components/ContestMarkets.js.map +1 -1
  73. package/lib/module/MarketMaker/components/Dashboard.js +76 -13
  74. package/lib/module/MarketMaker/components/Dashboard.js.map +1 -1
  75. package/lib/module/MarketMaker/components/FundActions.js +223 -0
  76. package/lib/module/MarketMaker/components/FundActions.js.map +1 -0
  77. package/lib/module/MarketMaker/components/FundOwnershipList.js +87 -0
  78. package/lib/module/MarketMaker/components/FundOwnershipList.js.map +1 -0
  79. package/lib/module/MarketMaker/components/FundSelector.js +92 -0
  80. package/lib/module/MarketMaker/components/FundSelector.js.map +1 -0
  81. package/lib/module/MarketMaker/components/FundingRequestList.js +105 -0
  82. package/lib/module/MarketMaker/components/FundingRequestList.js.map +1 -0
  83. package/lib/module/MarketMaker/components/ManageFundForm.js +113 -0
  84. package/lib/module/MarketMaker/components/ManageFundForm.js.map +1 -0
  85. package/lib/module/MarketMaker/components/OrderForm.js +177 -0
  86. package/lib/module/MarketMaker/components/OrderForm.js.map +1 -0
  87. package/lib/module/MarketMaker/components/SetMarketForm.js +441 -0
  88. package/lib/module/MarketMaker/components/SetMarketForm.js.map +1 -0
  89. package/lib/module/MarketMaker/components/WeightProgress.js +42 -0
  90. package/lib/module/MarketMaker/components/WeightProgress.js.map +1 -0
  91. package/lib/module/MarketMaker/index.js +398 -21
  92. package/lib/module/MarketMaker/index.js.map +1 -1
  93. package/lib/module/Socket/index.js +1 -1
  94. package/lib/module/Socket/index.js.map +1 -1
  95. package/lib/typescript/src/Components/Jerseys.d.ts +2 -1
  96. package/lib/typescript/src/Components/Jerseys.d.ts.map +1 -1
  97. package/lib/typescript/src/LocationTracker/LocationStatus.d.ts.map +1 -1
  98. package/lib/typescript/src/MarketComponents/api/index.d.ts +6 -0
  99. package/lib/typescript/src/MarketComponents/api/index.d.ts.map +1 -1
  100. package/lib/typescript/src/MarketComponents/components/AthleteTournamentMarket/index.d.ts.map +1 -1
  101. package/lib/typescript/src/MarketComponents/components/MatchMarket/index.d.ts +33 -0
  102. package/lib/typescript/src/MarketComponents/components/MatchMarket/index.d.ts.map +1 -0
  103. package/lib/typescript/src/MarketComponents/components/TeamEventMarket/index.d.ts +2 -2
  104. package/lib/typescript/src/MarketComponents/components/TeamEventMarket/index.d.ts.map +1 -1
  105. package/lib/typescript/src/MarketComponents/components/TeamTournamentMarket/index.d.ts +29 -0
  106. package/lib/typescript/src/MarketComponents/components/TeamTournamentMarket/index.d.ts.map +1 -0
  107. package/lib/typescript/src/MarketComponents/components/TournamentMarket/api/index.d.ts +13 -0
  108. package/lib/typescript/src/MarketComponents/components/TournamentMarket/api/index.d.ts.map +1 -0
  109. package/lib/typescript/src/MarketComponents/components/TournamentMarket/index.d.ts +27 -0
  110. package/lib/typescript/src/MarketComponents/components/TournamentMarket/index.d.ts.map +1 -0
  111. package/lib/typescript/src/MarketComponents/index.d.ts +24 -2
  112. package/lib/typescript/src/MarketComponents/index.d.ts.map +1 -1
  113. package/lib/typescript/src/MarketMaker/api/index.d.ts +119 -2
  114. package/lib/typescript/src/MarketMaker/api/index.d.ts.map +1 -1
  115. package/lib/typescript/src/MarketMaker/components/Contest.d.ts +14 -2
  116. package/lib/typescript/src/MarketMaker/components/Contest.d.ts.map +1 -1
  117. package/lib/typescript/src/MarketMaker/components/ContestMarkets.d.ts +18 -2
  118. package/lib/typescript/src/MarketMaker/components/ContestMarkets.d.ts.map +1 -1
  119. package/lib/typescript/src/MarketMaker/components/Dashboard.d.ts +13 -2
  120. package/lib/typescript/src/MarketMaker/components/Dashboard.d.ts.map +1 -1
  121. package/lib/typescript/src/MarketMaker/components/FundActions.d.ts +12 -0
  122. package/lib/typescript/src/MarketMaker/components/FundActions.d.ts.map +1 -0
  123. package/lib/typescript/src/MarketMaker/components/FundOwnershipList.d.ts +9 -0
  124. package/lib/typescript/src/MarketMaker/components/FundOwnershipList.d.ts.map +1 -0
  125. package/lib/typescript/src/MarketMaker/components/FundSelector.d.ts +13 -0
  126. package/lib/typescript/src/MarketMaker/components/FundSelector.d.ts.map +1 -0
  127. package/lib/typescript/src/MarketMaker/components/FundingRequestList.d.ts +11 -0
  128. package/lib/typescript/src/MarketMaker/components/FundingRequestList.d.ts.map +1 -0
  129. package/lib/typescript/src/MarketMaker/components/ManageFundForm.d.ts +10 -0
  130. package/lib/typescript/src/MarketMaker/components/ManageFundForm.d.ts.map +1 -0
  131. package/lib/typescript/src/MarketMaker/components/OrderForm.d.ts +12 -0
  132. package/lib/typescript/src/MarketMaker/components/OrderForm.d.ts.map +1 -0
  133. package/lib/typescript/src/MarketMaker/components/SetMarketForm.d.ts +15 -0
  134. package/lib/typescript/src/MarketMaker/components/SetMarketForm.d.ts.map +1 -0
  135. package/lib/typescript/src/MarketMaker/components/WeightProgress.d.ts +10 -0
  136. package/lib/typescript/src/MarketMaker/components/WeightProgress.d.ts.map +1 -0
  137. package/lib/typescript/src/MarketMaker/index.d.ts +3 -1
  138. package/lib/typescript/src/MarketMaker/index.d.ts.map +1 -1
  139. package/lib/typescript/src/Socket/index.d.ts.map +1 -1
  140. package/package.json +1 -1
  141. package/src/Components/Jerseys.tsx +9 -4
  142. package/src/LocationTracker/LocationStatus.tsx +1 -0
  143. package/src/MarketComponents/api/index.ts +27 -0
  144. package/src/MarketComponents/components/AthleteTournamentMarket/index.tsx +0 -1
  145. package/src/MarketComponents/components/MatchMarket/index.tsx +149 -0
  146. package/src/MarketComponents/components/TeamEventMarket/index.tsx +54 -4
  147. package/src/MarketComponents/components/TeamTournamentMarket/index.tsx +123 -0
  148. package/src/MarketComponents/components/TournamentMarket/api/index.ts +74 -0
  149. package/src/MarketComponents/components/TournamentMarket/index.tsx +289 -0
  150. package/src/MarketComponents/index.tsx +3 -1
  151. package/src/MarketMaker/api/index.ts +901 -8
  152. package/src/MarketMaker/components/Contest.tsx +119 -33
  153. package/src/MarketMaker/components/ContestMarkets.tsx +461 -9
  154. package/src/MarketMaker/components/Dashboard.tsx +70 -24
  155. package/src/MarketMaker/components/FundActions.tsx +149 -0
  156. package/src/MarketMaker/components/FundOwnershipList.tsx +54 -0
  157. package/src/MarketMaker/components/FundSelector.tsx +65 -0
  158. package/src/MarketMaker/components/FundingRequestList.tsx +71 -0
  159. package/src/MarketMaker/components/ManageFundForm.tsx +83 -0
  160. package/src/MarketMaker/components/OrderForm.tsx +134 -0
  161. package/src/MarketMaker/components/SetMarketForm.tsx +264 -0
  162. package/src/MarketMaker/components/WeightProgress.tsx +29 -0
  163. package/src/MarketMaker/index.tsx +332 -29
  164. package/src/Socket/index.tsx +5 -2
  165. package/src/types.d.ts +124 -0
@@ -1,17 +1,168 @@
1
1
  import axios from "axios";
2
2
  import { APIOverrides } from "../../ApiOverrides";
3
3
  import moment from "moment-mini";
4
+ import Colors from "../../constants/colors";
4
5
  let EVENT_SVC_API = '';
5
6
  let MK_SVC_API = '';
6
- //let AUTH_SVC_API = '';
7
-
7
+ let AUTH_SVC_API = '';
8
8
  export { MarketMakerApi, MarketMaketHelpers };
9
9
  const MarketMakerApi = {
10
10
  setEnvironment: () => {
11
11
  const endpoints = APIOverrides.getEndpoints();
12
12
  EVENT_SVC_API = endpoints['EVENT_SVC_API'];
13
13
  MK_SVC_API = endpoints['MK_SVC_API'];
14
- //AUTH_SVC_API = endpoints['AUTH_SVC_API'] as string;
14
+ AUTH_SVC_API = endpoints['AUTH_SVC_API'];
15
+ },
16
+ getPlayersByIds: async player_ids => {
17
+ try {
18
+ if (player_ids.length == 0) {
19
+ return [];
20
+ }
21
+ const resp = await axios.post(`${AUTH_SVC_API}/v1/players/bulk/get`, {
22
+ player_ids
23
+ });
24
+ return resp.data.players;
25
+ } catch (e) {
26
+ console.log(e);
27
+ return [];
28
+ }
29
+ },
30
+ getMyActiveFunds: async offset => {
31
+ try {
32
+ const resp = await axios.get(`${MK_SVC_API}/v1/funds/me/active?offset=${offset}`);
33
+ return resp.data.funds;
34
+ } catch (e) {
35
+ console.log(e);
36
+ return [];
37
+ }
38
+ },
39
+ createFund: async (name, minimum_investment, market_type) => {
40
+ try {
41
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/fund/create`, {
42
+ name,
43
+ minimum_investment,
44
+ market_type
45
+ });
46
+ return resp.data.fund;
47
+ } catch (e) {
48
+ console.log(e);
49
+ return undefined;
50
+ }
51
+ },
52
+ udpateFundName: async (fund_id, name) => {
53
+ try {
54
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/fund/update/name`, {
55
+ fund_id,
56
+ name
57
+ });
58
+ return resp.data.fund;
59
+ } catch (e) {
60
+ console.log(e);
61
+ return undefined;
62
+ }
63
+ },
64
+ udpateFundMinimum: async (fund_id, minimum_investment) => {
65
+ try {
66
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/fund/update/min`, {
67
+ fund_id,
68
+ minimum_investment
69
+ });
70
+ return resp.data.fund;
71
+ } catch (e) {
72
+ console.log(e);
73
+ return undefined;
74
+ }
75
+ },
76
+ getFundById: async fund_id => {
77
+ try {
78
+ const resp = await axios.get(`${MK_SVC_API}/v1/funds/fund/${fund_id}`);
79
+ return resp.data;
80
+ } catch (e) {
81
+ console.log(e);
82
+ return undefined;
83
+ }
84
+ },
85
+ getFundingRequestsByFundId: async fund_id => {
86
+ try {
87
+ const resp = await axios.get(`${MK_SVC_API}/v1/funds/requests/fund/${fund_id}`);
88
+ return resp.data.funding_requests;
89
+ } catch (e) {
90
+ console.log(e);
91
+ return [];
92
+ }
93
+ },
94
+ depositRequest: async (fund_id, amount) => {
95
+ try {
96
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/deposit/request/create`, {
97
+ fund_id,
98
+ amount
99
+ });
100
+ return resp.data.fund;
101
+ } catch (e) {
102
+ console.log(e);
103
+ return undefined;
104
+ }
105
+ },
106
+ approveRequest: async funding_request_id => {
107
+ try {
108
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/deposit/request/approve`, {
109
+ funding_request_id
110
+ });
111
+ return resp.data;
112
+ } catch (e) {
113
+ console.log(e);
114
+ return undefined;
115
+ }
116
+ },
117
+ declineRequest: async funding_request_id => {
118
+ try {
119
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/deposit/request/decline`, {
120
+ funding_request_id
121
+ });
122
+ return resp.data.funding_request;
123
+ } catch (e) {
124
+ console.log(e);
125
+ return undefined;
126
+ }
127
+ },
128
+ workCapital: async (fund_id, amount) => {
129
+ try {
130
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/capital/work`, {
131
+ fund_id,
132
+ amount
133
+ });
134
+ return resp.data;
135
+ } catch (e) {
136
+ console.log(e);
137
+ return undefined;
138
+ }
139
+ },
140
+ layoffCapital: async (fund_id, amount) => {
141
+ try {
142
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/capital/layoff`, {
143
+ fund_id,
144
+ amount
145
+ });
146
+ console.log(resp.data);
147
+ return resp.data;
148
+ } catch (e) {
149
+ console.log(e);
150
+ return undefined;
151
+ }
152
+ },
153
+ addOrdersToFund: async (fund_id, orders) => {
154
+ try {
155
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/fund/orders/add`, {
156
+ fund_id,
157
+ orders
158
+ });
159
+ return resp.data.orders;
160
+ } catch (e) {
161
+ return {
162
+ orders: [],
163
+ fund_orders: []
164
+ };
165
+ }
15
166
  },
16
167
  getLeagues: async () => {
17
168
  try {
@@ -21,6 +172,20 @@ const MarketMakerApi = {
21
172
  return [];
22
173
  }
23
174
  },
175
+ getAthletesByIds: async athlete_ids => {
176
+ if (athlete_ids.length == 0) {
177
+ return [];
178
+ }
179
+ try {
180
+ const resp = await axios.post(`${EVENT_SVC_API}/v1/athletes/bulk/get`, {
181
+ attribute: 'athlete_id',
182
+ values: athlete_ids
183
+ });
184
+ return resp.data.athletes;
185
+ } catch (e) {
186
+ return [];
187
+ }
188
+ },
24
189
  getMarkets: async () => {
25
190
  try {
26
191
  const resp = await axios.get(`${MK_SVC_API}/v1/markets/all`);
@@ -71,10 +236,24 @@ const MarketMakerApi = {
71
236
  };
72
237
  }
73
238
  },
239
+ getPricesByEvents: async (event_type, event_ids) => {
240
+ if (event_ids.length == 0) {
241
+ return [];
242
+ }
243
+ try {
244
+ const resp = await axios.post(`${EVENT_SVC_API}/v1/prices/latest/bulk/get`, {
245
+ event_type,
246
+ event_ids
247
+ });
248
+ return resp.data.prices;
249
+ } catch (e) {
250
+ console.log(e);
251
+ return [];
252
+ }
253
+ },
74
254
  getPricesByEvent: async (event_id, event_type) => {
75
255
  try {
76
256
  const resp = await axios.get(`${EVENT_SVC_API}/v1/prices/latest/${event_id}/${event_type}`);
77
- console.log(resp.data);
78
257
  return resp.data.prices;
79
258
  } catch (e) {
80
259
  console.log(e);
@@ -95,15 +274,114 @@ const MarketMakerApi = {
95
274
  console.log(e);
96
275
  return [];
97
276
  }
277
+ },
278
+ cancelOrders: async order_ids => {
279
+ if (order_ids.length == 0) {
280
+ return [];
281
+ }
282
+ try {
283
+ const resp = await axios.post(`${MK_SVC_API}/v1/orders/bulk/cancel`, {
284
+ order_ids
285
+ });
286
+ return resp.data.orders;
287
+ } catch (e) {
288
+ alert('Unable to process cancellation');
289
+ return [];
290
+ }
98
291
  }
99
292
  };
100
293
  const MarketMaketHelpers = {
101
- getOrderStats: orders => {
102
- const open_amt = orders.reduce((a, b) => a + b.open_amt, 0);
103
- const called_amt = orders.reduce((a, b) => a + b.called_amt, 0);
294
+ getOrderStats: (orders, ba_order) => {
295
+ let called_amt = 0,
296
+ open_amt = 0,
297
+ open_potential_winnings = 0,
298
+ stake_amt = 0,
299
+ stake_potential_winnings = 0;
300
+ let open_probability = 0,
301
+ stake_probability = 0,
302
+ open_odds = 0,
303
+ stake_odds = 0,
304
+ cash_rcvd = 0,
305
+ delayed_cash = 0,
306
+ winnings = 0,
307
+ net_winnings = 0,
308
+ commission = 0;
309
+ let stake_earnings = 0;
310
+ let wi_potential_winnings = 0,
311
+ wi_stake_amt = 0,
312
+ wi_probability = 0;
313
+ let wi_recommended = false;
314
+ orders.map(o => {
315
+ if (o.status == 'approved') {
316
+ open_amt += o.open_amt;
317
+ open_potential_winnings += o.potential_winnings;
318
+ }
319
+ called_amt += o.called_amt;
320
+ if (o.positions) {
321
+ o.positions.map(p => {
322
+ stake_amt += p.stake;
323
+ stake_potential_winnings += p.potential_winnings;
324
+ cash_rcvd += p.cash_rcvd;
325
+ delayed_cash += p.delayed_cash;
326
+ winnings += p.winnings;
327
+ net_winnings += p.net_winnings;
328
+ commission += p.commission;
329
+ });
330
+ }
331
+ });
332
+ stake_earnings = stake_potential_winnings - stake_amt;
333
+ let open_earnings = open_potential_winnings - open_amt;
334
+ if (open_potential_winnings > 0) {
335
+ open_probability = open_amt / open_potential_winnings;
336
+ open_odds = MarketMaketHelpers.calcAmericanOddsFromProbability(open_probability);
337
+ }
338
+ if (stake_potential_winnings > 0) {
339
+ stake_probability = stake_amt / stake_potential_winnings;
340
+ stake_odds = MarketMaketHelpers.calcAmericanOddsFromProbability(stake_probability);
341
+ }
342
+ if (ba_order) {
343
+ wi_potential_winnings = stake_potential_winnings + ba_order.potential_winnings;
344
+ wi_stake_amt = stake_amt + ba_order.open_amt;
345
+ wi_probability = wi_stake_amt / wi_potential_winnings;
346
+ if (wi_probability < stake_probability) {
347
+ wi_recommended = true;
348
+ }
349
+ }
104
350
  return {
105
351
  open_amt,
106
- called_amt
352
+ stake_earnings,
353
+ open_odds,
354
+ stake_probability,
355
+ stake_odds,
356
+ open_earnings,
357
+ wi_potential_winnings,
358
+ wi_stake_amt,
359
+ wi_probability,
360
+ wi_recommended,
361
+ called_amt,
362
+ open_potential_winnings,
363
+ stake_amt,
364
+ stake_potential_winnings,
365
+ open_probability,
366
+ cash_rcvd,
367
+ delayed_cash,
368
+ winnings,
369
+ net_winnings,
370
+ commission
371
+ };
372
+ },
373
+ getWeight: (o_side_potential_winnings, trade_side_potential_winnings, market) => {
374
+ const total = o_side_potential_winnings + trade_side_potential_winnings;
375
+ let weighted_pct = 0;
376
+ const difference = trade_side_potential_winnings - o_side_potential_winnings;
377
+ const direction = difference > 0 ? market.trade_side : difference == 0 ? 'neutral' : market.side_options.find(so => so.side != market.trade_side)?.side;
378
+ if (total > 0) {
379
+ weighted_pct = difference / total;
380
+ }
381
+ return {
382
+ direction,
383
+ weighted_pct,
384
+ difference
107
385
  };
108
386
  },
109
387
  sortContests: (events, tournaments, matches, markets) => {
@@ -147,6 +425,22 @@ const MarketMaketHelpers = {
147
425
  });
148
426
  return contests;
149
427
  },
428
+ calcAmericanOddsFromProbability: probability => {
429
+ let p = probability * 100; //Convert to whole number
430
+ if (p >= 100) {
431
+ return -99999;
432
+ }
433
+ if (p === 0) {
434
+ return 9999;
435
+ }
436
+ if (p === 50) {
437
+ return 100;
438
+ }
439
+ if (p < 50) {
440
+ return 100 / (p / 100) - 100;
441
+ }
442
+ return p / (1 - p / 100) * -1;
443
+ },
150
444
  getSelectableMarkets: (events, tournaments, matches, markets) => {
151
445
  let market_ids = [];
152
446
  events.map(e => {
@@ -167,6 +461,16 @@ const MarketMaketHelpers = {
167
461
  market_ids = [...new Set(market_ids.map(id => id.toString()))];
168
462
  return markets.filter(m => market_ids.includes(m.market_id.toString()));
169
463
  },
464
+ updateBestAvailable: (ba, new_ba) => {
465
+ let events = ba.events.filter(e => !new_ba.events.find(newe => newe.event_id == e.event_id)).concat(new_ba.events);
466
+ let tournaments = ba.tournaments.filter(t => !new_ba.tournaments.find(newt => newt.tournament_id == t.tournament_id)).concat(new_ba.tournaments);
467
+ let matches = ba.matches.filter(m => !new_ba.matches.find(newb => newb.match_id == m.match_id)).concat(new_ba.matches);
468
+ return {
469
+ events,
470
+ tournaments,
471
+ matches
472
+ };
473
+ },
170
474
  getMarketDataFromBestAvailable: ba => {
171
475
  let updated = false;
172
476
  let event_order_stats = [];
@@ -229,6 +533,840 @@ const MarketMaketHelpers = {
229
533
  available_orders,
230
534
  latest_trades
231
535
  };
536
+ },
537
+ getSideMarketData: (orders, best_available_orders, trades, market, side_type, side_id) => {
538
+ console.log(side_type, side_id);
539
+ let trade_side_orders = orders.filter(o => o.side == market.trade_side);
540
+ let o_side_orders = orders.filter(o => o.side != market.trade_side);
541
+ let trade_side_ba = best_available_orders.find(o => o.side == market.trade_side);
542
+ let o_side_ba = best_available_orders.find(o => o.side != market.trade_side);
543
+ let trade_side_trades = trades.filter(t => t.side == market.trade_side);
544
+ let o_side_trades = trades.filter(t => t.side != market.trade_side);
545
+ const o_side = market.side_options.find(so => so.side != market.trade_side)?.side;
546
+ let trade_side_ba_mine = orders.find(o => o.order_id == trade_side_ba?.order_id) ? true : false;
547
+ let o_side_ba_mine = orders.find(o => o.order_id == o_side_ba?.order_id) ? true : false;
548
+ return {
549
+ trade_side: market.trade_side,
550
+ o_side,
551
+ trade_side_orders,
552
+ o_side_orders,
553
+ trade_side_ba,
554
+ o_side_ba,
555
+ trade_side_trades,
556
+ o_side_trades,
557
+ trade_side_ba_mine,
558
+ o_side_ba_mine
559
+ };
560
+ },
561
+ getOrderColor: order => {
562
+ if (!order.grade) {
563
+ return Colors.shades.shade600;
564
+ }
565
+ if (order.grade > 98) {
566
+ return Colors.highlights.highlight400Faded;
567
+ }
568
+ return Colors.highlights.highlight300Faded;
569
+ },
570
+ getOrderFromTrade: (trade, unit_size, ba_order_id) => {
571
+ let open_amt = 10;
572
+ if (unit_size) {
573
+ open_amt = unit_size;
574
+ }
575
+ let draft_liquidity = 0;
576
+ if (trade.draft_liquidity) {
577
+ draft_liquidity = trade.draft_liquidity;
578
+ }
579
+ return {
580
+ order_id: '',
581
+ player_id: '',
582
+ be_type: 'market',
583
+ //TODO - Make this dynamic,
584
+ open_amt,
585
+ called_amt: 0,
586
+ buy_sell_ind: 'buy',
587
+ rejections: 0,
588
+ commission_pct: 0,
589
+ available_for_parlays: false,
590
+ event_id: trade.event_id,
591
+ draft_liquidity,
592
+ event_type: trade.event_type,
593
+ side: trade.side,
594
+ side_type: trade.side_type,
595
+ resolution_status: 'inprogress',
596
+ side_id: trade.side_id,
597
+ order_type: trade.limit_override ? 'limit' : 'market',
598
+ potential_winnings: 0,
599
+ collar_pct: .01,
600
+ positions: [],
601
+ market_id: trade.market_id,
602
+ title: '',
603
+ probability: trade.probability,
604
+ odds: trade.odds,
605
+ var_1: trade.var_1,
606
+ market_type: trade.market_type,
607
+ position_ids: [],
608
+ status: 'approved',
609
+ expire_datetime: moment().add(1, 'hours'),
610
+ reference_order_id: ba_order_id
611
+ };
612
+ },
613
+ getTeamEventSideIds: (event, market, side_option, athlete, team) => {
614
+ const o_side = market.side_options.find(so => so.side != side_option.side);
615
+ if (!o_side) {
616
+ return undefined;
617
+ }
618
+ switch (side_option.id_source) {
619
+ case 'side':
620
+ return {
621
+ side_id: side_option.side,
622
+ reversed_side_id: o_side.side
623
+ };
624
+ case 'athlete':
625
+ if (!athlete) {
626
+ return undefined;
627
+ }
628
+ return {
629
+ side_id: athlete.athlete_id,
630
+ reversed_side_id: athlete.athlete_id
631
+ };
632
+ case 'team':
633
+ if (market.level == 'event') {
634
+ let side_id = event[side_option.side]?.team_id;
635
+ let reversed_side_id = event[o_side.side]?.team_id;
636
+ if (!side_id || !reversed_side_id) {
637
+ return undefined;
638
+ }
639
+ return {
640
+ side_id,
641
+ reversed_side_id
642
+ };
643
+ }
644
+ if (market.level == 'team') {
645
+ if (!team) {
646
+ return undefined;
647
+ }
648
+ return {
649
+ side_id: team.team_id,
650
+ reversed_side_id: team.team_id
651
+ };
652
+ }
653
+ return undefined;
654
+ default:
655
+ return undefined;
656
+ }
657
+ },
658
+ getTournamentSideIds: (market, side_option, athlete, team) => {
659
+ const o_side = market.side_options.find(so => so.side != side_option.side);
660
+ if (!o_side) {
661
+ return undefined;
662
+ }
663
+ switch (side_option.id_source) {
664
+ case 'side':
665
+ return {
666
+ side_id: side_option.side,
667
+ reversed_side_id: o_side.side
668
+ };
669
+ case 'athlete':
670
+ if (!athlete) {
671
+ return undefined;
672
+ }
673
+ return {
674
+ side_id: athlete.athlete_id,
675
+ reversed_side_id: athlete.athlete_id
676
+ };
677
+ case 'team':
678
+ if (market.level == 'team') {
679
+ if (!team) {
680
+ return undefined;
681
+ }
682
+ return {
683
+ side_id: team.team_id,
684
+ reversed_side_id: team.team_id
685
+ };
686
+ }
687
+ return undefined;
688
+ default:
689
+ return undefined;
690
+ }
691
+ },
692
+ getTradeFromAvailableOrder: (ba, reversed_side_id) => {
693
+ return {
694
+ trade_id: '',
695
+ event_id: ba.event_id,
696
+ event_type: ba.event_type,
697
+ cumulative_amt: 0,
698
+ trade_amt: 0,
699
+ create_datetime: '',
700
+ last_update_datetime: '',
701
+ market_id: ba.market_id,
702
+ var_1: ba.var_1,
703
+ side: ba.side,
704
+ side_id: ba.side_id,
705
+ draft_liquidity: ba.open_amt,
706
+ reversed_side_id,
707
+ probability: ba.probability,
708
+ odds: ba.odds,
709
+ side_type: ba.side_type,
710
+ market_type: 'FOR_MONEY',
711
+ latest: true,
712
+ position_ids: []
713
+ };
714
+ },
715
+ reverseBAOrder: (order, market, side_id) => {
716
+ const side_option = market.side_options.find(so => so.side != order.side);
717
+ if (!side_option) {
718
+ return undefined;
719
+ }
720
+ return {
721
+ ...order,
722
+ side: side_option.side,
723
+ side_id: side_id,
724
+ odds: order.odds * -1,
725
+ var_1: market.type == 'Spread' ? order.var_1 * -1 : order.var_1,
726
+ probability: 1 - order.probability,
727
+ title: '',
728
+ open_amt: 0,
729
+ called_amt: 0,
730
+ potential_winnings: 0
731
+ };
732
+ },
733
+ getTradeFromPrice: (price, reversed_side_id) => {
734
+ return {
735
+ trade_id: '',
736
+ event_type: price.event_type,
737
+ trade_amt: 0,
738
+ side_type: price.participant_type,
739
+ cumulative_amt: 0,
740
+ side: price.side,
741
+ odds: price.odds,
742
+ reversed_side_id: reversed_side_id,
743
+ probability: price.probability,
744
+ side_id: price.participant_id,
745
+ position_ids: [],
746
+ market_type: 'FOR_MONEY',
747
+ market_id: price.market_id,
748
+ event_id: price.event_id,
749
+ var_1: price.var_1,
750
+ latest: true,
751
+ create_datetime: '',
752
+ last_update_datetime: ''
753
+ };
754
+ },
755
+ getVisibleTrade: (default_price_view, market, side_option, latest_trades, best_available_orders, side_id, reversed_side_id) => {
756
+ const order = best_available_orders.find(o => o.market_id == market.market_id && o.side == side_option.side && o.show);
757
+ const o_side_order = best_available_orders.find(o => o.market_id == market.market_id && o.side != side_option.side && o.show);
758
+ let trade = latest_trades.find(t => t.market_type == 'FOR_MONEY' && t.market_id == market.market_id && t.side == side_option.side);
759
+ switch (default_price_view) {
760
+ case 'best_available':
761
+ if (order) {
762
+ return MarketMaketHelpers.getTradeFromAvailableOrder(order, reversed_side_id);
763
+ }
764
+ if (o_side_order) {
765
+ //Now lets reverse this order and get a trade for it
766
+ const reversed_order = MarketMaketHelpers.reverseBAOrder(o_side_order, market, side_id);
767
+ if (!reversed_order) {
768
+ return undefined;
769
+ }
770
+ return MarketMaketHelpers.getTradeFromAvailableOrder(reversed_order, reversed_side_id);
771
+ }
772
+ if (trade) {
773
+ return trade;
774
+ }
775
+ return undefined;
776
+ case 'last_trade':
777
+ if (trade) {
778
+ return trade;
779
+ }
780
+ return undefined;
781
+ default:
782
+ return undefined;
783
+ }
784
+ },
785
+ getHedgesFromPositions: (orders, markets) => {
786
+ //1) Set up arrays to store hedges
787
+ let hedges = [];
788
+ let hedgeable_positions = [];
789
+ //Only allow real money orders for hedging
790
+ orders = orders.filter(o => o.market_type === 'FOR_MONEY' && o.resolution_status !== 'closed');
791
+
792
+ //2) Get the unique markets (and common var_1s) that are eligible to be hedged
793
+ let orders_with_positions = orders.filter(o => o.positions[0]);
794
+ let unique_markets = [...new Set(orders_with_positions.map(o => `${o.event_id}:${o.event_type}:${o.market_id}:${Math.abs(o.var_1)}`))];
795
+
796
+ //3) For each unique market and var_1 combo, determin if there are positions on the opposite side of each other
797
+ //If so, then store them into an array of orders
798
+ unique_markets.map(id => {
799
+ //1) Get orders that are associated with the market
800
+ let market_orders = orders_with_positions.filter(o => `${o.event_id}:${o.event_type}:${o.market_id}:${Math.abs(o.var_1)}` == id);
801
+ if (market_orders.length < 2) {
802
+ return;
803
+ } //Impossible to hedge with less than 2 orders
804
+ let unique_sides = [...new Set(market_orders.map(o => o.side))];
805
+ if (unique_sides.length < 0) {
806
+ return;
807
+ } //Must have more than 1 side
808
+
809
+ hedgeable_positions.push(market_orders);
810
+ });
811
+
812
+ //Return nothing if there are no hedgeable positions
813
+ if (hedgeable_positions.length === 0) {
814
+ return [];
815
+ }
816
+
817
+ //Awesome! We have some hedgeable positions
818
+ hedgeable_positions.map(hp => {
819
+ if (!hp[0]) {
820
+ return;
821
+ }
822
+ //Get an empty hedge object to store our hedges
823
+ let hedge = MarketMaketHelpers.getEmptyHedge();
824
+ let market = markets.find(m => m.market_id == hp[0]?.market_id);
825
+ if (!market) {
826
+ return;
827
+ } //Error out if there is no market
828
+ if (market.level !== 'event') {
829
+ return;
830
+ } //Dont if level is not event
831
+
832
+ let trade_side_orders = hp.filter(o => o.side == market?.trade_side);
833
+ let o_side_orders = hp.filter(o => o.side != market?.trade_side);
834
+
835
+ //New
836
+ if (market.type == 'Spread') {
837
+ if (!trade_side_orders[0]) {
838
+ return;
839
+ } //Make sure there is at least 1 trade side order
840
+ let trade_side_o = trade_side_orders[0];
841
+ if (!trade_side_o) {
842
+ return;
843
+ }
844
+ o_side_orders = o_side_orders.filter(o => o.var_1 == trade_side_o.var_1 * -1);
845
+ }
846
+ if (trade_side_orders.length === 0 || o_side_orders.length === 0) {
847
+ return;
848
+ }
849
+ hedge.market_id = market.market_id;
850
+ hedge.market_type = hp[0].market_type;
851
+ hedge.var_1 = Math.abs(hp[0].var_1);
852
+ hedge.player_id = hp[0].player_id;
853
+ hedge.event_id = hp[0].event_id;
854
+ hedge.event_type = hp[0].event_type;
855
+ hedge.market_id = hp[0].market_id;
856
+
857
+ //Set up arrays to store the positions on each side of the hedge
858
+ let trade_side_positions = [];
859
+ let o_side_positions = [];
860
+ trade_side_orders.map(o => {
861
+ trade_side_positions = trade_side_positions.concat(o.positions);
862
+ });
863
+ o_side_orders.map(o => {
864
+ o_side_positions = o_side_positions.concat(o.positions);
865
+ });
866
+
867
+ //Calculate the winnings from each outcome (side a wins, side b wins, or draw)
868
+ let trade_side_pot_winnings = trade_side_positions.reduce((a, b) => a + b.potential_winnings, 0);
869
+ let o_side_pot_winnings = o_side_positions.reduce((a, b) => a + b.potential_winnings, 0);
870
+ let draw_winnings = trade_side_positions.concat(o_side_positions).reduce((a, b) => a + b.stake, 0);
871
+
872
+ //Get the minimum payout possible of the 3 outcomes which is the hedged amount
873
+ let hedged_amt = Math.min(trade_side_pot_winnings, o_side_pot_winnings);
874
+ if (isNaN(hedged_amt)) {
875
+ return;
876
+ }
877
+ hedge.hedged_amt = hedged_amt;
878
+
879
+ //Now lets cals out hedged positions
880
+ let hedged_positions = [];
881
+ trade_side_positions.map(p => {
882
+ //Need to determine the weight of the position on the total potential winnings and reduce the stake proportionately
883
+ let pct = p.potential_winnings / trade_side_pot_winnings;
884
+ //console.log(hedged_amt, pct, p.probability)
885
+ let stake_from_hedge = hedged_amt * pct * p.probability;
886
+ hedge.stake_reduction += stake_from_hedge;
887
+ let new_stake = p.stake - stake_from_hedge;
888
+ hedged_positions.push({
889
+ hedge_id: '',
890
+ hedged_position_id: '',
891
+ position_id: p.position_id,
892
+ original_stake: p.stake,
893
+ new_stake,
894
+ delayed_cash_draw: 0,
895
+ delayed_cash_no_draw: 0,
896
+ original_potential_winnings: p.potential_winnings,
897
+ new_potential_winnings: new_stake / p.probability,
898
+ status: 'pending',
899
+ create_datetime: '',
900
+ last_update_datetime: ''
901
+ });
902
+ });
903
+ o_side_positions.map(p => {
904
+ let pct = p.potential_winnings / o_side_pot_winnings;
905
+ let stake_from_hedge = hedged_amt * pct * p.probability;
906
+ hedge.stake_reduction += stake_from_hedge;
907
+ let new_stake = p.stake - stake_from_hedge;
908
+ hedged_positions.push({
909
+ hedge_id: '',
910
+ hedged_position_id: '',
911
+ position_id: p.position_id,
912
+ original_stake: p.stake,
913
+ new_stake,
914
+ delayed_cash_draw: 0,
915
+ delayed_cash_no_draw: 0,
916
+ original_potential_winnings: p.potential_winnings,
917
+ new_potential_winnings: new_stake / p.probability,
918
+ status: 'pending',
919
+ create_datetime: '',
920
+ last_update_datetime: ''
921
+ });
922
+ });
923
+
924
+ //Cash rcvd will be the lower of the hedged amount or the reduction in stake
925
+ let cash_rcvd = Math.min(hedge.stake_reduction, hedged_amt, draw_winnings);
926
+ if (isNaN(cash_rcvd) || cash_rcvd < 0.01) {
927
+ return;
928
+ }
929
+ hedge.cash_rcvd = cash_rcvd;
930
+ let delayed_cash = hedged_amt - hedge.stake_reduction;
931
+ let total_og_stake = hedged_positions.reduce((a, b) => a + b.original_stake, 0);
932
+ let delayed_cash_draw = 0,
933
+ delayed_cash_no_draw = 0;
934
+ if (delayed_cash < 0) {
935
+ delayed_cash_draw = delayed_cash * -1;
936
+ //hedge.delayed_cash_draw = delayed_cash * -1 //Need to make positive
937
+ } else {
938
+ delayed_cash_no_draw = delayed_cash;
939
+ //hedge.delayed_cash_no_draw = delayed_cash
940
+ }
941
+ hedge.delayed_cash_draw = delayed_cash_draw;
942
+ hedge.delayed_cash_no_draw = delayed_cash_no_draw;
943
+ hedged_positions.map(hp => {
944
+ let pct_of_total = hp.original_stake / total_og_stake;
945
+ hp.delayed_cash_draw = pct_of_total * delayed_cash_draw;
946
+ hp.delayed_cash_no_draw = pct_of_total * delayed_cash_no_draw;
947
+ return hp;
948
+ });
949
+ hedges.push({
950
+ ...hedge,
951
+ hedged_positions: hedged_positions
952
+ });
953
+ });
954
+ return hedges;
955
+ },
956
+ getEmptyHedge: () => {
957
+ return {
958
+ hedge_id: '',
959
+ hedged_amt: 0,
960
+ event_id: '',
961
+ event_type: '',
962
+ market_id: '',
963
+ var_1: 0,
964
+ delayed_cash_draw: 0,
965
+ delayed_cash_no_draw: 0,
966
+ cash_rcvd: 0,
967
+ stake_reduction: 0,
968
+ market_type: 'FOR_MONEY',
969
+ create_datetime: '',
970
+ last_udpate_datetime: '',
971
+ player_id: '',
972
+ status: 'pending'
973
+ };
974
+ },
975
+ getVar1Label: (market, var_1, side) => {
976
+ if (side == 'over') {
977
+ return `O ${var_1}`;
978
+ }
979
+ if (side == 'under') {
980
+ return `U ${var_1}`;
981
+ }
982
+ if (market.type != 'Spread') {
983
+ return `${var_1}`;
984
+ }
985
+ if (var_1 < 0) {
986
+ return `${var_1}`;
987
+ }
988
+ return `+${var_1}`;
989
+ },
990
+ getOddsLabel: (odds, decimals) => {
991
+ let new_odds = odds.toFixed();
992
+ if (decimals) {
993
+ new_odds = odds.toFixed(decimals);
994
+ }
995
+ if (odds < 0) {
996
+ return `${new_odds}`;
997
+ }
998
+ return `+${new_odds}`;
999
+ },
1000
+ getOrderTitleForTeamEvent: (order, market, event, athlete, exotic) => {
1001
+ let market_side = market.side_options.find(o => o.side == order.side);
1002
+ if (!market_side) {
1003
+ return undefined;
1004
+ }
1005
+ var re = /({.*?})/;
1006
+ let parsed_text = market_side.parseable_title.split(re);
1007
+ let new_title = '';
1008
+ parsed_text.map(t => {
1009
+ if (t === '') {
1010
+ return;
1011
+ }
1012
+ if (t[0] !== '{') {
1013
+ return new_title += t;
1014
+ }
1015
+ let variable = t.slice(1);
1016
+ variable = variable.slice(0, variable.length - 1);
1017
+ switch (variable) {
1018
+ case 'team':
1019
+ let team = event[order.side];
1020
+ return new_title += team.market_name;
1021
+ case 'var_1':
1022
+ return new_title += MarketMaketHelpers.getVar1Label(market, order.var_1);
1023
+ case 'athlete':
1024
+ return new_title += athlete?.abbr_name;
1025
+ case 'stat':
1026
+ return new_title += market.stat_label ?? market.stat;
1027
+ case 'exotic':
1028
+ return new_title += exotic?.name;
1029
+ default:
1030
+ return;
1031
+ }
1032
+ });
1033
+ return new_title;
1034
+ },
1035
+ getOrderTitleForTournament: (order, market, tournament, athlete, team) => {
1036
+ if (!tournament) {
1037
+ return undefined;
1038
+ }
1039
+ let market_side = market.side_options.find(o => o.side == order.side);
1040
+ if (!market_side) {
1041
+ return order.side;
1042
+ }
1043
+ var re = /({.*?})/;
1044
+ let parsed_text = market_side.parseable_title.split(re);
1045
+ let new_title = '';
1046
+ parsed_text.map(t => {
1047
+ if (t === '') {
1048
+ return;
1049
+ }
1050
+ if (t[0] !== '{') {
1051
+ return new_title += t;
1052
+ }
1053
+ let variable = t.slice(1);
1054
+ variable = variable.slice(0, variable.length - 1);
1055
+ switch (variable) {
1056
+ case 'team':
1057
+ return new_title += `${team?.market_name} ${team?.name}`;
1058
+ case 'var_1':
1059
+ return new_title += MarketMaketHelpers.getVar1Label(market, order.var_1);
1060
+ case 'athlete':
1061
+ return new_title += athlete?.abbr_name;
1062
+ case 'stat':
1063
+ return new_title += market.stat;
1064
+ default:
1065
+ return;
1066
+ }
1067
+ });
1068
+ return new_title;
1069
+ },
1070
+ getOrderTitleForMatch: (order, market, match, athlete, team) => {
1071
+ if (!match) {
1072
+ return undefined;
1073
+ }
1074
+ let market_side = market.side_options.find(o => o.side == order.side);
1075
+ if (!market_side) {
1076
+ return order.side;
1077
+ }
1078
+ var re = /({.*?})/;
1079
+ let parsed_text = market_side.parseable_title.split(re);
1080
+ let new_title = '';
1081
+ parsed_text.map(t => {
1082
+ if (t === '') {
1083
+ return;
1084
+ }
1085
+ if (t[0] !== '{') {
1086
+ return new_title += t;
1087
+ }
1088
+ let variable = t.slice(1);
1089
+ variable = variable.slice(0, variable.length - 1);
1090
+ switch (variable) {
1091
+ case 'team':
1092
+ return new_title += `${team?.market_name} ${team?.name}`;
1093
+ case 'var_1':
1094
+ return new_title += MarketMaketHelpers.getVar1Label(market, order.var_1);
1095
+ case 'athlete':
1096
+ return new_title += athlete?.abbr_name;
1097
+ case 'stat':
1098
+ return new_title += market.stat;
1099
+ default:
1100
+ return;
1101
+ }
1102
+ });
1103
+ return new_title;
1104
+ },
1105
+ setMarkets: (fund, best_available, external_prices, market, margin, event) => {
1106
+ let orders = [];
1107
+ market.side_options.map(so => {
1108
+ let side_id_response = MarketMaketHelpers.getTeamEventSideIds(event, market, so);
1109
+ if (!side_id_response) {
1110
+ return;
1111
+ }
1112
+ let ba = best_available.find(ba => ba.side == so.side);
1113
+ let o_ba = best_available.find(ba => ba.side != so.side);
1114
+ if (ba && o_ba) {
1115
+ let ba_trade = MarketMaketHelpers.getTradeFromAvailableOrder(ba, side_id_response.reversed_side_id);
1116
+ let ba_order = MarketMaketHelpers.getOrderFromTrade(ba_trade, 10, ba.order_id);
1117
+ let ba_title = MarketMaketHelpers.getOrderTitleForTeamEvent(ba_order, market, event);
1118
+ if (!ba_title) {
1119
+ return;
1120
+ }
1121
+ return orders.push({
1122
+ ...ba_order,
1123
+ title: ba_title
1124
+ });
1125
+ }
1126
+ let ep = external_prices.find(p => p.side == so.side);
1127
+ let o_ep = external_prices.find(p => p.side != so.side);
1128
+ if (ep && o_ep) {
1129
+ console.log(ep);
1130
+ console.log(market);
1131
+ let ep_trade = MarketMaketHelpers.getTradeFromPrice(ep, side_id_response.reversed_side_id);
1132
+ let ep_order = MarketMaketHelpers.getOrderFromTrade(ep_trade, 10);
1133
+ let ep_title = MarketMaketHelpers.getOrderTitleForTeamEvent(ep_order, market, event);
1134
+ if (!ep_title) {
1135
+ return;
1136
+ }
1137
+ return orders.push({
1138
+ ...ep_order,
1139
+ title: ep_title
1140
+ });
1141
+ }
1142
+ return;
1143
+ });
1144
+ if (orders.length != 2) {
1145
+ return [];
1146
+ }
1147
+
1148
+ //OK!! Lets figured out the buffer odds!
1149
+ let no_vig_trade_price = .5;
1150
+ let no_vig_o_price = .5;
1151
+ let no_vig_data = MarketMaketHelpers.getNoVigPrice(external_prices, market);
1152
+ if (no_vig_data) {
1153
+ no_vig_o_price = no_vig_data.o_side_prob;
1154
+ no_vig_trade_price = no_vig_data.trade_side_prob;
1155
+ }
1156
+
1157
+ //Now lets add a buffer to each one based on the margin provided!
1158
+ no_vig_trade_price -= margin * 0.5;
1159
+ let novig_trade_side_odds = Math.round(MarketMaketHelpers.calcAmericanOddsFromProbability(no_vig_trade_price));
1160
+ no_vig_o_price -= margin * 0.5;
1161
+ let novig_o_side_odds = Math.round(MarketMaketHelpers.calcAmericanOddsFromProbability(no_vig_o_price));
1162
+
1163
+ //OK!!! Now lets add the propbabilities to the orders!
1164
+ let trade_side_order = orders.find(o => o.side == market.trade_side);
1165
+ let o_side_order = orders.find(o => o.side != market.trade_side);
1166
+ if (!trade_side_order || !o_side_order) {
1167
+ return [];
1168
+ }
1169
+ let higher_probability_order = no_vig_trade_price >= no_vig_o_price ? 'trade' : 'other';
1170
+ let trade_side_stake = 0,
1171
+ o_side_stake = 0;
1172
+ if (higher_probability_order == 'trade') {
1173
+ console.log('min was trade side');
1174
+ trade_side_stake = fund.working_capital;
1175
+ //If that is the stake, then the potential winnigns is
1176
+ let pot_win = MarketMaketHelpers.calcPotentialWinnings(trade_side_stake, novig_trade_side_odds);
1177
+ o_side_stake = MarketMaketHelpers.calcSaleValue(novig_o_side_odds, pot_win);
1178
+ } else {
1179
+ console.log('min was o side!!');
1180
+ o_side_stake = fund.working_capital;
1181
+ //If that is the stake, then the potential winnigns is
1182
+ let pot_win = MarketMaketHelpers.calcPotentialWinnings(o_side_stake, novig_o_side_odds);
1183
+ trade_side_stake = MarketMaketHelpers.calcSaleValue(novig_trade_side_odds, pot_win);
1184
+ }
1185
+ let o_side_working = o_side_stake / fund.working_capital;
1186
+ let t_side_working = trade_side_stake / fund.working_capital;
1187
+ o_side_order = {
1188
+ ...o_side_order,
1189
+ probability: no_vig_o_price,
1190
+ odds: novig_o_side_odds,
1191
+ fulfill_action: 'drain',
1192
+ expire_datetime: event.scheduled_datetime,
1193
+ working_pct: o_side_working,
1194
+ potential_winnings: MarketMaketHelpers.calcPotentialWinnings(o_side_stake, novig_o_side_odds),
1195
+ open_amt: o_side_stake
1196
+ };
1197
+ trade_side_order = {
1198
+ ...trade_side_order,
1199
+ probability: no_vig_trade_price,
1200
+ odds: novig_trade_side_odds,
1201
+ fulfill_action: 'drain',
1202
+ expire_datetime: event.scheduled_datetime,
1203
+ working_pct: t_side_working,
1204
+ potential_winnings: MarketMaketHelpers.calcPotentialWinnings(trade_side_stake, novig_trade_side_odds),
1205
+ open_amt: trade_side_stake
1206
+ };
1207
+ return [o_side_order, trade_side_order];
1208
+ },
1209
+ calcSaleValue: (odds, potential_winnings) => {
1210
+ potential_winnings = parseInt(potential_winnings);
1211
+ if (isNaN(potential_winnings)) {
1212
+ return 0;
1213
+ }
1214
+ let cash;
1215
+ if (odds > 0) {
1216
+ var earningsMultiplyer = odds / 100 + 1;
1217
+ cash = potential_winnings / earningsMultiplyer;
1218
+ } else {
1219
+ var earningsMultiplyer = 100 / Math.abs(odds) + 1;
1220
+ cash = potential_winnings / earningsMultiplyer;
1221
+ }
1222
+ return cash;
1223
+ },
1224
+ getNoVigPrice: (prices, market) => {
1225
+ if (!prices || prices.length != 2) {
1226
+ return undefined;
1227
+ }
1228
+ let external_name = prices[0]?.external_name;
1229
+ if (!external_name) {
1230
+ return undefined;
1231
+ }
1232
+ let total_probability = prices.reduce((a, b) => a + b.probability, 0);
1233
+ let vig_pct = total_probability - 1;
1234
+ let trade_side_prob = prices.find(p => p.side == market.trade_side)?.probability;
1235
+ let o_side_prob = prices.find(p => p.side != market.trade_side)?.probability;
1236
+ if (!trade_side_prob || !o_side_prob) {
1237
+ return undefined;
1238
+ }
1239
+ trade_side_prob -= vig_pct * 0.5;
1240
+ o_side_prob -= vig_pct * 0.5;
1241
+ let trade_side_odds = MarketMaketHelpers.calcAmericanOddsFromProbability(trade_side_prob);
1242
+ let o_side_odds = MarketMaketHelpers.calcAmericanOddsFromProbability(o_side_prob);
1243
+ return {
1244
+ external_name,
1245
+ trade_side_prob,
1246
+ o_side_prob,
1247
+ trade_side_odds,
1248
+ o_side_odds
1249
+ };
1250
+ },
1251
+ getAvailableVar1s: (my_orders, available_orders, prices, market, backup_prices) => {
1252
+ let default_var_1 = 0;
1253
+ if (!market.var_1_required) {
1254
+ return {
1255
+ unique_var_1: [0],
1256
+ default_var_1
1257
+ };
1258
+ }
1259
+ let trade_side_my_orders = my_orders.filter(o => o.side == market.trade_side);
1260
+ let o_side_my_orders = my_orders.filter(o => o.side != market.trade_side);
1261
+ if (prices.length == 0 && backup_prices) {
1262
+ prices = backup_prices;
1263
+ }
1264
+ let trade_side_avail = available_orders.filter(o => o.side == market.trade_side);
1265
+ let o_side_avail = available_orders.filter(o => o.side != market.trade_side);
1266
+ let trade_side_prices = prices.filter(p => p.side == market.trade_side);
1267
+ let o_side_prices = prices.filter(p => p.side != market.trade_side);
1268
+ let trade_side_var_1 = trade_side_my_orders.map(o => o.var_1).concat(trade_side_avail.map(o => o.var_1)).concat(trade_side_prices.map(p => p.var_1));
1269
+ let o_side_var_1 = o_side_my_orders.map(o => o.var_1).concat(o_side_avail.map(a => a.var_1)).concat(o_side_prices.map(p => p.var_1));
1270
+ if (market.type == 'Spread') {
1271
+ o_side_var_1 = o_side_var_1.map(var_1 => var_1 * -1);
1272
+ }
1273
+ let all_var_1 = trade_side_var_1.concat(o_side_var_1);
1274
+ let unique_var_1 = [...new Set(all_var_1.map(var_1 => var_1))];
1275
+
1276
+ //Grade latest my order
1277
+ let my_order = my_orders.filter(o => o.status == 'approved').sort((a, b) => moment(b.create_datetime).unix() - moment(a.create_datetime).unix())[0];
1278
+ if (my_order) {
1279
+ default_var_1 = my_order.var_1;
1280
+ //Determin if we need to swap
1281
+ if (my_order.side != market.trade_side && market.type == 'Spread') {
1282
+ default_var_1 = default_var_1 * -1;
1283
+ }
1284
+ } else {
1285
+ let price = trade_side_prices[0];
1286
+ if (price) {
1287
+ default_var_1 = price.var_1;
1288
+ } else if (unique_var_1[0]) {
1289
+ default_var_1 = unique_var_1[0];
1290
+ }
1291
+ }
1292
+ return {
1293
+ unique_var_1,
1294
+ default_var_1
1295
+ };
1296
+ },
1297
+ filterByVar1: (var_1, my_orders, available_orders, prices, market, side_type, side_id, backup_prices) => {
1298
+ let o_var_1 = market.type == 'Spread' ? var_1 * -1 : var_1;
1299
+ let trade_side_my_orders = my_orders.filter(o => o.side == market.trade_side && o.var_1 == var_1);
1300
+ let o_side_my_orders = my_orders.filter(o => o.side != market.trade_side && o.var_1 == o_var_1);
1301
+ let trade_side_avail = available_orders.filter(o => o.side == market.trade_side && o.var_1 == var_1);
1302
+ let o_side_avail = available_orders.filter(o => o.side != market.trade_side && o.var_1 == o_var_1);
1303
+ let trade_side_prices = prices.filter(p => p.side == market.trade_side && p.var_1 == var_1);
1304
+ let o_side_prices = prices.filter(p => p.side != market.trade_side && p.var_1 == o_var_1);
1305
+ if (trade_side_prices.length == 0 && backup_prices) {
1306
+ trade_side_prices = backup_prices.filter(p => p.side == market.trade_side && p.var_1 == var_1 && p.market_id == market.market_id);
1307
+ o_side_prices = backup_prices.filter(p => p.side != market.trade_side && p.var_1 == o_var_1 && p.market_id == market.market_id);
1308
+ }
1309
+ if (market.level != 'event') {
1310
+ trade_side_my_orders = trade_side_my_orders.filter(so => so.side_type == side_type && so.side_id == side_id);
1311
+ o_side_my_orders = o_side_my_orders.filter(so => so.side_type == side_type && so.side_id == side_id);
1312
+ trade_side_avail = trade_side_avail.filter(ts => ts.side_type == side_type && ts.side_id == side_id);
1313
+ o_side_avail = o_side_avail.filter(os => os.side_type == side_type && os.side_id == side_id);
1314
+ trade_side_prices = trade_side_prices.filter(tsp => tsp.participant_type == side_type && tsp.participant_id == side_id);
1315
+ o_side_prices = o_side_prices.filter(osp => osp.participant_type == side_type && osp.participant_id == side_id);
1316
+ }
1317
+ return {
1318
+ var_1_orders: trade_side_my_orders.concat(o_side_my_orders),
1319
+ var_1_available: trade_side_avail.concat(o_side_avail),
1320
+ var_1_prices: trade_side_prices.concat(o_side_prices)
1321
+ };
1322
+ },
1323
+ calcPotentialWinnings: (amt, odds) => {
1324
+ if (odds > 0) {
1325
+ var earningsMultiplyer = odds / 100 + 1;
1326
+ return earningsMultiplyer * amt;
1327
+ } else {
1328
+ var earningsMultiplyer = 100 / Math.abs(odds) + 1;
1329
+ return earningsMultiplyer * amt;
1330
+ }
1331
+ },
1332
+ calcProbabilityFromOdds: odds => {
1333
+ let prob;
1334
+ if (odds < 0) {
1335
+ odds = Math.abs(odds);
1336
+ prob = odds / (odds + 100) * 100;
1337
+ return prob / 100;
1338
+ } else {
1339
+ prob = 100 / (odds + 100) * 100;
1340
+ return prob / 100;
1341
+ }
1342
+ },
1343
+ getAvailableSideIds: (my_orders, available_orders, prices, market) => {
1344
+ let default_side_id = '0';
1345
+ if (!['athlete', 'team', 'exotic'].includes(market.level)) {
1346
+ return {
1347
+ side_type: market.level,
1348
+ unique_side_ids: [],
1349
+ default_side_id
1350
+ };
1351
+ }
1352
+ let o_sides = my_orders.map(o => o.side_id);
1353
+ let avail_sides = available_orders.map(o => o.side_id);
1354
+ let price_sides = prices.map(p => p.participant_id);
1355
+ let unique_side_ids = o_sides.concat(avail_sides).concat(price_sides);
1356
+ unique_side_ids = [...new Set(unique_side_ids.map(id => id))];
1357
+ let my_order = my_orders[0];
1358
+ if (my_order) {
1359
+ default_side_id = my_order.side_id;
1360
+ } else if (available_orders[0]) {
1361
+ default_side_id = available_orders[0].side_id;
1362
+ } else if (prices[0]) {
1363
+ default_side_id = prices[0].participant_id;
1364
+ }
1365
+ return {
1366
+ side_type: market.level,
1367
+ unique_side_ids,
1368
+ default_side_id
1369
+ };
232
1370
  }
233
1371
  };
234
1372
  //# sourceMappingURL=index.js.map