be-components 2.4.7 → 2.4.9

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 (134) hide show
  1. package/lib/commonjs/LocationTracker/LocationStatus.js.map +1 -1
  2. package/lib/commonjs/LocationTracker/api/index.js +14 -0
  3. package/lib/commonjs/LocationTracker/api/index.js.map +1 -1
  4. package/lib/commonjs/MarketComponents/components/TeamEventMarket/index.js +91 -3
  5. package/lib/commonjs/MarketComponents/components/TeamEventMarket/index.js.map +1 -1
  6. package/lib/commonjs/MarketMaker/api/index.js +1307 -0
  7. package/lib/commonjs/MarketMaker/api/index.js.map +1 -0
  8. package/lib/commonjs/MarketMaker/components/Contest.js +150 -0
  9. package/lib/commonjs/MarketMaker/components/Contest.js.map +1 -0
  10. package/lib/commonjs/MarketMaker/components/ContestMarkets.js +300 -0
  11. package/lib/commonjs/MarketMaker/components/ContestMarkets.js.map +1 -0
  12. package/lib/commonjs/MarketMaker/components/ContestSelector.js +111 -0
  13. package/lib/commonjs/MarketMaker/components/ContestSelector.js.map +1 -0
  14. package/lib/commonjs/MarketMaker/components/Dashboard.js +164 -0
  15. package/lib/commonjs/MarketMaker/components/Dashboard.js.map +1 -0
  16. package/lib/commonjs/MarketMaker/components/FundActions.js +232 -0
  17. package/lib/commonjs/MarketMaker/components/FundActions.js.map +1 -0
  18. package/lib/commonjs/MarketMaker/components/FundOwnershipList.js +94 -0
  19. package/lib/commonjs/MarketMaker/components/FundOwnershipList.js.map +1 -0
  20. package/lib/commonjs/MarketMaker/components/FundSelector.js +99 -0
  21. package/lib/commonjs/MarketMaker/components/FundSelector.js.map +1 -0
  22. package/lib/commonjs/MarketMaker/components/FundingRequestList.js +112 -0
  23. package/lib/commonjs/MarketMaker/components/FundingRequestList.js.map +1 -0
  24. package/lib/commonjs/MarketMaker/components/ManageFundForm.js +122 -0
  25. package/lib/commonjs/MarketMaker/components/ManageFundForm.js.map +1 -0
  26. package/lib/commonjs/MarketMaker/components/MarketSelector.js +81 -0
  27. package/lib/commonjs/MarketMaker/components/MarketSelector.js.map +1 -0
  28. package/lib/commonjs/MarketMaker/components/SetMarketForm.js +305 -0
  29. package/lib/commonjs/MarketMaker/components/SetMarketForm.js.map +1 -0
  30. package/lib/commonjs/MarketMaker/components/WeightProgress.js +40 -0
  31. package/lib/commonjs/MarketMaker/components/WeightProgress.js.map +1 -0
  32. package/lib/commonjs/MarketMaker/index.js +452 -0
  33. package/lib/commonjs/MarketMaker/index.js.map +1 -0
  34. package/lib/commonjs/SocialComponents/api/index.js +0 -1
  35. package/lib/commonjs/SocialComponents/api/index.js.map +1 -1
  36. package/lib/commonjs/index.js +7 -0
  37. package/lib/commonjs/index.js.map +1 -1
  38. package/lib/commonjs/types.d.js +4 -0
  39. package/lib/module/LocationTracker/LocationStatus.js.map +1 -1
  40. package/lib/module/LocationTracker/api/index.js +14 -0
  41. package/lib/module/LocationTracker/api/index.js.map +1 -1
  42. package/lib/module/MarketComponents/components/TeamEventMarket/index.js +91 -3
  43. package/lib/module/MarketComponents/components/TeamEventMarket/index.js.map +1 -1
  44. package/lib/module/MarketMaker/api/index.js +1301 -0
  45. package/lib/module/MarketMaker/api/index.js.map +1 -0
  46. package/lib/module/MarketMaker/components/Contest.js +143 -0
  47. package/lib/module/MarketMaker/components/Contest.js.map +1 -0
  48. package/lib/module/MarketMaker/components/ContestMarkets.js +291 -0
  49. package/lib/module/MarketMaker/components/ContestMarkets.js.map +1 -0
  50. package/lib/module/MarketMaker/components/ContestSelector.js +102 -0
  51. package/lib/module/MarketMaker/components/ContestSelector.js.map +1 -0
  52. package/lib/module/MarketMaker/components/Dashboard.js +155 -0
  53. package/lib/module/MarketMaker/components/Dashboard.js.map +1 -0
  54. package/lib/module/MarketMaker/components/FundActions.js +223 -0
  55. package/lib/module/MarketMaker/components/FundActions.js.map +1 -0
  56. package/lib/module/MarketMaker/components/FundOwnershipList.js +87 -0
  57. package/lib/module/MarketMaker/components/FundOwnershipList.js.map +1 -0
  58. package/lib/module/MarketMaker/components/FundSelector.js +92 -0
  59. package/lib/module/MarketMaker/components/FundSelector.js.map +1 -0
  60. package/lib/module/MarketMaker/components/FundingRequestList.js +105 -0
  61. package/lib/module/MarketMaker/components/FundingRequestList.js.map +1 -0
  62. package/lib/module/MarketMaker/components/ManageFundForm.js +113 -0
  63. package/lib/module/MarketMaker/components/ManageFundForm.js.map +1 -0
  64. package/lib/module/MarketMaker/components/MarketSelector.js +74 -0
  65. package/lib/module/MarketMaker/components/MarketSelector.js.map +1 -0
  66. package/lib/module/MarketMaker/components/SetMarketForm.js +297 -0
  67. package/lib/module/MarketMaker/components/SetMarketForm.js.map +1 -0
  68. package/lib/module/MarketMaker/components/WeightProgress.js +33 -0
  69. package/lib/module/MarketMaker/components/WeightProgress.js.map +1 -0
  70. package/lib/module/MarketMaker/index.js +442 -0
  71. package/lib/module/MarketMaker/index.js.map +1 -0
  72. package/lib/module/SocialComponents/api/index.js +0 -1
  73. package/lib/module/SocialComponents/api/index.js.map +1 -1
  74. package/lib/module/index.js +2 -1
  75. package/lib/module/index.js.map +1 -1
  76. package/lib/module/types.d.js +1 -1
  77. package/lib/typescript/src/LocationTracker/LocationStatus.d.ts.map +1 -1
  78. package/lib/typescript/src/LocationTracker/api/index.d.ts.map +1 -1
  79. package/lib/typescript/src/MarketComponents/components/TeamEventMarket/index.d.ts +2 -2
  80. package/lib/typescript/src/MarketComponents/components/TeamEventMarket/index.d.ts.map +1 -1
  81. package/lib/typescript/src/MarketComponents/index.d.ts +2 -2
  82. package/lib/typescript/src/MarketComponents/index.d.ts.map +1 -1
  83. package/lib/typescript/src/MarketMaker/api/index.d.ts +131 -0
  84. package/lib/typescript/src/MarketMaker/api/index.d.ts.map +1 -0
  85. package/lib/typescript/src/MarketMaker/components/Contest.d.ts +25 -0
  86. package/lib/typescript/src/MarketMaker/components/Contest.d.ts.map +1 -0
  87. package/lib/typescript/src/MarketMaker/components/ContestMarkets.d.ts +26 -0
  88. package/lib/typescript/src/MarketMaker/components/ContestMarkets.d.ts.map +1 -0
  89. package/lib/typescript/src/MarketMaker/components/ContestSelector.d.ts +19 -0
  90. package/lib/typescript/src/MarketMaker/components/ContestSelector.d.ts.map +1 -0
  91. package/lib/typescript/src/MarketMaker/components/Dashboard.d.ts +25 -0
  92. package/lib/typescript/src/MarketMaker/components/Dashboard.d.ts.map +1 -0
  93. package/lib/typescript/src/MarketMaker/components/FundActions.d.ts +12 -0
  94. package/lib/typescript/src/MarketMaker/components/FundActions.d.ts.map +1 -0
  95. package/lib/typescript/src/MarketMaker/components/FundOwnershipList.d.ts +9 -0
  96. package/lib/typescript/src/MarketMaker/components/FundOwnershipList.d.ts.map +1 -0
  97. package/lib/typescript/src/MarketMaker/components/FundSelector.d.ts +13 -0
  98. package/lib/typescript/src/MarketMaker/components/FundSelector.d.ts.map +1 -0
  99. package/lib/typescript/src/MarketMaker/components/FundingRequestList.d.ts +11 -0
  100. package/lib/typescript/src/MarketMaker/components/FundingRequestList.d.ts.map +1 -0
  101. package/lib/typescript/src/MarketMaker/components/ManageFundForm.d.ts +10 -0
  102. package/lib/typescript/src/MarketMaker/components/ManageFundForm.d.ts.map +1 -0
  103. package/lib/typescript/src/MarketMaker/components/MarketSelector.d.ts +12 -0
  104. package/lib/typescript/src/MarketMaker/components/MarketSelector.d.ts.map +1 -0
  105. package/lib/typescript/src/MarketMaker/components/SetMarketForm.d.ts +15 -0
  106. package/lib/typescript/src/MarketMaker/components/SetMarketForm.d.ts.map +1 -0
  107. package/lib/typescript/src/MarketMaker/components/WeightProgress.d.ts +10 -0
  108. package/lib/typescript/src/MarketMaker/components/WeightProgress.d.ts.map +1 -0
  109. package/lib/typescript/src/MarketMaker/index.d.ts +7 -0
  110. package/lib/typescript/src/MarketMaker/index.d.ts.map +1 -0
  111. package/lib/typescript/src/SocialComponents/api/index.d.ts.map +1 -1
  112. package/lib/typescript/src/index.d.ts +2 -1
  113. package/lib/typescript/src/index.d.ts.map +1 -1
  114. package/package.json +1 -1
  115. package/src/LocationTracker/LocationStatus.tsx +0 -1
  116. package/src/LocationTracker/api/index.tsx +16 -0
  117. package/src/MarketComponents/components/TeamEventMarket/index.tsx +54 -4
  118. package/src/MarketMaker/api/index.ts +1023 -0
  119. package/src/MarketMaker/components/Contest.tsx +106 -0
  120. package/src/MarketMaker/components/ContestMarkets.tsx +174 -0
  121. package/src/MarketMaker/components/ContestSelector.tsx +84 -0
  122. package/src/MarketMaker/components/Dashboard.tsx +112 -0
  123. package/src/MarketMaker/components/FundActions.tsx +149 -0
  124. package/src/MarketMaker/components/FundOwnershipList.tsx +54 -0
  125. package/src/MarketMaker/components/FundSelector.tsx +65 -0
  126. package/src/MarketMaker/components/FundingRequestList.tsx +71 -0
  127. package/src/MarketMaker/components/ManageFundForm.tsx +83 -0
  128. package/src/MarketMaker/components/MarketSelector.tsx +50 -0
  129. package/src/MarketMaker/components/SetMarketForm.tsx +213 -0
  130. package/src/MarketMaker/components/WeightProgress.tsx +25 -0
  131. package/src/MarketMaker/index.tsx +378 -0
  132. package/src/SocialComponents/api/index.ts +0 -1
  133. package/src/index.tsx +2 -1
  134. package/src/types.d.ts +135 -0
@@ -0,0 +1,1023 @@
1
+ import axios from "axios";
2
+ import { APIOverrides } from "../../ApiOverrides";
3
+ import type { AthleteProps, BestAvailableOrderProps, BestAvailableResponseProps, EventOrderStatProps, EventProps, ExternalPriceProps, FundingRequestProps, FundOrderProps, FundOwnershipProps, FundProps, HedgedPositionProps, HedgeProps, LeagueProps, MarketProps, MarketSideOptionProps, MatchProps, OrderProps, PositionProps, PublicPlayerProps, SortedContestProps, TeamProps, TournamentProps, TradeProps } from "../../types";
4
+ import moment from "moment-mini";
5
+ import Colors from "../../constants/colors";
6
+
7
+ let EVENT_SVC_API = '';
8
+ let MK_SVC_API = '';
9
+ let AUTH_SVC_API = '';
10
+
11
+ export { MarketMakerApi, MarketMaketHelpers }
12
+
13
+ const MarketMakerApi = {
14
+ setEnvironment: () => {
15
+ const endpoints = APIOverrides.getEndpoints();
16
+ EVENT_SVC_API = endpoints['EVENT_SVC_API'] as string;
17
+ MK_SVC_API = endpoints['MK_SVC_API'] as string;
18
+ AUTH_SVC_API = endpoints['AUTH_SVC_API'] as string;
19
+ },
20
+ getPlayersByIds: async(player_ids:string[]):Promise<PublicPlayerProps[]> => {
21
+ try {
22
+ if(player_ids.length == 0){ return [] }
23
+ const resp = await axios.post(`${AUTH_SVC_API}/v1/players/bulk/get`, { player_ids })
24
+ return resp.data.players
25
+ } catch (e) {
26
+ console.log(e)
27
+ return []
28
+ }
29
+ },
30
+ getMyActiveFunds: async(offset:number):Promise<FundProps[]> => {
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:string, minimum_investment:number, market_type: string):Promise<FundProps | undefined> => {
40
+ try {
41
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/fund/create`, { name, minimum_investment, market_type });
42
+ return resp.data.fund
43
+ } catch (e) {
44
+ console.log(e)
45
+ return undefined
46
+ }
47
+ },
48
+ udpateFundName: async(fund_id:string, name:string):Promise<FundProps | undefined> => {
49
+ try {
50
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/fund/update/name`, { fund_id, name });
51
+ return resp.data.fund
52
+ } catch (e) {
53
+ console.log(e)
54
+ return undefined
55
+ }
56
+ },
57
+ udpateFundMinimum: async(fund_id:string, minimum_investment:string):Promise<FundProps | undefined> => {
58
+ try {
59
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/fund/update/min`, { fund_id, minimum_investment });
60
+ return resp.data.fund
61
+ } catch (e) {
62
+ console.log(e)
63
+ return undefined
64
+ }
65
+ },
66
+ getFundById: async(fund_id:string):Promise<undefined | { fund:FundProps, orders:OrderProps[], fund_ownerships:FundOwnershipProps[], fund_orders:FundOrderProps[] }> => {
67
+ try {
68
+ const resp = await axios.get(`${MK_SVC_API}/v1/funds/fund/${fund_id}`);
69
+ return resp.data
70
+ } catch (e) {
71
+ console.log(e)
72
+ return undefined
73
+ }
74
+ },
75
+ getFundingRequestsByFundId: async(fund_id:string):Promise<FundingRequestProps[]> => {
76
+ try {
77
+ const resp = await axios.get(`${MK_SVC_API}/v1/funds/requests/fund/${fund_id}`);
78
+ return resp.data.funding_requests
79
+ } catch (e) {
80
+ console.log(e);
81
+ return []
82
+ }
83
+ },
84
+ depositRequest: async(fund_id:string, amount:number):Promise<FundProps | undefined> => {
85
+ try {
86
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/deposit/request/create`, { fund_id, amount })
87
+ return resp.data.fund
88
+ } catch (e) {
89
+ console.log(e)
90
+ return undefined
91
+ }
92
+ },
93
+ approveRequest: async(funding_request_id:string):Promise<{ fund:FundProps, funding_request:FundingRequestProps, fund_ownerships:FundOwnershipProps[] } | undefined> => {
94
+ try {
95
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/deposit/request/approve`, { funding_request_id })
96
+ return resp.data
97
+ } catch (e) {
98
+ console.log(e)
99
+ return undefined
100
+ }
101
+ },
102
+ declineRequest: async(funding_request_id:string):Promise<FundingRequestProps | undefined> => {
103
+ try {
104
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/deposit/request/decline`, { funding_request_id })
105
+ return resp.data.funding_request
106
+ } catch (e) {
107
+ console.log(e)
108
+ return undefined
109
+ }
110
+ },
111
+ workCapital: async(fund_id:string, amount:number):Promise<{ fund:FundProps, orders:OrderProps[] } | undefined> => {
112
+ try {
113
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/capital/work`, { fund_id, amount })
114
+ return resp.data
115
+ } catch (e) {
116
+ console.log(e)
117
+ return undefined
118
+ }
119
+ },
120
+ layoffCapital: async(fund_id:string, amount:number):Promise<{ fund:FundProps, orders:OrderProps[] } | undefined> => {
121
+ try {
122
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/capital/layoff`, { fund_id, amount })
123
+ return resp.data
124
+ } catch (e) {
125
+ console.log(e)
126
+ return undefined
127
+ }
128
+ },
129
+ addOrdersToFund:async(fund_id:string, orders:OrderProps[]):Promise<OrderProps[]> => {
130
+ try {
131
+ const resp = await axios.post(`${MK_SVC_API}/v1/funds/fund/orders/add`, { fund_id, orders })
132
+ console.log(resp.data);
133
+ return resp.data.orders
134
+ } catch (e) {
135
+ return []
136
+ }
137
+ },
138
+ getLeagues: async():Promise<LeagueProps[]> => {
139
+ try {
140
+ const resp = await axios.get(`${EVENT_SVC_API}/v1/leagues`);
141
+ return resp.data.leagues
142
+ } catch (e) {
143
+ return []
144
+ }
145
+ },
146
+ getMarkets: async():Promise<MarketProps[]> => {
147
+ try {
148
+ const resp = await axios.get(`${MK_SVC_API}/v1/markets/all`);
149
+ return resp.data.markets
150
+ } catch (e) {
151
+ return []
152
+ }
153
+ },
154
+ getMyAction: async():Promise<OrderProps[]> => {
155
+ try {
156
+ const resp = await axios.get(`${MK_SVC_API}/v1/orders/action/me`);
157
+ return resp.data.orders
158
+ } catch (e) {
159
+ return []
160
+ }
161
+ },
162
+ getActiveEvents: async():Promise<EventProps[]> => {
163
+ try {
164
+ const resp = await axios.get(`${EVENT_SVC_API}/v1/events/active?expanded=true`);
165
+ return resp.data.events
166
+ } catch (e) {
167
+ return []
168
+ }
169
+ },
170
+ getEventsByEventIds: async(event_ids:string[]):Promise<EventProps[]> => {
171
+ if(event_ids.length == 0){ return [] }
172
+ try {
173
+ const resp = await axios.post(`${EVENT_SVC_API}/v1/events/bulk/get`, { attribute:'event_id', values: event_ids })
174
+ return resp.data.events
175
+ } catch (e) {
176
+ return []
177
+ }
178
+ },
179
+ getBestAvailableOrders: async():Promise<BestAvailableResponseProps> => {
180
+ try {
181
+ const resp = await axios.get(`${MK_SVC_API}/v1/orders/available`)
182
+ return resp.data
183
+ } catch (e) {
184
+ return { events: [], tournaments: [], matches:[] }
185
+ }
186
+ },
187
+ getPricesByEvents: async(event_type:string, event_ids:string[]):Promise<ExternalPriceProps[]> => {
188
+ if(event_ids.length == 0){ return [] }
189
+ try {
190
+ const resp = await axios.post(`${EVENT_SVC_API}/v1/prices/latest/bulk/get`, { event_type, event_ids });
191
+ return resp.data.prices
192
+ } catch (e) {
193
+ console.log(e);
194
+ return []
195
+ }
196
+ },
197
+ getPricesByEvent: async(event_id:string, event_type:string):Promise<ExternalPriceProps[]> => {
198
+ try {
199
+ const resp = await axios.get(`${EVENT_SVC_API}/v1/prices/latest/${event_id}/${event_type}`);
200
+ return resp.data.prices
201
+ } catch (e) {
202
+ console.log(e);
203
+ return []
204
+ }
205
+ },
206
+ getLatestTradesByEvents: async(event_type: string, event_ids:string[]) => {
207
+ try {
208
+ if(event_ids.length == 0){ return [] }
209
+ const resp = await axios.post(`${MK_SVC_API}/v1/trades/event/latest/bulk/get`, { event_type, event_ids })
210
+ return resp.data.trades
211
+ } catch (e) {
212
+ console.log(e)
213
+ return []
214
+ }
215
+ },
216
+ cancelOrders: async(order_ids:string[]):Promise<OrderProps[]> => {
217
+ if(order_ids.length == 0){ return [] }
218
+ try {
219
+ const resp = await axios.post(`${MK_SVC_API}/v1/orders/bulk/cancel`, { order_ids });
220
+ return resp.data.orders
221
+ } catch (e) {
222
+ alert('Unable to process cancellation')
223
+ return []
224
+ }
225
+ }
226
+ }
227
+
228
+ const MarketMaketHelpers = {
229
+ getOrderStats:(orders:OrderProps[]) => {
230
+ let called_amt = 0, open_amt = 0, open_potential_winnings = 0, stake_amt = 0, stake_potential_winnings = 0
231
+ let open_probability = 0, open_odds = 0, cash_rcvd = 0, delayed_cash = 0, winnings = 0, net_winnings = 0, commission = 0
232
+ let stake_earnings = 0
233
+ orders.map(o => {
234
+ if(o.status == 'approved'){
235
+ open_amt += o.open_amt
236
+ open_potential_winnings += o.potential_winnings
237
+ }
238
+ called_amt += o.called_amt
239
+ if(o.positions){
240
+ o.positions.map((p) => {
241
+ stake_amt += p.stake
242
+ stake_potential_winnings += p.potential_winnings
243
+ cash_rcvd += p.cash_rcvd
244
+ delayed_cash += p.delayed_cash
245
+ winnings += p.winnings
246
+ net_winnings += p.net_winnings
247
+ commission += p.commission
248
+ })
249
+ }
250
+ })
251
+ stake_earnings = stake_potential_winnings - stake_amt
252
+ if(open_potential_winnings > 0){
253
+ open_probability = open_amt / open_potential_winnings
254
+ open_odds = MarketMaketHelpers.calcAmericanOddsFromProbability(open_probability);
255
+ }
256
+ return { open_amt, stake_earnings, open_odds, called_amt, open_potential_winnings, stake_amt, stake_potential_winnings, open_probability, cash_rcvd, delayed_cash, winnings, net_winnings, commission }
257
+ },
258
+ getWeight: (o_side_potential_winnings: number, trade_side_potential_winnings:number, market:MarketProps) => {
259
+ const total = o_side_potential_winnings + trade_side_potential_winnings;
260
+ let weighted_pct = 0;
261
+ const difference = trade_side_potential_winnings - o_side_potential_winnings;
262
+ const direction = difference > 0 ? market.trade_side : difference == 0 ? 'neutral' : market.side_options.find(so => so.side != market.trade_side)?.side;
263
+
264
+ if(total > 0){
265
+ weighted_pct = difference / total
266
+ }
267
+ return { direction, weighted_pct, difference }
268
+ },
269
+ sortContests: (events:EventProps[], tournaments:TournamentProps[], matches:MatchProps[], markets:MarketProps[]):SortedContestProps[] => {
270
+ let contests:SortedContestProps[] = []
271
+ events.map(e => {
272
+ let e_markets = e.supported_markets ? markets.filter(m => e.supported_markets?.map(sm => sm.market_id.toString()).includes(m.market_id.toString())) : []
273
+ contests.push({
274
+ league_id: e.league_id,
275
+ id: e.event_id,
276
+ title: e.event_title,
277
+ contest_type: 'team',
278
+ time_detail: e.time_detail == 'scheduled' ? moment(e.scheduled_datetime).format('MMM DD : hh:mm a'): e.time_detail ?? '',
279
+ scheduled_datetime: moment(e.scheduled_datetime),
280
+ markets: e_markets
281
+ })
282
+ })
283
+ tournaments.map(t => {
284
+ let t_markets = t.supported_markets ? markets.filter(m => t.supported_markets?.map(sm => sm.market_id.toString()).includes(m.market_id.toString())) : []
285
+
286
+ contests.push({ markets: t_markets, league_id: t.league_id, id: t.tournament_id, title: t.tournament_name, contest_type: 'tournament', time_detail: moment(t.scheduled_datetime).format('MMM DD : hh:mm a'), scheduled_datetime: moment(t.scheduled_datetime) })
287
+ })
288
+ matches.map(m => {
289
+ const tourney = tournaments.find(t => t.tournament_id == m.tournament_id);
290
+ let m_markets = m.supported_markets ? markets.filter(mk => m.supported_markets?.map(sm => sm.market_id.toString()).includes(mk.market_id.toString())) : []
291
+ contests.push({ markets:m_markets, league_id:tourney?.league_id, id: m.match_id, title: m.match_title, contest_type: 'match', time_detail: moment(m.scheduled_datetime).format('MMM DD : hh:mm a'), scheduled_datetime: moment(m.scheduled_datetime) })
292
+ })
293
+ return contests
294
+ },
295
+ calcAmericanOddsFromProbability: (probability:number) => {
296
+ let p = probability*100; //Convert to whole number
297
+ if (p >= 100){ return -99999 }
298
+ if(p === 0){ return 9999 }
299
+ if(p === 50){ return 100 }
300
+ if(p < 50){
301
+ return (100/(p/100))-100
302
+ }
303
+ return (p/(1-(p/100)))*-1
304
+ },
305
+ getSelectableMarkets: (events:EventProps[], tournaments:TournamentProps[], matches:MatchProps[], markets:MarketProps[]):MarketProps[] => {
306
+ let market_ids:string[] = []
307
+ events.map(e => {
308
+ if(e.supported_markets){
309
+ market_ids = market_ids.concat(e.supported_markets.map(sm => sm.market_id))
310
+ }
311
+ });
312
+ tournaments.map(e => {
313
+ if(e.supported_markets){
314
+ market_ids = market_ids.concat(e.supported_markets.map(sm => sm.market_id))
315
+ }
316
+ })
317
+ matches.map(e => {
318
+ if(e.supported_markets){
319
+ market_ids = market_ids.concat(e.supported_markets.map(sm => sm.market_id))
320
+ }
321
+ })
322
+ market_ids = [ ...new Set(market_ids.map(id => id.toString())) ]
323
+ return markets.filter(m => market_ids.includes(m.market_id.toString()))
324
+ },
325
+ getMarketDataFromBestAvailable: (ba:BestAvailableResponseProps):{ updated:boolean, latest_trades:TradeProps[], event_order_stats:EventOrderStatProps[], available_orders:BestAvailableOrderProps[] } => {
326
+ let updated = false;
327
+ let event_order_stats:EventOrderStatProps[] = []
328
+ let available_orders:BestAvailableOrderProps[] = []
329
+ let latest_trades:TradeProps[] = []
330
+ ba.events.map(ba_event => {
331
+ if(!ba_event.supported_markets){ return }
332
+ updated = true
333
+ ba_event.supported_markets.map(sm => {
334
+ if(sm.available_orders){ available_orders = available_orders.concat(sm.available_orders) }
335
+ if(sm.order_stats){ event_order_stats = event_order_stats.concat(sm.order_stats) }
336
+ if(sm.latest_trades){ latest_trades = latest_trades.concat(sm.latest_trades) }
337
+ })
338
+ })
339
+
340
+ ba.tournaments.map(ba_event => {
341
+ if(!ba_event.supported_markets){ return }
342
+ updated = true
343
+ ba_event.supported_markets.map(sm => {
344
+ if(sm.available_orders){ available_orders = available_orders.concat(sm.available_orders) }
345
+ if(sm.order_stats){ event_order_stats = event_order_stats.concat(sm.order_stats) }
346
+ if(sm.latest_trades){ latest_trades = latest_trades.concat(sm.latest_trades) }
347
+ })
348
+ })
349
+
350
+ ba.matches.map(ba_event => {
351
+ if(!ba_event.supported_markets){ return }
352
+ updated = true
353
+ ba_event.supported_markets.map(sm => {
354
+ if(sm.available_orders){ available_orders = available_orders.concat(sm.available_orders) }
355
+ if(sm.order_stats){ event_order_stats = event_order_stats.concat(sm.order_stats) }
356
+ if(sm.latest_trades){ latest_trades = latest_trades.concat(sm.latest_trades) }
357
+ })
358
+ })
359
+ return { updated, event_order_stats, available_orders, latest_trades }
360
+ },
361
+ getSideMarketData : (orders:OrderProps[], best_available_orders:BestAvailableOrderProps[], trades:TradeProps[], market:MarketProps, side_type?:string, side_id?:string) => {
362
+ console.log(side_type, side_id)
363
+ let trade_side_orders = orders.filter(o => o.side == market.trade_side);
364
+ let o_side_orders = orders.filter(o => o.side != market.trade_side);
365
+ let trade_side_ba = best_available_orders.find(o => o.side == market.trade_side);
366
+ let o_side_ba = best_available_orders.find(o => o.side != market.trade_side)
367
+ let trade_side_trades = trades.filter(t => t.side == market.trade_side);
368
+ let o_side_trades = trades.filter(t => t.side != market.trade_side);
369
+ const o_side = market.side_options.find(so => so.side != market.trade_side)?.side
370
+ return { trade_side:market.trade_side, o_side, trade_side_orders, o_side_orders, trade_side_ba, o_side_ba, trade_side_trades, o_side_trades }
371
+ },
372
+ getOrderColor: (order:OrderProps | BestAvailableOrderProps) => {
373
+ if(!order.grade){ return Colors.shades.shade600 }
374
+ if(order.grade > 98){ return Colors.highlights.highlight400Faded }
375
+ return Colors.highlights.highlight300Faded
376
+ },
377
+ getOrderFromTrade: (trade:TradeProps, unit_size?:number, ba_order_id?:string):OrderProps => {
378
+ let open_amt = 10
379
+ if(unit_size){ open_amt = unit_size }
380
+ let draft_liquidity = 0
381
+ if(trade.draft_liquidity){ draft_liquidity = trade.draft_liquidity }
382
+ return {
383
+ order_id: '',
384
+ player_id: '',
385
+ be_type: 'market', //TODO - Make this dynamic,
386
+ open_amt,
387
+ called_amt: 0,
388
+ buy_sell_ind: 'buy',
389
+ rejections:0,
390
+ commission_pct:0,
391
+ available_for_parlays: false,
392
+ event_id: trade.event_id,
393
+ draft_liquidity,
394
+ event_type: trade.event_type,
395
+ side: trade.side as 'home'|'away'|'over'|'under'|'yes'|'no',
396
+ side_type: trade.side_type as 'team' | 'side' | 'athlete',
397
+ resolution_status: 'inprogress',
398
+ side_id: trade.side_id,
399
+ order_type: trade.limit_override ? 'limit': 'market',
400
+ potential_winnings: 0,
401
+ collar_pct: .01,
402
+ positions: [],
403
+ market_id: trade.market_id,
404
+ title: '',
405
+ probability: trade.probability,
406
+ odds: trade.odds,
407
+ var_1: trade.var_1,
408
+ market_type: trade.market_type,
409
+ position_ids: [],
410
+ status: 'approved',
411
+ expire_datetime: moment().add(1, 'hours'),
412
+ reference_order_id:ba_order_id
413
+ }
414
+ },
415
+ getTeamEventSideIds:(event:EventProps, market:MarketProps, side_option:MarketSideOptionProps, athlete?:AthleteProps, team?:TeamProps) => {
416
+ const o_side = market.side_options.find(so => so.side != side_option.side);
417
+ if(!o_side){ return undefined }
418
+ switch(side_option.id_source){
419
+ case 'side':
420
+ return { side_id: side_option.side, reversed_side_id: o_side.side }
421
+ case 'athlete':
422
+ if(!athlete){ return undefined }
423
+ return { side_id: athlete.athlete_id, reversed_side_id: athlete.athlete_id }
424
+ case 'team':
425
+ if(market.level == 'event'){
426
+ let side_id = event[side_option.side as keyof EventProps]?.team_id
427
+ let reversed_side_id = event[o_side.side as keyof EventProps]?.team_id
428
+ if(!side_id || !reversed_side_id){ return undefined }
429
+ return { side_id, reversed_side_id }
430
+ }
431
+ if(market.level == 'team'){
432
+ if(!team){ return undefined }
433
+ return { side_id: team.team_id, reversed_side_id: team.team_id }
434
+ }
435
+ return undefined
436
+ default: return undefined
437
+ }
438
+ },
439
+ getTournamentSideIds: (market:MarketProps, side_option:MarketSideOptionProps, athlete?:AthleteProps, team?:TeamProps) => {
440
+ const o_side = market.side_options.find(so => so.side != side_option.side);
441
+ if(!o_side){ return undefined }
442
+ switch(side_option.id_source){
443
+ case 'side':
444
+ return { side_id: side_option.side, reversed_side_id: o_side.side }
445
+ case 'athlete':
446
+ if(!athlete){ return undefined }
447
+ return { side_id: athlete.athlete_id, reversed_side_id: athlete.athlete_id }
448
+ case 'team':
449
+ if(market.level == 'team'){
450
+ if(!team){ return undefined }
451
+ return { side_id: team.team_id, reversed_side_id: team.team_id }
452
+ }
453
+ return undefined
454
+ default: return undefined
455
+ }
456
+ },
457
+ getTradeFromAvailableOrder : (ba:BestAvailableOrderProps, reversed_side_id:string):TradeProps => {
458
+ return {
459
+ trade_id:'',
460
+ event_id: ba.event_id,
461
+ event_type: ba.event_type as 'tournament'|'team'|'match',
462
+ cumulative_amt: 0,
463
+ trade_amt: 0,
464
+ create_datetime: '', last_update_datetime: '',
465
+ market_id: ba.market_id,
466
+ var_1: ba.var_1,
467
+ side: ba.side,
468
+ side_id: ba.side_id,
469
+ draft_liquidity: ba.open_amt,
470
+ reversed_side_id,
471
+ probability: ba.probability,
472
+ odds: ba.odds,
473
+ side_type: ba.side_type as 'team'|'athlete'|'side',
474
+ market_type: 'FOR_MONEY',
475
+ latest: true,
476
+ position_ids: []
477
+ }
478
+ },
479
+ reverseBAOrder: (order:BestAvailableOrderProps, market:MarketProps, side_id:string):BestAvailableOrderProps | undefined => {
480
+ const side_option = market.side_options.find(so => so.side != order.side);
481
+ if(!side_option){ return undefined }
482
+ return {
483
+ ...order,
484
+ side: side_option.side,
485
+ side_id: side_id,
486
+ odds: order.odds * -1,
487
+ var_1: market.type == 'Spread' ? order.var_1 * -1 : order.var_1,
488
+ probability: 1 - order.probability,
489
+ title: '',
490
+ open_amt: 0,
491
+ called_amt: 0,
492
+ potential_winnings: 0
493
+ }
494
+ },
495
+ getTradeFromPrice:(price:ExternalPriceProps, reversed_side_id:string):TradeProps => {
496
+ return {
497
+ trade_id:'',
498
+ event_type: price.event_type as TradeProps['event_type'],
499
+ trade_amt: 0,
500
+ side_type: price.participant_type as TradeProps['side_type'],
501
+ cumulative_amt: 0,
502
+ side: price.side,
503
+ odds: price.odds,
504
+ reversed_side_id: reversed_side_id,
505
+ probability: price.probability,
506
+ side_id: price.participant_id,
507
+ position_ids: [],
508
+ market_type:'FOR_MONEY',
509
+ market_id: price.market_id,
510
+ event_id: price.event_id,
511
+ var_1: price.var_1,
512
+ latest:true,
513
+ create_datetime:'',
514
+ last_update_datetime:''
515
+ }
516
+ },
517
+ getVisibleTrade: (default_price_view:'best_available'|'last_trade', market:MarketProps, side_option:MarketSideOptionProps, latest_trades:TradeProps[], best_available_orders:BestAvailableOrderProps[], side_id:string, reversed_side_id:string) => {
518
+ const order = best_available_orders.find(o => o.market_id == market.market_id && o.side == side_option.side && o.show);
519
+ const o_side_order = best_available_orders.find(o => o.market_id == market.market_id && o.side != side_option.side && o.show);
520
+ let trade = latest_trades.find(t => t.market_type == 'FOR_MONEY' && t.market_id == market.market_id && t.side == side_option.side);
521
+ switch(default_price_view){
522
+ case 'best_available':
523
+ if(order){ return MarketMaketHelpers.getTradeFromAvailableOrder(order, reversed_side_id) }
524
+ if(o_side_order){
525
+ //Now lets reverse this order and get a trade for it
526
+ const reversed_order = MarketMaketHelpers.reverseBAOrder(o_side_order, market, side_id);
527
+ if(!reversed_order){ return undefined }
528
+ return MarketMaketHelpers.getTradeFromAvailableOrder(reversed_order, reversed_side_id)
529
+ }
530
+ if(trade){ return trade }
531
+ return undefined
532
+ case 'last_trade':
533
+ if(trade){ return trade }
534
+ return undefined
535
+ default: return undefined
536
+ }
537
+ },
538
+ getHedgesFromPositions: (orders:OrderProps[], markets:MarketProps[]) => {
539
+ //1) Set up arrays to store hedges
540
+ let hedges:HedgeProps[] = []
541
+ let hedgeable_positions:Array<OrderProps[]> = []
542
+ //Only allow real money orders for hedging
543
+ orders = orders.filter(o => o.market_type === 'FOR_MONEY' && o.resolution_status !== 'closed')
544
+
545
+ //2) Get the unique markets (and common var_1s) that are eligible to be hedged
546
+ let orders_with_positions = orders.filter(o => o.positions[0])
547
+ let unique_markets = [ ...new Set(orders_with_positions.map(o => `${o.event_id}:${o.event_type}:${o.market_id}:${Math.abs(o.var_1)}`)) ]
548
+
549
+ //3) For each unique market and var_1 combo, determin if there are positions on the opposite side of each other
550
+ //If so, then store them into an array of orders
551
+ unique_markets.map(id => {
552
+ //1) Get orders that are associated with the market
553
+ let market_orders = orders_with_positions.filter(o => `${o.event_id}:${o.event_type}:${o.market_id}:${Math.abs(o.var_1)}` == id)
554
+ if(market_orders.length < 2){ return } //Impossible to hedge with less than 2 orders
555
+ let unique_sides = [ ...new Set(market_orders.map(o => o.side)) ]
556
+ if(unique_sides.length < 0){ return } //Must have more than 1 side
557
+
558
+ hedgeable_positions.push(market_orders)
559
+ })
560
+
561
+ //Return nothing if there are no hedgeable positions
562
+ if(hedgeable_positions.length === 0){ return [] }
563
+
564
+ //Awesome! We have some hedgeable positions
565
+ hedgeable_positions.map(hp => {
566
+ if(!hp[0]){ return }
567
+ //Get an empty hedge object to store our hedges
568
+ let hedge = MarketMaketHelpers.getEmptyHedge()
569
+ let market = markets.find(m => m.market_id == hp[0]?.market_id)
570
+ if(!market){ return } //Error out if there is no market
571
+ if(market.level !== 'event'){ return } //Dont if level is not event
572
+
573
+ let trade_side_orders = hp.filter(o => o.side == market?.trade_side)
574
+ let o_side_orders = hp.filter(o => o.side != market?.trade_side)
575
+
576
+ //New
577
+ if(market.type == 'Spread'){
578
+ if(!trade_side_orders[0]){ return } //Make sure there is at least 1 trade side order
579
+ let trade_side_o = trade_side_orders[0]
580
+ if(!trade_side_o){ return }
581
+ o_side_orders = o_side_orders.filter(o => o.var_1 == trade_side_o.var_1 * -1)
582
+ }
583
+
584
+ if(trade_side_orders.length === 0 || o_side_orders.length === 0){ return }
585
+
586
+
587
+
588
+ hedge.market_id = market.market_id
589
+ hedge.market_type = hp[0].market_type
590
+ hedge.var_1 = Math.abs(hp[0].var_1)
591
+ hedge.player_id = hp[0].player_id
592
+ hedge.event_id = hp[0].event_id
593
+ hedge.event_type = hp[0].event_type
594
+ hedge.market_id = hp[0].market_id
595
+
596
+
597
+
598
+ //Set up arrays to store the positions on each side of the hedge
599
+ let trade_side_positions:PositionProps[] = []
600
+ let o_side_positions:PositionProps[] = []
601
+ trade_side_orders.map(o => {
602
+ trade_side_positions = trade_side_positions.concat(o.positions)
603
+ })
604
+ o_side_orders.map(o => {
605
+ o_side_positions = o_side_positions.concat(o.positions)
606
+ })
607
+
608
+ //Calculate the winnings from each outcome (side a wins, side b wins, or draw)
609
+ let trade_side_pot_winnings = trade_side_positions.reduce((a,b) => a + b.potential_winnings, 0)
610
+ let o_side_pot_winnings = o_side_positions.reduce((a,b) => a + b.potential_winnings, 0)
611
+ let draw_winnings = trade_side_positions.concat(o_side_positions).reduce((a,b) => a + b.stake, 0)
612
+
613
+ //Get the minimum payout possible of the 3 outcomes which is the hedged amount
614
+ let hedged_amt = Math.min(trade_side_pot_winnings, o_side_pot_winnings)
615
+ if(isNaN(hedged_amt)){ return }
616
+ hedge.hedged_amt = hedged_amt
617
+
618
+ //Now lets cals out hedged positions
619
+ let hedged_positions:HedgedPositionProps[] = []
620
+
621
+ trade_side_positions.map(p => {
622
+ //Need to determine the weight of the position on the total potential winnings and reduce the stake proportionately
623
+ let pct = p.potential_winnings / trade_side_pot_winnings
624
+ //console.log(hedged_amt, pct, p.probability)
625
+ let stake_from_hedge = hedged_amt * pct * p.probability
626
+ hedge.stake_reduction += stake_from_hedge
627
+ let new_stake = p.stake - stake_from_hedge
628
+ hedged_positions.push({
629
+ hedge_id:'',
630
+ hedged_position_id: '',
631
+ position_id: p.position_id,
632
+ original_stake: p.stake,
633
+ new_stake,
634
+ delayed_cash_draw: 0,
635
+ delayed_cash_no_draw: 0,
636
+ original_potential_winnings: p.potential_winnings,
637
+ new_potential_winnings: new_stake / p.probability,
638
+ status: 'pending',
639
+ create_datetime:'',
640
+ last_update_datetime:''
641
+ })
642
+ })
643
+
644
+ o_side_positions.map(p => {
645
+ let pct = p.potential_winnings / o_side_pot_winnings
646
+ let stake_from_hedge = hedged_amt * pct * p.probability
647
+ hedge.stake_reduction += stake_from_hedge
648
+ let new_stake = p.stake - stake_from_hedge
649
+ hedged_positions.push({
650
+ hedge_id:'',
651
+ hedged_position_id: '',
652
+ position_id: p.position_id,
653
+ original_stake: p.stake,
654
+ new_stake,
655
+ delayed_cash_draw: 0,
656
+ delayed_cash_no_draw: 0,
657
+ original_potential_winnings: p.potential_winnings,
658
+ new_potential_winnings: new_stake / p.probability,
659
+ status: 'pending',
660
+ create_datetime:'',
661
+ last_update_datetime:''
662
+ })
663
+ })
664
+
665
+
666
+ //Cash rcvd will be the lower of the hedged amount or the reduction in stake
667
+ let cash_rcvd = Math.min(hedge.stake_reduction, hedged_amt, draw_winnings)
668
+ if(isNaN(cash_rcvd) || cash_rcvd < 0.01){ return }
669
+ hedge.cash_rcvd = cash_rcvd
670
+ let delayed_cash = hedged_amt - hedge.stake_reduction
671
+ let total_og_stake = hedged_positions.reduce((a,b) => a + b.original_stake, 0)
672
+ let delayed_cash_draw = 0, delayed_cash_no_draw = 0;
673
+ if(delayed_cash < 0){
674
+ delayed_cash_draw = delayed_cash * -1
675
+ //hedge.delayed_cash_draw = delayed_cash * -1 //Need to make positive
676
+ } else {
677
+ delayed_cash_no_draw = delayed_cash
678
+ //hedge.delayed_cash_no_draw = delayed_cash
679
+ }
680
+ hedge.delayed_cash_draw = delayed_cash_draw
681
+ hedge.delayed_cash_no_draw = delayed_cash_no_draw
682
+
683
+ hedged_positions.map(hp => {
684
+ let pct_of_total = hp.original_stake / total_og_stake
685
+ hp.delayed_cash_draw = pct_of_total * delayed_cash_draw
686
+ hp.delayed_cash_no_draw = pct_of_total * delayed_cash_no_draw
687
+ return hp
688
+ })
689
+
690
+ hedges.push({ ...hedge, hedged_positions:hedged_positions })
691
+ })
692
+
693
+ return hedges
694
+ },
695
+ getEmptyHedge: ():HedgeProps => {
696
+ return {
697
+ hedge_id: '',
698
+ hedged_amt: 0,
699
+ event_id: '',
700
+ event_type: '',
701
+ market_id: '',
702
+ var_1: 0,
703
+ delayed_cash_draw: 0,
704
+ delayed_cash_no_draw: 0,
705
+ cash_rcvd: 0,
706
+ stake_reduction: 0,
707
+ market_type: 'FOR_MONEY',
708
+ create_datetime: '',
709
+ last_udpate_datetime:'',
710
+ player_id: '',
711
+ status: 'pending'
712
+ }
713
+ },
714
+ getVar1Label: (market:MarketProps, var_1:number, side?:string) => {
715
+ if(side == 'over'){ return `O ${var_1}` }
716
+ if(side == 'under'){ return `U ${var_1}` }
717
+ if(market.type != 'Spread'){ return `${var_1}` }
718
+ if(var_1 < 0){ return `${var_1}` }
719
+ return `+${var_1}`
720
+ },
721
+ getOddsLabel: (odds:number, decimals?:number) => {
722
+ let new_odds = odds.toFixed()
723
+ if(decimals){ new_odds = odds.toFixed(decimals) }
724
+ if(odds < 0){ return `${new_odds}` }
725
+ return `+${new_odds}`
726
+ },
727
+ getOrderTitleForTeamEvent : (order:OrderProps, market:MarketProps, event:EventProps, athlete?:AthleteProps, exotic?:any):string | undefined => {
728
+ let market_side = market.side_options.find(o => o.side == order.side)
729
+ if(!market_side){ return undefined }
730
+ var re = /({.*?})/;
731
+ let parsed_text = market_side.parseable_title.split(re)
732
+ let new_title = '';
733
+ parsed_text.map(t => {
734
+ if(t === ''){ return }
735
+ if(t[0] !== '{'){ return new_title += t }
736
+ let variable = t.slice(1)
737
+ variable = variable.slice(0, variable.length -1)
738
+ switch(variable){
739
+ case 'team':
740
+ let team = event[order.side as keyof EventProps]
741
+ return new_title += team.market_name
742
+ case 'var_1': return new_title += MarketMaketHelpers.getVar1Label(market, order.var_1)
743
+ case 'athlete': return new_title += athlete?.abbr_name
744
+ case 'stat': return new_title += market.stat_label ?? market.stat
745
+ case 'exotic': return new_title += exotic?.name
746
+ default: return
747
+
748
+ }
749
+ })
750
+ return new_title
751
+ },
752
+ getOrderTitleForTournament : (order:OrderProps, market:MarketProps, tournament:TournamentProps, athlete?:AthleteProps, team?:TeamProps):string | undefined => {
753
+ if(!tournament){ return undefined }
754
+ let market_side = market.side_options.find(o => o.side == order.side)
755
+ if(!market_side){ return order.side }
756
+ var re = /({.*?})/;
757
+ let parsed_text = market_side.parseable_title.split(re)
758
+ let new_title = '';
759
+ parsed_text.map(t => {
760
+ if(t === ''){ return }
761
+ if(t[0] !== '{'){ return new_title += t }
762
+ let variable = t.slice(1)
763
+ variable = variable.slice(0, variable.length -1)
764
+ switch(variable){
765
+ case 'team': return new_title += `${team?.market_name} ${team?.name}`
766
+ case 'var_1': return new_title += MarketMaketHelpers.getVar1Label(market, order.var_1)
767
+ case 'athlete': return new_title += athlete?.abbr_name
768
+ case 'stat': return new_title += market.stat
769
+ default: return
770
+
771
+ }
772
+ })
773
+ return new_title
774
+ },
775
+ getOrderTitleForMatch : (order:OrderProps, market:MarketProps, match:MatchProps, athlete?:AthleteProps, team?:TeamProps):string | undefined => {
776
+ if(!match){ return undefined }
777
+ let market_side = market.side_options.find(o => o.side == order.side)
778
+ if(!market_side){ return order.side }
779
+ var re = /({.*?})/;
780
+ let parsed_text = market_side.parseable_title.split(re)
781
+ let new_title = '';
782
+ parsed_text.map(t => {
783
+ if(t === ''){ return }
784
+ if(t[0] !== '{'){ return new_title += t }
785
+ let variable = t.slice(1)
786
+ variable = variable.slice(0, variable.length -1)
787
+ switch(variable){
788
+ case 'team': return new_title += `${team?.market_name} ${team?.name}`
789
+ case 'var_1': return new_title += MarketMaketHelpers.getVar1Label(market, order.var_1)
790
+ case 'athlete': return new_title += athlete?.abbr_name
791
+ case 'stat': return new_title += market.stat
792
+ default: return
793
+
794
+ }
795
+ })
796
+ return new_title
797
+ },
798
+ setMarkets: (fund:FundProps, best_available:BestAvailableOrderProps[], external_prices:ExternalPriceProps[], market:MarketProps, margin:number, event:EventProps) => {
799
+ let orders:OrderProps[] = []
800
+ market.side_options.map(so => {
801
+ let side_id_response = MarketMaketHelpers.getTeamEventSideIds(event, market, so);
802
+ if(!side_id_response){ return }
803
+ let ba = best_available.find(ba => ba.side == so.side)
804
+ let o_ba = best_available.find(ba => ba.side != so.side);
805
+ if(ba && o_ba){
806
+ let ba_trade = MarketMaketHelpers.getTradeFromAvailableOrder(ba, side_id_response.reversed_side_id);
807
+ let ba_order = MarketMaketHelpers.getOrderFromTrade(ba_trade, 10, ba.order_id);
808
+ let ba_title = MarketMaketHelpers.getOrderTitleForTeamEvent(ba_order, market, event);
809
+
810
+ if(!ba_title){ return }
811
+ return orders.push({ ...ba_order, title: ba_title })
812
+ }
813
+ let ep = external_prices.find(p => p.side == so.side);
814
+ let o_ep = external_prices.find(p => p.side != so.side);
815
+ if(ep && o_ep){
816
+ let ep_trade = MarketMaketHelpers.getTradeFromPrice(ep, side_id_response.reversed_side_id);
817
+ let ep_order = MarketMaketHelpers.getOrderFromTrade(ep_trade, 10);
818
+ let ep_title = MarketMaketHelpers.getOrderTitleForTeamEvent(ep_order, market, event);
819
+ if(!ep_title){ return }
820
+ return orders.push({ ...ep_order, title: ep_title })
821
+ }
822
+ return
823
+ })
824
+
825
+ if(orders.length != 2){ return [] }
826
+
827
+ //OK!! Lets figured out the buffer odds!
828
+ let no_vig_trade_price = .5
829
+ let no_vig_o_price = .5
830
+ let no_vig_data = MarketMaketHelpers.getNoVigPrice(external_prices, market);
831
+
832
+ if(no_vig_data){
833
+ no_vig_o_price = no_vig_data.o_side_prob
834
+ no_vig_trade_price = no_vig_data.trade_side_prob
835
+ }
836
+
837
+ //Now lets add a buffer to each one based on the margin provided!
838
+ no_vig_trade_price -= (margin * 0.5)
839
+ let novig_trade_side_odds = Math.round(MarketMaketHelpers.calcAmericanOddsFromProbability(no_vig_trade_price))
840
+
841
+ no_vig_o_price -= (margin * 0.5)
842
+
843
+ let novig_o_side_odds = Math.round(MarketMaketHelpers.calcAmericanOddsFromProbability(no_vig_o_price))
844
+
845
+ //OK!!! Now lets add the propbabilities to the orders!
846
+ let trade_side_order = orders.find(o => o.side == market.trade_side);
847
+ let o_side_order = orders.find(o => o.side != market.trade_side);
848
+ if(!trade_side_order || !o_side_order){ return [] }
849
+
850
+ let higher_probability_order = no_vig_trade_price >= no_vig_o_price ? 'trade' : 'other'
851
+ let trade_side_stake = 0, o_side_stake = 0
852
+ if(higher_probability_order == 'trade'){
853
+ console.log('min was trade side')
854
+ trade_side_stake = fund.working_capital
855
+ //If that is the stake, then the potential winnigns is
856
+ let pot_win = MarketMaketHelpers.calcPotentialWinnings(trade_side_stake, novig_trade_side_odds);
857
+ o_side_stake = MarketMaketHelpers.calcSaleValue(novig_o_side_odds, pot_win);
858
+ } else {
859
+ console.log('min was o side!!')
860
+ o_side_stake = fund.working_capital
861
+ //If that is the stake, then the potential winnigns is
862
+ let pot_win = MarketMaketHelpers.calcPotentialWinnings(o_side_stake, novig_o_side_odds);
863
+ trade_side_stake = MarketMaketHelpers.calcSaleValue(novig_trade_side_odds, pot_win);
864
+ }
865
+
866
+ let o_side_working = o_side_stake / fund.working_capital
867
+ let t_side_working = trade_side_stake / fund.working_capital
868
+
869
+ o_side_order = {
870
+ ...o_side_order,
871
+ probability: no_vig_o_price,
872
+ odds: novig_o_side_odds,
873
+ fulfill_action: 'drain',
874
+ working_pct:o_side_working,
875
+ potential_winnings: MarketMaketHelpers.calcPotentialWinnings(o_side_stake, novig_o_side_odds),
876
+ open_amt: o_side_stake,
877
+ }
878
+ trade_side_order = {
879
+ ...trade_side_order,
880
+ probability: no_vig_trade_price,
881
+ odds: novig_trade_side_odds,
882
+ fulfill_action: 'drain',
883
+ working_pct: t_side_working,
884
+ potential_winnings: MarketMaketHelpers.calcPotentialWinnings(trade_side_stake, novig_trade_side_odds),
885
+ open_amt: trade_side_stake,
886
+ }
887
+
888
+ return [ o_side_order, trade_side_order ]
889
+ },
890
+ calcSaleValue: (odds:number, potential_winnings:number | string) => {
891
+ potential_winnings = parseInt(potential_winnings as string);
892
+ if(isNaN(potential_winnings)){ return 0 }
893
+ let cash;
894
+ if (odds > 0) {
895
+ var earningsMultiplyer = (odds/100) + 1;
896
+ cash = potential_winnings / earningsMultiplyer
897
+ } else {
898
+ var earningsMultiplyer = (100/(Math.abs(odds))) + 1;
899
+ cash = potential_winnings / earningsMultiplyer
900
+ }
901
+ return cash
902
+ },
903
+ getNoVigPrice: (prices:ExternalPriceProps[], market:MarketProps) => {
904
+ if(!prices || prices.length != 2){ return undefined }
905
+ let external_name = prices[0]?.external_name
906
+ if(!external_name){ return undefined }
907
+ let total_probability = prices.reduce((a,b) => a + b.probability, 0);
908
+ let vig_pct = total_probability - 1
909
+ let trade_side_prob = prices.find(p => p.side == market.trade_side)?.probability
910
+ let o_side_prob = prices.find(p => p.side != market.trade_side)?.probability
911
+ if(!trade_side_prob || !o_side_prob){ return undefined }
912
+ trade_side_prob -= (vig_pct * 0.5)
913
+ o_side_prob -= (vig_pct * 0.5)
914
+
915
+ let trade_side_odds = MarketMaketHelpers.calcAmericanOddsFromProbability(trade_side_prob);
916
+ let o_side_odds = MarketMaketHelpers.calcAmericanOddsFromProbability(o_side_prob);
917
+
918
+ return { external_name, trade_side_prob, o_side_prob, trade_side_odds, o_side_odds }
919
+ },
920
+ getAvailableVar1s: (my_orders:OrderProps[], available_orders:BestAvailableOrderProps[], prices:ExternalPriceProps[], market:MarketProps) => {
921
+ let default_var_1 = 0
922
+ if(!market.var_1_required){ return { unique_var_1: [0], default_var_1 } }
923
+ let trade_side_my_orders = my_orders.filter(o => o.side == market.trade_side);
924
+ let o_side_my_orders = my_orders.filter(o => o.side != market.trade_side);
925
+
926
+ let trade_side_avail = available_orders.filter(o => o.side == market.trade_side);
927
+ let o_side_avail = available_orders.filter(o => o.side != market.trade_side);
928
+
929
+ let trade_side_prices = prices.filter(p => p.side == market.trade_side);
930
+ let o_side_prices = prices.filter(p => p.side != market.trade_side);
931
+
932
+ 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));
933
+ 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));
934
+
935
+
936
+
937
+ if(market.type == 'Spread'){
938
+ o_side_var_1 = o_side_var_1.map(var_1 => var_1 * -1)
939
+ }
940
+ let all_var_1 = trade_side_var_1.concat(o_side_var_1)
941
+ let unique_var_1 = [ ... new Set(all_var_1.map(var_1 => var_1))]
942
+
943
+ //Grade latest my order
944
+ let my_order = my_orders.filter(o => o.status == 'approved').sort((a,b) => moment(b.create_datetime).unix() - moment(a.create_datetime).unix())[0]
945
+ if(my_order){
946
+ default_var_1 = my_order.var_1
947
+ //Determin if we need to swap
948
+ if(my_order.side != market.trade_side && market.type == 'Spread'){ default_var_1 = default_var_1 * -1 }
949
+ } else {
950
+ let price = trade_side_prices[0]
951
+ if(price){
952
+ default_var_1 = price.var_1
953
+ } else if(unique_var_1[0]) {
954
+ default_var_1 = unique_var_1[0]
955
+ }
956
+ }
957
+ return { unique_var_1, default_var_1 }
958
+ },
959
+ filterByVar1: (var_1:number, my_orders:OrderProps[], available_orders:BestAvailableOrderProps[], prices:ExternalPriceProps[], market:MarketProps, backup_prices?:ExternalPriceProps[]) => {
960
+
961
+ let o_var_1 = market.type == 'Spread' ? var_1 * -1 : var_1;
962
+
963
+ let trade_side_my_orders = my_orders.filter(o => o.side == market.trade_side && o.var_1 == var_1);
964
+ let o_side_my_orders = my_orders.filter(o => o.side != market.trade_side && o.var_1 == o_var_1);
965
+
966
+ let trade_side_avail = available_orders.filter(o => o.side == market.trade_side && o.var_1 == var_1);
967
+ let o_side_avail = available_orders.filter(o => o.side != market.trade_side && o.var_1 == o_var_1);
968
+
969
+ let trade_side_prices = prices.filter(p => p.side == market.trade_side && p.var_1 == var_1);
970
+ let o_side_prices = prices.filter(p => p.side != market.trade_side && p.var_1 == o_var_1);
971
+
972
+ if(trade_side_prices.length == 0 && backup_prices){
973
+ console.log('in here!!')
974
+ trade_side_prices = backup_prices.filter(p => p.side == market.trade_side && p.var_1 == var_1);
975
+ o_side_prices = backup_prices.filter(p => p.side != market.trade_side && p.var_1 == o_var_1);
976
+ }
977
+
978
+ return { var_1_orders: trade_side_my_orders.concat(o_side_my_orders), var_1_available: trade_side_avail.concat(o_side_avail), var_1_prices: trade_side_prices.concat(o_side_prices) }
979
+
980
+ },
981
+ calcPotentialWinnings : (amt:number, odds:number):number => {
982
+ if (odds > 0) {
983
+ var earningsMultiplyer = ((odds/100) + 1);
984
+ return earningsMultiplyer * amt;
985
+ } else {
986
+ var earningsMultiplyer = ((100/(Math.abs(odds))) + 1);
987
+ return earningsMultiplyer * amt
988
+ }
989
+ },
990
+ calcProbabilityFromOdds : (odds:number) => {
991
+ let prob;
992
+ if(odds < 0) {
993
+ odds = Math.abs(odds)
994
+ prob = odds / (odds + 100) * 100
995
+ return prob / 100
996
+ } else {
997
+ prob = 100 / (odds + 100) * 100
998
+ return prob / 100
999
+ }
1000
+ },
1001
+ getAvailableSideIds: (my_orders:OrderProps[], available_orders:BestAvailableOrderProps[], prices:ExternalPriceProps[], market:MarketProps) => {
1002
+ let default_side_id = '0';
1003
+ if(!['athlete','team','exotic'].includes(market.level)){ return { side_type: market.level, unique_side_ids: [], default_side_id } }
1004
+ let o_sides = my_orders.map(o => o.side_id);
1005
+ let avail_sides = available_orders.map(o => o.side_id);
1006
+ let price_sides = prices.map(p => p.participant_id);
1007
+
1008
+ let unique_side_ids = o_sides.concat(avail_sides).concat(price_sides)
1009
+ unique_side_ids = [ ...new Set(unique_side_ids.map(id => id)) ]
1010
+
1011
+ let my_order = my_orders[0]
1012
+ if(my_order){
1013
+ default_side_id = my_order.side_id
1014
+ } else if(available_orders[0]){
1015
+ default_side_id = available_orders[0].side_id
1016
+ } else if(prices[0]){
1017
+ default_side_id = prices[0].participant_id
1018
+ }
1019
+
1020
+ return { side_type: market.level, unique_side_ids, default_side_id }
1021
+
1022
+ }
1023
+ }