pmxtjs 0.1.0 → 0.1.2

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 (60) hide show
  1. package/{src/BaseExchange.ts → dist/BaseExchange.d.ts} +4 -22
  2. package/dist/BaseExchange.js +30 -0
  3. package/dist/exchanges/Kalshi.d.ts +20 -0
  4. package/{src/exchanges/Kalshi.ts → dist/exchanges/Kalshi.js} +75 -114
  5. package/dist/exchanges/Polymarket.d.ts +38 -0
  6. package/{src/exchanges/Polymarket.ts → dist/exchanges/Polymarket.js} +105 -146
  7. package/{src/index.ts → dist/index.d.ts} +0 -1
  8. package/dist/index.js +20 -0
  9. package/{src/types.ts → dist/types.d.ts} +3 -17
  10. package/dist/types.js +5 -0
  11. package/package.json +9 -1
  12. package/readme.md +62 -0
  13. package/coverage/clover.xml +0 -334
  14. package/coverage/coverage-final.json +0 -4
  15. package/coverage/lcov-report/base.css +0 -224
  16. package/coverage/lcov-report/block-navigation.js +0 -87
  17. package/coverage/lcov-report/favicon.png +0 -0
  18. package/coverage/lcov-report/index.html +0 -131
  19. package/coverage/lcov-report/pmxt/BaseExchange.ts.html +0 -256
  20. package/coverage/lcov-report/pmxt/exchanges/Kalshi.ts.html +0 -1132
  21. package/coverage/lcov-report/pmxt/exchanges/Polymarket.ts.html +0 -1456
  22. package/coverage/lcov-report/pmxt/exchanges/index.html +0 -131
  23. package/coverage/lcov-report/pmxt/index.html +0 -116
  24. package/coverage/lcov-report/prettify.css +0 -1
  25. package/coverage/lcov-report/prettify.js +0 -2
  26. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  27. package/coverage/lcov-report/sorter.js +0 -210
  28. package/coverage/lcov-report/src/BaseExchange.ts.html +0 -256
  29. package/coverage/lcov-report/src/exchanges/Kalshi.ts.html +0 -1132
  30. package/coverage/lcov-report/src/exchanges/Polymarket.ts.html +0 -1456
  31. package/coverage/lcov-report/src/exchanges/index.html +0 -131
  32. package/coverage/lcov-report/src/index.html +0 -116
  33. package/coverage/lcov.info +0 -766
  34. package/examples/get_event_prices.ts +0 -37
  35. package/examples/historical_prices.ts +0 -117
  36. package/examples/orderbook.ts +0 -102
  37. package/examples/recent_trades.ts +0 -29
  38. package/examples/search_events.ts +0 -68
  39. package/examples/search_market.ts +0 -29
  40. package/jest.config.js +0 -11
  41. package/pmxt-0.1.0.tgz +0 -0
  42. package/test/exchanges/kalshi/ApiErrors.test.ts +0 -132
  43. package/test/exchanges/kalshi/EmptyResponse.test.ts +0 -44
  44. package/test/exchanges/kalshi/FetchAndNormalizeMarkets.test.ts +0 -56
  45. package/test/exchanges/kalshi/LiveApi.integration.test.ts +0 -40
  46. package/test/exchanges/kalshi/MarketHistory.test.ts +0 -185
  47. package/test/exchanges/kalshi/OrderBook.test.ts +0 -149
  48. package/test/exchanges/kalshi/SearchMarkets.test.ts +0 -174
  49. package/test/exchanges/kalshi/VolumeFallback.test.ts +0 -44
  50. package/test/exchanges/polymarket/DataValidation.test.ts +0 -271
  51. package/test/exchanges/polymarket/ErrorHandling.test.ts +0 -34
  52. package/test/exchanges/polymarket/FetchAndNormalizeMarkets.test.ts +0 -68
  53. package/test/exchanges/polymarket/GetMarketsBySlug.test.ts +0 -268
  54. package/test/exchanges/polymarket/LiveApi.integration.test.ts +0 -44
  55. package/test/exchanges/polymarket/MarketHistory.test.ts +0 -207
  56. package/test/exchanges/polymarket/OrderBook.test.ts +0 -167
  57. package/test/exchanges/polymarket/RequestParameters.test.ts +0 -39
  58. package/test/exchanges/polymarket/SearchMarkets.test.ts +0 -176
  59. package/test/exchanges/polymarket/TradeHistory.test.ts +0 -248
  60. package/tsconfig.json +0 -12
@@ -1,1456 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/exchanges/Polymarket.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">src/exchanges</a> Polymarket.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">94.79% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>164/173</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">86.79% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>184/212</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">86.95% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>20/23</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">95.03% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>153/161</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line high'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a>
435
- <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a>
437
- <a name='L372'></a><a href='#L372'>372</a>
438
- <a name='L373'></a><a href='#L373'>373</a>
439
- <a name='L374'></a><a href='#L374'>374</a>
440
- <a name='L375'></a><a href='#L375'>375</a>
441
- <a name='L376'></a><a href='#L376'>376</a>
442
- <a name='L377'></a><a href='#L377'>377</a>
443
- <a name='L378'></a><a href='#L378'>378</a>
444
- <a name='L379'></a><a href='#L379'>379</a>
445
- <a name='L380'></a><a href='#L380'>380</a>
446
- <a name='L381'></a><a href='#L381'>381</a>
447
- <a name='L382'></a><a href='#L382'>382</a>
448
- <a name='L383'></a><a href='#L383'>383</a>
449
- <a name='L384'></a><a href='#L384'>384</a>
450
- <a name='L385'></a><a href='#L385'>385</a>
451
- <a name='L386'></a><a href='#L386'>386</a>
452
- <a name='L387'></a><a href='#L387'>387</a>
453
- <a name='L388'></a><a href='#L388'>388</a>
454
- <a name='L389'></a><a href='#L389'>389</a>
455
- <a name='L390'></a><a href='#L390'>390</a>
456
- <a name='L391'></a><a href='#L391'>391</a>
457
- <a name='L392'></a><a href='#L392'>392</a>
458
- <a name='L393'></a><a href='#L393'>393</a>
459
- <a name='L394'></a><a href='#L394'>394</a>
460
- <a name='L395'></a><a href='#L395'>395</a>
461
- <a name='L396'></a><a href='#L396'>396</a>
462
- <a name='L397'></a><a href='#L397'>397</a>
463
- <a name='L398'></a><a href='#L398'>398</a>
464
- <a name='L399'></a><a href='#L399'>399</a>
465
- <a name='L400'></a><a href='#L400'>400</a>
466
- <a name='L401'></a><a href='#L401'>401</a>
467
- <a name='L402'></a><a href='#L402'>402</a>
468
- <a name='L403'></a><a href='#L403'>403</a>
469
- <a name='L404'></a><a href='#L404'>404</a>
470
- <a name='L405'></a><a href='#L405'>405</a>
471
- <a name='L406'></a><a href='#L406'>406</a>
472
- <a name='L407'></a><a href='#L407'>407</a>
473
- <a name='L408'></a><a href='#L408'>408</a>
474
- <a name='L409'></a><a href='#L409'>409</a>
475
- <a name='L410'></a><a href='#L410'>410</a>
476
- <a name='L411'></a><a href='#L411'>411</a>
477
- <a name='L412'></a><a href='#L412'>412</a>
478
- <a name='L413'></a><a href='#L413'>413</a>
479
- <a name='L414'></a><a href='#L414'>414</a>
480
- <a name='L415'></a><a href='#L415'>415</a>
481
- <a name='L416'></a><a href='#L416'>416</a>
482
- <a name='L417'></a><a href='#L417'>417</a>
483
- <a name='L418'></a><a href='#L418'>418</a>
484
- <a name='L419'></a><a href='#L419'>419</a>
485
- <a name='L420'></a><a href='#L420'>420</a>
486
- <a name='L421'></a><a href='#L421'>421</a>
487
- <a name='L422'></a><a href='#L422'>422</a>
488
- <a name='L423'></a><a href='#L423'>423</a>
489
- <a name='L424'></a><a href='#L424'>424</a>
490
- <a name='L425'></a><a href='#L425'>425</a>
491
- <a name='L426'></a><a href='#L426'>426</a>
492
- <a name='L427'></a><a href='#L427'>427</a>
493
- <a name='L428'></a><a href='#L428'>428</a>
494
- <a name='L429'></a><a href='#L429'>429</a>
495
- <a name='L430'></a><a href='#L430'>430</a>
496
- <a name='L431'></a><a href='#L431'>431</a>
497
- <a name='L432'></a><a href='#L432'>432</a>
498
- <a name='L433'></a><a href='#L433'>433</a>
499
- <a name='L434'></a><a href='#L434'>434</a>
500
- <a name='L435'></a><a href='#L435'>435</a>
501
- <a name='L436'></a><a href='#L436'>436</a>
502
- <a name='L437'></a><a href='#L437'>437</a>
503
- <a name='L438'></a><a href='#L438'>438</a>
504
- <a name='L439'></a><a href='#L439'>439</a>
505
- <a name='L440'></a><a href='#L440'>440</a>
506
- <a name='L441'></a><a href='#L441'>441</a>
507
- <a name='L442'></a><a href='#L442'>442</a>
508
- <a name='L443'></a><a href='#L443'>443</a>
509
- <a name='L444'></a><a href='#L444'>444</a>
510
- <a name='L445'></a><a href='#L445'>445</a>
511
- <a name='L446'></a><a href='#L446'>446</a>
512
- <a name='L447'></a><a href='#L447'>447</a>
513
- <a name='L448'></a><a href='#L448'>448</a>
514
- <a name='L449'></a><a href='#L449'>449</a>
515
- <a name='L450'></a><a href='#L450'>450</a>
516
- <a name='L451'></a><a href='#L451'>451</a>
517
- <a name='L452'></a><a href='#L452'>452</a>
518
- <a name='L453'></a><a href='#L453'>453</a>
519
- <a name='L454'></a><a href='#L454'>454</a>
520
- <a name='L455'></a><a href='#L455'>455</a>
521
- <a name='L456'></a><a href='#L456'>456</a>
522
- <a name='L457'></a><a href='#L457'>457</a>
523
- <a name='L458'></a><a href='#L458'>458</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">10x</span>
524
- <span class="cline-any cline-yes">10x</span>
525
- <span class="cline-any cline-neutral">&nbsp;</span>
526
- <span class="cline-any cline-neutral">&nbsp;</span>
527
- <span class="cline-any cline-yes">10x</span>
528
- <span class="cline-any cline-neutral">&nbsp;</span>
529
- <span class="cline-any cline-no">&nbsp;</span>
530
- <span class="cline-any cline-neutral">&nbsp;</span>
531
- <span class="cline-any cline-neutral">&nbsp;</span>
532
- <span class="cline-any cline-neutral">&nbsp;</span>
533
- <span class="cline-any cline-yes">66x</span>
534
- <span class="cline-any cline-neutral">&nbsp;</span>
535
- <span class="cline-any cline-yes">66x</span>
536
- <span class="cline-any cline-neutral">&nbsp;</span>
537
- <span class="cline-any cline-neutral">&nbsp;</span>
538
- <span class="cline-any cline-yes">24x</span>
539
- <span class="cline-any cline-yes">24x</span>
540
- <span class="cline-any cline-neutral">&nbsp;</span>
541
- <span class="cline-any cline-neutral">&nbsp;</span>
542
- <span class="cline-any cline-yes">24x</span>
543
- <span class="cline-any cline-neutral">&nbsp;</span>
544
- <span class="cline-any cline-neutral">&nbsp;</span>
545
- <span class="cline-any cline-neutral">&nbsp;</span>
546
- <span class="cline-any cline-neutral">&nbsp;</span>
547
- <span class="cline-any cline-neutral">&nbsp;</span>
548
- <span class="cline-any cline-neutral">&nbsp;</span>
549
- <span class="cline-any cline-neutral">&nbsp;</span>
550
- <span class="cline-any cline-yes">24x</span>
551
- <span class="cline-any cline-yes">2x</span>
552
- <span class="cline-any cline-yes">2x</span>
553
- <span class="cline-any cline-yes">22x</span>
554
- <span class="cline-any cline-no">&nbsp;</span>
555
- <span class="cline-any cline-no">&nbsp;</span>
556
- <span class="cline-any cline-yes">22x</span>
557
- <span class="cline-any cline-neutral">&nbsp;</span>
558
- <span class="cline-any cline-neutral">&nbsp;</span>
559
- <span class="cline-any cline-neutral">&nbsp;</span>
560
- <span class="cline-any cline-neutral">&nbsp;</span>
561
- <span class="cline-any cline-neutral">&nbsp;</span>
562
- <span class="cline-any cline-yes">24x</span>
563
- <span class="cline-any cline-neutral">&nbsp;</span>
564
- <span class="cline-any cline-yes">24x</span>
565
- <span class="cline-any cline-neutral">&nbsp;</span>
566
- <span class="cline-any cline-neutral">&nbsp;</span>
567
- <span class="cline-any cline-neutral">&nbsp;</span>
568
- <span class="cline-any cline-yes">22x</span>
569
- <span class="cline-any cline-yes">22x</span>
570
- <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-yes">22x</span>
572
- <span class="cline-any cline-neutral">&nbsp;</span>
573
- <span class="cline-any cline-neutral">&nbsp;</span>
574
- <span class="cline-any cline-yes">58x</span>
575
- <span class="cline-any cline-neutral">&nbsp;</span>
576
- <span class="cline-any cline-yes">57x</span>
577
- <span class="cline-any cline-yes">238x</span>
578
- <span class="cline-any cline-neutral">&nbsp;</span>
579
- <span class="cline-any cline-neutral">&nbsp;</span>
580
- <span class="cline-any cline-yes">238x</span>
581
- <span class="cline-any cline-yes">238x</span>
582
- <span class="cline-any cline-neutral">&nbsp;</span>
583
- <span class="cline-any cline-yes">238x</span>
584
- <span class="cline-any cline-yes">238x</span>
585
- <span class="cline-any cline-yes">237x</span>
586
- <span class="cline-any cline-neutral">&nbsp;</span>
587
- <span class="cline-any cline-yes">1x</span>
588
- <span class="cline-any cline-neutral">&nbsp;</span>
589
- <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-neutral">&nbsp;</span>
591
- <span class="cline-any cline-yes">238x</span>
592
- <span class="cline-any cline-yes">238x</span>
593
- <span class="cline-any cline-yes">238x</span>
594
- <span class="cline-any cline-neutral">&nbsp;</span>
595
- <span class="cline-any cline-no">&nbsp;</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-neutral">&nbsp;</span>
599
- <span class="cline-any cline-yes">238x</span>
600
- <span class="cline-any cline-yes">238x</span>
601
- <span class="cline-any cline-yes">189x</span>
602
- <span class="cline-any cline-neutral">&nbsp;</span>
603
- <span class="cline-any cline-neutral">&nbsp;</span>
604
- <span class="cline-any cline-yes">238x</span>
605
- <span class="cline-any cline-yes">237x</span>
606
- <span class="cline-any cline-yes">476x</span>
607
- <span class="cline-any cline-neutral">&nbsp;</span>
608
- <span class="cline-any cline-neutral">&nbsp;</span>
609
- <span class="cline-any cline-yes">476x</span>
610
- <span class="cline-any cline-yes">476x</span>
611
- <span class="cline-any cline-yes">189x</span>
612
- <span class="cline-any cline-yes">287x</span>
613
- <span class="cline-any cline-yes">189x</span>
614
- <span class="cline-any cline-neutral">&nbsp;</span>
615
- <span class="cline-any cline-neutral">&nbsp;</span>
616
- <span class="cline-any cline-neutral">&nbsp;</span>
617
- <span class="cline-any cline-neutral">&nbsp;</span>
618
- <span class="cline-any cline-yes">476x</span>
619
- <span class="cline-any cline-yes">476x</span>
620
- <span class="cline-any cline-yes">237x</span>
621
- <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-neutral">&nbsp;</span>
623
- <span class="cline-any cline-yes">476x</span>
624
- <span class="cline-any cline-neutral">&nbsp;</span>
625
- <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-neutral">&nbsp;</span>
627
- <span class="cline-any cline-neutral">&nbsp;</span>
628
- <span class="cline-any cline-neutral">&nbsp;</span>
629
- <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-neutral">&nbsp;</span>
631
- <span class="cline-any cline-neutral">&nbsp;</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-neutral">&nbsp;</span>
634
- <span class="cline-any cline-neutral">&nbsp;</span>
635
- <span class="cline-any cline-yes">238x</span>
636
- <span class="cline-any cline-neutral">&nbsp;</span>
637
- <span class="cline-any cline-neutral">&nbsp;</span>
638
- <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-neutral">&nbsp;</span>
640
- <span class="cline-any cline-neutral">&nbsp;</span>
641
- <span class="cline-any cline-neutral">&nbsp;</span>
642
- <span class="cline-any cline-neutral">&nbsp;</span>
643
- <span class="cline-any cline-neutral">&nbsp;</span>
644
- <span class="cline-any cline-neutral">&nbsp;</span>
645
- <span class="cline-any cline-neutral">&nbsp;</span>
646
- <span class="cline-any cline-neutral">&nbsp;</span>
647
- <span class="cline-any cline-neutral">&nbsp;</span>
648
- <span class="cline-any cline-yes">1196x</span>
649
- <span class="cline-any cline-neutral">&nbsp;</span>
650
- <span class="cline-any cline-neutral">&nbsp;</span>
651
- <span class="cline-any cline-neutral">&nbsp;</span>
652
- <span class="cline-any cline-neutral">&nbsp;</span>
653
- <span class="cline-any cline-neutral">&nbsp;</span>
654
- <span class="cline-any cline-neutral">&nbsp;</span>
655
- <span class="cline-any cline-yes">22x</span>
656
- <span class="cline-any cline-yes">815x</span>
657
- <span class="cline-any cline-yes">20x</span>
658
- <span class="cline-any cline-neutral">&nbsp;</span>
659
- <span class="cline-any cline-yes">20x</span>
660
- <span class="cline-any cline-no">&nbsp;</span>
661
- <span class="cline-any cline-neutral">&nbsp;</span>
662
- <span class="cline-any cline-neutral">&nbsp;</span>
663
- <span class="cline-any cline-yes">100x</span>
664
- <span class="cline-any cline-neutral">&nbsp;</span>
665
- <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-neutral">&nbsp;</span>
667
- <span class="cline-any cline-yes">22x</span>
668
- <span class="cline-any cline-neutral">&nbsp;</span>
669
- <span class="cline-any cline-neutral">&nbsp;</span>
670
- <span class="cline-any cline-yes">2x</span>
671
- <span class="cline-any cline-yes">2x</span>
672
- <span class="cline-any cline-neutral">&nbsp;</span>
673
- <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-neutral">&nbsp;</span>
675
- <span class="cline-any cline-neutral">&nbsp;</span>
676
- <span class="cline-any cline-neutral">&nbsp;</span>
677
- <span class="cline-any cline-neutral">&nbsp;</span>
678
- <span class="cline-any cline-yes">7x</span>
679
- <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-yes">7x</span>
681
- <span class="cline-any cline-neutral">&nbsp;</span>
682
- <span class="cline-any cline-yes">7x</span>
683
- <span class="cline-any cline-neutral">&nbsp;</span>
684
- <span class="cline-any cline-neutral">&nbsp;</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-neutral">&nbsp;</span>
687
- <span class="cline-any cline-neutral">&nbsp;</span>
688
- <span class="cline-any cline-yes">7x</span>
689
- <span class="cline-any cline-yes">7x</span>
690
- <span class="cline-any cline-yes">36x</span>
691
- <span class="cline-any cline-neutral">&nbsp;</span>
692
- <span class="cline-any cline-neutral">&nbsp;</span>
693
- <span class="cline-any cline-neutral">&nbsp;</span>
694
- <span class="cline-any cline-neutral">&nbsp;</span>
695
- <span class="cline-any cline-yes">6x</span>
696
- <span class="cline-any cline-yes">6x</span>
697
- <span class="cline-any cline-neutral">&nbsp;</span>
698
- <span class="cline-any cline-neutral">&nbsp;</span>
699
- <span class="cline-any cline-yes">1x</span>
700
- <span class="cline-any cline-yes">1x</span>
701
- <span class="cline-any cline-neutral">&nbsp;</span>
702
- <span class="cline-any cline-neutral">&nbsp;</span>
703
- <span class="cline-any cline-neutral">&nbsp;</span>
704
- <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-neutral">&nbsp;</span>
706
- <span class="cline-any cline-neutral">&nbsp;</span>
707
- <span class="cline-any cline-neutral">&nbsp;</span>
708
- <span class="cline-any cline-neutral">&nbsp;</span>
709
- <span class="cline-any cline-neutral">&nbsp;</span>
710
- <span class="cline-any cline-yes">12x</span>
711
- <span class="cline-any cline-yes">12x</span>
712
- <span class="cline-any cline-neutral">&nbsp;</span>
713
- <span class="cline-any cline-neutral">&nbsp;</span>
714
- <span class="cline-any cline-neutral">&nbsp;</span>
715
- <span class="cline-any cline-yes">11x</span>
716
- <span class="cline-any cline-yes">11x</span>
717
- <span class="cline-any cline-neutral">&nbsp;</span>
718
- <span class="cline-any cline-neutral">&nbsp;</span>
719
- <span class="cline-any cline-neutral">&nbsp;</span>
720
- <span class="cline-any cline-neutral">&nbsp;</span>
721
- <span class="cline-any cline-neutral">&nbsp;</span>
722
- <span class="cline-any cline-neutral">&nbsp;</span>
723
- <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-yes">9x</span>
725
- <span class="cline-any cline-neutral">&nbsp;</span>
726
- <span class="cline-any cline-yes">9x</span>
727
- <span class="cline-any cline-yes">9x</span>
728
- <span class="cline-any cline-neutral">&nbsp;</span>
729
- <span class="cline-any cline-yes">8x</span>
730
- <span class="cline-any cline-yes">8x</span>
731
- <span class="cline-any cline-yes">8x</span>
732
- <span class="cline-any cline-yes">8x</span>
733
- <span class="cline-any cline-yes">8x</span>
734
- <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-yes">8x</span>
736
- <span class="cline-any cline-yes">8x</span>
737
- <span class="cline-any cline-yes">7x</span>
738
- <span class="cline-any cline-yes">7x</span>
739
- <span class="cline-any cline-yes">1x</span>
740
- <span class="cline-any cline-neutral">&nbsp;</span>
741
- <span class="cline-any cline-yes">8x</span>
742
- <span class="cline-any cline-yes">8x</span>
743
- <span class="cline-any cline-neutral">&nbsp;</span>
744
- <span class="cline-any cline-yes">8x</span>
745
- <span class="cline-any cline-yes">7x</span>
746
- <span class="cline-any cline-yes">14x</span>
747
- <span class="cline-any cline-neutral">&nbsp;</span>
748
- <span class="cline-any cline-yes">14x</span>
749
- <span class="cline-any cline-yes">7x</span>
750
- <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-neutral">&nbsp;</span>
752
- <span class="cline-any cline-yes">14x</span>
753
- <span class="cline-any cline-yes">14x</span>
754
- <span class="cline-any cline-yes">7x</span>
755
- <span class="cline-any cline-neutral">&nbsp;</span>
756
- <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-yes">14x</span>
758
- <span class="cline-any cline-neutral">&nbsp;</span>
759
- <span class="cline-any cline-neutral">&nbsp;</span>
760
- <span class="cline-any cline-neutral">&nbsp;</span>
761
- <span class="cline-any cline-neutral">&nbsp;</span>
762
- <span class="cline-any cline-neutral">&nbsp;</span>
763
- <span class="cline-any cline-neutral">&nbsp;</span>
764
- <span class="cline-any cline-neutral">&nbsp;</span>
765
- <span class="cline-any cline-neutral">&nbsp;</span>
766
- <span class="cline-any cline-neutral">&nbsp;</span>
767
- <span class="cline-any cline-neutral">&nbsp;</span>
768
- <span class="cline-any cline-neutral">&nbsp;</span>
769
- <span class="cline-any cline-yes">8x</span>
770
- <span class="cline-any cline-neutral">&nbsp;</span>
771
- <span class="cline-any cline-neutral">&nbsp;</span>
772
- <span class="cline-any cline-neutral">&nbsp;</span>
773
- <span class="cline-any cline-neutral">&nbsp;</span>
774
- <span class="cline-any cline-neutral">&nbsp;</span>
775
- <span class="cline-any cline-neutral">&nbsp;</span>
776
- <span class="cline-any cline-neutral">&nbsp;</span>
777
- <span class="cline-any cline-neutral">&nbsp;</span>
778
- <span class="cline-any cline-neutral">&nbsp;</span>
779
- <span class="cline-any cline-neutral">&nbsp;</span>
780
- <span class="cline-any cline-neutral">&nbsp;</span>
781
- <span class="cline-any cline-neutral">&nbsp;</span>
782
- <span class="cline-any cline-no">&nbsp;</span>
783
- <span class="cline-any cline-neutral">&nbsp;</span>
784
- <span class="cline-any cline-neutral">&nbsp;</span>
785
- <span class="cline-any cline-neutral">&nbsp;</span>
786
- <span class="cline-any cline-yes">9x</span>
787
- <span class="cline-any cline-neutral">&nbsp;</span>
788
- <span class="cline-any cline-neutral">&nbsp;</span>
789
- <span class="cline-any cline-yes">1x</span>
790
- <span class="cline-any cline-yes">1x</span>
791
- <span class="cline-any cline-neutral">&nbsp;</span>
792
- <span class="cline-any cline-neutral">&nbsp;</span>
793
- <span class="cline-any cline-neutral">&nbsp;</span>
794
- <span class="cline-any cline-neutral">&nbsp;</span>
795
- <span class="cline-any cline-neutral">&nbsp;</span>
796
- <span class="cline-any cline-neutral">&nbsp;</span>
797
- <span class="cline-any cline-neutral">&nbsp;</span>
798
- <span class="cline-any cline-yes">11x</span>
799
- <span class="cline-any cline-neutral">&nbsp;</span>
800
- <span class="cline-any cline-neutral">&nbsp;</span>
801
- <span class="cline-any cline-neutral">&nbsp;</span>
802
- <span class="cline-any cline-neutral">&nbsp;</span>
803
- <span class="cline-any cline-neutral">&nbsp;</span>
804
- <span class="cline-any cline-neutral">&nbsp;</span>
805
- <span class="cline-any cline-neutral">&nbsp;</span>
806
- <span class="cline-any cline-yes">11x</span>
807
- <span class="cline-any cline-neutral">&nbsp;</span>
808
- <span class="cline-any cline-neutral">&nbsp;</span>
809
- <span class="cline-any cline-neutral">&nbsp;</span>
810
- <span class="cline-any cline-neutral">&nbsp;</span>
811
- <span class="cline-any cline-neutral">&nbsp;</span>
812
- <span class="cline-any cline-neutral">&nbsp;</span>
813
- <span class="cline-any cline-neutral">&nbsp;</span>
814
- <span class="cline-any cline-neutral">&nbsp;</span>
815
- <span class="cline-any cline-yes">12x</span>
816
- <span class="cline-any cline-yes">1x</span>
817
- <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-neutral">&nbsp;</span>
819
- <span class="cline-any cline-yes">11x</span>
820
- <span class="cline-any cline-yes">11x</span>
821
- <span class="cline-any cline-yes">11x</span>
822
- <span class="cline-any cline-neutral">&nbsp;</span>
823
- <span class="cline-any cline-neutral">&nbsp;</span>
824
- <span class="cline-any cline-neutral">&nbsp;</span>
825
- <span class="cline-any cline-yes">11x</span>
826
- <span class="cline-any cline-yes">11x</span>
827
- <span class="cline-any cline-neutral">&nbsp;</span>
828
- <span class="cline-any cline-yes">11x</span>
829
- <span class="cline-any cline-neutral">&nbsp;</span>
830
- <span class="cline-any cline-neutral">&nbsp;</span>
831
- <span class="cline-any cline-yes">10x</span>
832
- <span class="cline-any cline-neutral">&nbsp;</span>
833
- <span class="cline-any cline-yes">10x</span>
834
- <span class="cline-any cline-yes">10x</span>
835
- <span class="cline-any cline-neutral">&nbsp;</span>
836
- <span class="cline-any cline-neutral">&nbsp;</span>
837
- <span class="cline-any cline-yes">11x</span>
838
- <span class="cline-any cline-neutral">&nbsp;</span>
839
- <span class="cline-any cline-neutral">&nbsp;</span>
840
- <span class="cline-any cline-neutral">&nbsp;</span>
841
- <span class="cline-any cline-neutral">&nbsp;</span>
842
- <span class="cline-any cline-neutral">&nbsp;</span>
843
- <span class="cline-any cline-neutral">&nbsp;</span>
844
- <span class="cline-any cline-yes">11x</span>
845
- <span class="cline-any cline-neutral">&nbsp;</span>
846
- <span class="cline-any cline-neutral">&nbsp;</span>
847
- <span class="cline-any cline-neutral">&nbsp;</span>
848
- <span class="cline-any cline-yes">10x</span>
849
- <span class="cline-any cline-neutral">&nbsp;</span>
850
- <span class="cline-any cline-neutral">&nbsp;</span>
851
- <span class="cline-any cline-neutral">&nbsp;</span>
852
- <span class="cline-any cline-neutral">&nbsp;</span>
853
- <span class="cline-any cline-yes">10x</span>
854
- <span class="cline-any cline-neutral">&nbsp;</span>
855
- <span class="cline-any cline-yes">10x</span>
856
- <span class="cline-any cline-yes">106x</span>
857
- <span class="cline-any cline-yes">106x</span>
858
- <span class="cline-any cline-neutral">&nbsp;</span>
859
- <span class="cline-any cline-yes">106x</span>
860
- <span class="cline-any cline-neutral">&nbsp;</span>
861
- <span class="cline-any cline-neutral">&nbsp;</span>
862
- <span class="cline-any cline-neutral">&nbsp;</span>
863
- <span class="cline-any cline-neutral">&nbsp;</span>
864
- <span class="cline-any cline-neutral">&nbsp;</span>
865
- <span class="cline-any cline-neutral">&nbsp;</span>
866
- <span class="cline-any cline-neutral">&nbsp;</span>
867
- <span class="cline-any cline-neutral">&nbsp;</span>
868
- <span class="cline-any cline-neutral">&nbsp;</span>
869
- <span class="cline-any cline-neutral">&nbsp;</span>
870
- <span class="cline-any cline-yes">10x</span>
871
- <span class="cline-any cline-yes">1x</span>
872
- <span class="cline-any cline-neutral">&nbsp;</span>
873
- <span class="cline-any cline-neutral">&nbsp;</span>
874
- <span class="cline-any cline-yes">9x</span>
875
- <span class="cline-any cline-neutral">&nbsp;</span>
876
- <span class="cline-any cline-neutral">&nbsp;</span>
877
- <span class="cline-any cline-yes">1x</span>
878
- <span class="cline-any cline-yes">1x</span>
879
- <span class="cline-any cline-yes">1x</span>
880
- <span class="cline-any cline-neutral">&nbsp;</span>
881
- <span class="cline-any cline-no">&nbsp;</span>
882
- <span class="cline-any cline-no">&nbsp;</span>
883
- <span class="cline-any cline-neutral">&nbsp;</span>
884
- <span class="cline-any cline-neutral">&nbsp;</span>
885
- <span class="cline-any cline-neutral">&nbsp;</span>
886
- <span class="cline-any cline-neutral">&nbsp;</span>
887
- <span class="cline-any cline-neutral">&nbsp;</span>
888
- <span class="cline-any cline-neutral">&nbsp;</span>
889
- <span class="cline-any cline-neutral">&nbsp;</span>
890
- <span class="cline-any cline-neutral">&nbsp;</span>
891
- <span class="cline-any cline-yes">9x</span>
892
- <span class="cline-any cline-yes">9x</span>
893
- <span class="cline-any cline-neutral">&nbsp;</span>
894
- <span class="cline-any cline-neutral">&nbsp;</span>
895
- <span class="cline-any cline-neutral">&nbsp;</span>
896
- <span class="cline-any cline-yes">8x</span>
897
- <span class="cline-any cline-neutral">&nbsp;</span>
898
- <span class="cline-any cline-neutral">&nbsp;</span>
899
- <span class="cline-any cline-yes">9x</span>
900
- <span class="cline-any cline-neutral">&nbsp;</span>
901
- <span class="cline-any cline-neutral">&nbsp;</span>
902
- <span class="cline-any cline-yes">6x</span>
903
- <span class="cline-any cline-neutral">&nbsp;</span>
904
- <span class="cline-any cline-yes">9x</span>
905
- <span class="cline-any cline-neutral">&nbsp;</span>
906
- <span class="cline-any cline-neutral">&nbsp;</span>
907
- <span class="cline-any cline-yes">6x</span>
908
- <span class="cline-any cline-neutral">&nbsp;</span>
909
- <span class="cline-any cline-yes">8x</span>
910
- <span class="cline-any cline-neutral">&nbsp;</span>
911
- <span class="cline-any cline-neutral">&nbsp;</span>
912
- <span class="cline-any cline-neutral">&nbsp;</span>
913
- <span class="cline-any cline-neutral">&nbsp;</span>
914
- <span class="cline-any cline-neutral">&nbsp;</span>
915
- <span class="cline-any cline-neutral">&nbsp;</span>
916
- <span class="cline-any cline-yes">1x</span>
917
- <span class="cline-any cline-yes">1x</span>
918
- <span class="cline-any cline-neutral">&nbsp;</span>
919
- <span class="cline-any cline-neutral">&nbsp;</span>
920
- <span class="cline-any cline-neutral">&nbsp;</span>
921
- <span class="cline-any cline-neutral">&nbsp;</span>
922
- <span class="cline-any cline-neutral">&nbsp;</span>
923
- <span class="cline-any cline-neutral">&nbsp;</span>
924
- <span class="cline-any cline-neutral">&nbsp;</span>
925
- <span class="cline-any cline-neutral">&nbsp;</span>
926
- <span class="cline-any cline-neutral">&nbsp;</span>
927
- <span class="cline-any cline-neutral">&nbsp;</span>
928
- <span class="cline-any cline-neutral">&nbsp;</span>
929
- <span class="cline-any cline-neutral">&nbsp;</span>
930
- <span class="cline-any cline-neutral">&nbsp;</span>
931
- <span class="cline-any cline-yes">14x</span>
932
- <span class="cline-any cline-yes">1x</span>
933
- <span class="cline-any cline-neutral">&nbsp;</span>
934
- <span class="cline-any cline-neutral">&nbsp;</span>
935
- <span class="cline-any cline-yes">13x</span>
936
- <span class="cline-any cline-yes">13x</span>
937
- <span class="cline-any cline-neutral">&nbsp;</span>
938
- <span class="cline-any cline-neutral">&nbsp;</span>
939
- <span class="cline-any cline-neutral">&nbsp;</span>
940
- <span class="cline-any cline-neutral">&nbsp;</span>
941
- <span class="cline-any cline-yes">13x</span>
942
- <span class="cline-any cline-yes">1x</span>
943
- <span class="cline-any cline-neutral">&nbsp;</span>
944
- <span class="cline-any cline-yes">13x</span>
945
- <span class="cline-any cline-yes">1x</span>
946
- <span class="cline-any cline-neutral">&nbsp;</span>
947
- <span class="cline-any cline-neutral">&nbsp;</span>
948
- <span class="cline-any cline-yes">13x</span>
949
- <span class="cline-any cline-neutral">&nbsp;</span>
950
- <span class="cline-any cline-neutral">&nbsp;</span>
951
- <span class="cline-any cline-neutral">&nbsp;</span>
952
- <span class="cline-any cline-neutral">&nbsp;</span>
953
- <span class="cline-any cline-yes">11x</span>
954
- <span class="cline-any cline-neutral">&nbsp;</span>
955
- <span class="cline-any cline-yes">111x</span>
956
- <span class="cline-any cline-neutral">&nbsp;</span>
957
- <span class="cline-any cline-neutral">&nbsp;</span>
958
- <span class="cline-any cline-neutral">&nbsp;</span>
959
- <span class="cline-any cline-neutral">&nbsp;</span>
960
- <span class="cline-any cline-neutral">&nbsp;</span>
961
- <span class="cline-any cline-neutral">&nbsp;</span>
962
- <span class="cline-any cline-neutral">&nbsp;</span>
963
- <span class="cline-any cline-neutral">&nbsp;</span>
964
- <span class="cline-any cline-yes">11x</span>
965
- <span class="cline-any cline-yes">2x</span>
966
- <span class="cline-any cline-neutral">&nbsp;</span>
967
- <span class="cline-any cline-neutral">&nbsp;</span>
968
- <span class="cline-any cline-yes">9x</span>
969
- <span class="cline-any cline-neutral">&nbsp;</span>
970
- <span class="cline-any cline-neutral">&nbsp;</span>
971
- <span class="cline-any cline-yes">2x</span>
972
- <span class="cline-any cline-yes">1x</span>
973
- <span class="cline-any cline-yes">1x</span>
974
- <span class="cline-any cline-neutral">&nbsp;</span>
975
- <span class="cline-any cline-yes">1x</span>
976
- <span class="cline-any cline-yes">1x</span>
977
- <span class="cline-any cline-neutral">&nbsp;</span>
978
- <span class="cline-any cline-neutral">&nbsp;</span>
979
- <span class="cline-any cline-neutral">&nbsp;</span>
980
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import axios from 'axios';
981
- import { PredictionMarketExchange, MarketFilterParams, HistoryFilterParams } from '../BaseExchange';
982
- import { UnifiedMarket, MarketOutcome, PriceCandle, CandleInterval, OrderBook, Trade } from '../types';
983
- &nbsp;
984
- export class PolymarketExchange extends PredictionMarketExchange {
985
- <span class="fstat-no" title="function not covered" > get n</span>ame(): string {
986
- <span class="cstat-no" title="statement not covered" > return 'Polymarket';</span>
987
- }
988
- &nbsp;
989
- // Utilizing the Gamma API for rich metadata and list view data
990
- private readonly baseUrl = 'https://gamma-api.polymarket.com/events';
991
- // CLOB API for orderbook, trades, and timeseries
992
- private readonly clobUrl = 'https://clob.polymarket.com';
993
- &nbsp;
994
- async fetchMarkets(params?: MarketFilterParams): Promise&lt;UnifiedMarket[]&gt; {
995
- const limit = params?.limit || 200; // Higher default for better coverage
996
- const offset = params?.offset || 0;
997
- &nbsp;
998
- // Map generic sort params to Polymarket Gamma API params
999
- let queryParams: any = {
1000
- active: 'true',
1001
- closed: 'false',
1002
- limit: limit,
1003
- offset: offset,
1004
- };
1005
- &nbsp;
1006
- // Gamma API uses 'order' and 'ascending' for sorting
1007
- if (params?.sort === 'volume') {
1008
- queryParams.order = 'volume';
1009
- queryParams.ascending = 'false';
1010
- } else <span class="missing-if-branch" title="if path not taken" >I</span>if (params?.sort === 'newest') {
1011
- <span class="cstat-no" title="statement not covered" > queryParams.order = 'startDate';</span>
1012
- <span class="cstat-no" title="statement not covered" > queryParams.ascending = 'false';</span>
1013
- } else <span class="missing-if-branch" title="if path not taken" >I</span>if (params?.sort === 'liquidity') {
1014
- // queryParams.order = 'liquidity';
1015
- } else {
1016
- // Default: do not send order param to avoid 422
1017
- }
1018
- &nbsp;
1019
- try {
1020
- // Fetch active events from Gamma
1021
- const response = await axios.get(this.baseUrl, {
1022
- params: queryParams
1023
- });
1024
- &nbsp;
1025
- const events = response.data;
1026
- const unifiedMarkets: UnifiedMarket[] = [];
1027
- &nbsp;
1028
- for (const event of events) {
1029
- // Each event is a container (e.g. "US Election").
1030
- // It contains specific "markets" (e.g. "Winner", "Pop Vote").
1031
- if (!event.markets) continue;
1032
- &nbsp;
1033
- for (const market of event.markets) {
1034
- const outcomes: MarketOutcome[] = [];
1035
- &nbsp;
1036
- // Polymarket Gamma often returns 'outcomes' and 'outcomePrices' as stringified JSON keys.
1037
- let outcomeLabels: string[] = [];
1038
- let outcomePrices: string[] = [];
1039
- &nbsp;
1040
- try {
1041
- outcomeLabels = typeof market.outcomes === 'string' ? JSON.parse(market.outcomes) : (market.outcomes || <span class="branch-1 cbranch-no" title="branch not covered" >[])</span>;
1042
- outcomePrices = typeof market.outcomePrices === 'string' ? JSON.parse(market.outcomePrices) : (market.outcomePrices || []);
1043
- } catch (e) {
1044
- console.warn(`Failed to parse outcomes for market ${market.id}`, e);
1045
- }
1046
- &nbsp;
1047
- // Extract CLOB token IDs for granular operations
1048
- let clobTokenIds: string[] = [];
1049
- try {
1050
- clobTokenIds = typeof market.clobTokenIds === 'string' ? JSON.parse(market.clobTokenIds) : (market.clobTokenIds || []);
1051
- } catch (e) {
1052
- <span class="cstat-no" title="statement not covered" > console.warn(`Failed to parse clobTokenIds for market ${market.id}`, e);</span>
1053
- }
1054
- &nbsp;
1055
- // Extract candidate/option name from market question for better outcome labels
1056
- let candidateName: string | null = null;
1057
- if (market.question &amp;&amp; market.groupItemTitle) {
1058
- candidateName = market.groupItemTitle;
1059
- }
1060
- &nbsp;
1061
- if (outcomeLabels.length &gt; 0) {
1062
- outcomeLabels.forEach((label: string, index: number) =&gt; {
1063
- const rawPrice = outcomePrices[index] || "0";
1064
- &nbsp;
1065
- // For Yes/No markets with specific candidates, use the candidate name
1066
- let outcomeLabel = label;
1067
- if (candidateName &amp;&amp; label.toLowerCase() === 'yes') {
1068
- outcomeLabel = candidateName;
1069
- } else if (candidateName &amp;&amp; label.toLowerCase() === 'no') {
1070
- outcomeLabel = `Not ${candidateName}`;
1071
- }
1072
- &nbsp;
1073
- // 24h Price Change
1074
- // Polymarket API provides 'oneDayPriceChange' on the market object
1075
- let priceChange = 0;
1076
- if (index === 0 || label.toLowerCase() === 'yes' || (candidateName &amp;&amp; label === candidateName)) {
1077
- priceChange = Number(market.oneDayPriceChange || 0);
1078
- }
1079
- &nbsp;
1080
- outcomes.push({
1081
- id: String(index),
1082
- label: outcomeLabel,
1083
- price: parseFloat(rawPrice) || 0,
1084
- priceChange24h: priceChange,
1085
- metadata: {
1086
- clobTokenId: clobTokenIds[index]
1087
- }
1088
- });
1089
- });
1090
- }
1091
- &nbsp;
1092
- unifiedMarkets.push({
1093
- id: market.id,
1094
- title: market.question ? `${event.title} - ${market.question}` : <span class="branch-1 cbranch-no" title="branch not covered" >event.title,</span>
1095
- description: market.description || event.description,
1096
- outcomes: outcomes,
1097
- resolutionDate: market.endDate ? new Date(market.endDate) : (market.end_date_iso ? <span class="branch-0 cbranch-no" title="branch not covered" >new Date(market.end_date_iso) </span>: new Date()),
1098
- volume24h: Number(market.volume24hr || market.volume_24h || 0),
1099
- volume: Number(market.volume || 0),
1100
- liquidity: Number(market.liquidity || market.rewards?.liquidity || 0),
1101
- openInterest: Number(market.openInterest || market.open_interest || 0),
1102
- url: `https://polymarket.com/event/${event.slug}`,
1103
- image: event.image || market.image || `https://polymarket.com/api/og?slug=${event.slug}`,
1104
- category: event.category || event.tags?.[0]?.label,
1105
- tags: event.tags?.map((t: any) =&gt; t.label) || []
1106
- });
1107
- }
1108
- }
1109
- &nbsp;
1110
- // Client-side Sort capability to ensure contract fulfillment
1111
- // Often API filters are "good effort" or apply to the 'event' but not the 'market'
1112
- if (params?.sort === 'volume') {
1113
- unifiedMarkets.sort((a, b) =&gt; b.volume24h - a.volume24h);
1114
- } else <span class="missing-if-branch" title="if path not taken" >I</span>if (params?.sort === 'newest') {
1115
- // unifiedMarkets.sort((a, b) =&gt; b.resolutionDate.getTime() - a.resolutionDate.getTime()); // Not quite 'newest'
1116
- } else <span class="missing-if-branch" title="if path not taken" >I</span>if (params?.sort === 'liquidity') {
1117
- <span class="cstat-no" title="statement not covered" > unifiedMarkets.sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; <span class="cstat-no" title="statement not covered" >b.liquidity - a.liquidity)</span>;</span>
1118
- } else {
1119
- // Default volume sort
1120
- unifiedMarkets.sort((a, b) =&gt; b.volume24h - a.volume24h);
1121
- }
1122
- &nbsp;
1123
- // Respect limit strictly after flattening
1124
- return unifiedMarkets.slice(0, limit);
1125
- &nbsp;
1126
- } catch (error) {
1127
- console.error("Error fetching Polymarket data:", error);
1128
- return [];
1129
- }
1130
- }
1131
- &nbsp;
1132
- async searchMarkets(query: string, params?: MarketFilterParams): Promise&lt;UnifiedMarket[]&gt; {
1133
- // Polymarket Gamma API doesn't support native search
1134
- // Fetch a larger batch and filter client-side
1135
- const searchLimit = 100; // Fetch more markets to search through
1136
- &nbsp;
1137
- try {
1138
- // Fetch markets with a higher limit
1139
- const markets = await this.fetchMarkets({
1140
- ...params,
1141
- limit: searchLimit
1142
- });
1143
- &nbsp;
1144
- // Client-side text filtering
1145
- const lowerQuery = query.toLowerCase();
1146
- const filtered = markets.filter(market =&gt;
1147
- market.title.toLowerCase().includes(lowerQuery) ||
1148
- market.description.toLowerCase().includes(lowerQuery)
1149
- );
1150
- &nbsp;
1151
- // Apply limit to filtered results
1152
- const limit = params?.limit || 20;
1153
- return filtered.slice(0, limit);
1154
- &nbsp;
1155
- } catch (error) {
1156
- console.error("Error searching Polymarket data:", error);
1157
- return [];
1158
- }
1159
- }
1160
- &nbsp;
1161
- /**
1162
- * Fetch specific markets by their URL slug.
1163
- * Useful for looking up a specific event from a URL.
1164
- * @param slug - The event slug (e.g. "will-fed-cut-rates-in-march")
1165
- */
1166
- async getMarketsBySlug(slug: string): Promise&lt;UnifiedMarket[]&gt; {
1167
- try {
1168
- const response = await axios.get(this.baseUrl, {
1169
- params: { slug: slug }
1170
- });
1171
- &nbsp;
1172
- const events = response.data;
1173
- if (!events || events.length === 0) return [];
1174
- &nbsp;
1175
- // We can reuse the logic from fetchMarkets if we extract it,
1176
- // but for now I'll duplicate the extraction logic to keep it self-contained
1177
- // and avoid safe refactoring risks.
1178
- // Actually, fetchMarkets is built to work with the Gamma response structure.
1179
- // So we can manually map the response using the same logic.
1180
- &nbsp;
1181
- const unifiedMarkets: UnifiedMarket[] = [];
1182
- &nbsp;
1183
- for (const event of events) {
1184
- if (!event.markets) continue;
1185
- &nbsp;
1186
- for (const market of event.markets) {
1187
- const outcomes: MarketOutcome[] = [];
1188
- let outcomeLabels: string[] = [];
1189
- let outcomePrices: string[] = [];
1190
- let clobTokenIds: string[] = [];
1191
- &nbsp;
1192
- try {
1193
- outcomeLabels = typeof market.outcomes === 'string' ? JSON.parse(market.outcomes) : (<span class="branch-1 cbranch-no" title="branch not covered" >market.outcomes || [])</span>;
1194
- outcomePrices = typeof market.outcomePrices === 'string' ? JSON.parse(market.outcomePrices) : (<span class="branch-1 cbranch-no" title="branch not covered" >market.outcomePrices || [])</span>;
1195
- clobTokenIds = typeof market.clobTokenIds === 'string' ? JSON.parse(market.clobTokenIds) : (<span class="branch-1 cbranch-no" title="branch not covered" >market.clobTokenIds || [])</span>;
1196
- } catch (e) { console.warn(`Parse error for market ${market.id}`, e); }
1197
- &nbsp;
1198
- let candidateName = market.groupItemTitle;
1199
- if (!candidateName &amp;&amp; market.question) candidateName = market.question;
1200
- &nbsp;
1201
- if (outcomeLabels.length &gt; 0) {
1202
- outcomeLabels.forEach((label: string, index: number) =&gt; {
1203
- let outcomeLabel = label;
1204
- // Clean up Yes/No labels if candidate name is available
1205
- if (candidateName &amp;&amp; label.toLowerCase() === 'yes') outcomeLabel = candidateName;
1206
- else <span class="missing-if-branch" title="else path not taken" >E</span>if (candidateName &amp;&amp; label.toLowerCase() === 'no') outcomeLabel = `Not ${candidateName}`;
1207
- &nbsp;
1208
- // 24h Price Change Logic
1209
- let priceChange = 0;
1210
- if (index === 0 || label.toLowerCase() === 'yes' || (candidateName &amp;&amp; label === candidateName)) {
1211
- priceChange = Number(market.oneDayPriceChange || 0);
1212
- }
1213
- &nbsp;
1214
- outcomes.push({
1215
- id: String(index),
1216
- label: outcomeLabel,
1217
- price: parseFloat(outcomePrices[index] || <span class="branch-1 cbranch-no" title="branch not covered" >"0")</span> || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
1218
- priceChange24h: priceChange,
1219
- metadata: {
1220
- clobTokenId: clobTokenIds[index]
1221
- }
1222
- });
1223
- });
1224
- }
1225
- &nbsp;
1226
- unifiedMarkets.push({
1227
- id: market.id,
1228
- title: event.title,
1229
- description: market.description || event.description,
1230
- outcomes: outcomes,
1231
- resolutionDate: market.endDate ? new Date(market.endDate) : new Date(),
1232
- volume24h: Number(market.volume24hr || market.volume_24h || <span class="branch-2 cbranch-no" title="branch not covered" >0)</span>,
1233
- volume: Number(market.volume || 0),
1234
- liquidity: Number(market.liquidity || market.rewards?.liquidity || 0),
1235
- openInterest: Number(market.openInterest || market.open_interest || 0),
1236
- url: `https://polymarket.com/event/${event.slug}`,
1237
- image: event.image || market.image,
1238
- category: event.category || event.tags?.[0]?.label,
1239
- tags: event.tags?.map(<span class="fstat-no" title="function not covered" >(t</span>: any) =&gt; <span class="cstat-no" title="statement not covered" >t.label)</span> || []
1240
- });
1241
- }
1242
- }
1243
- return unifiedMarkets;
1244
- &nbsp;
1245
- } catch (error) {
1246
- console.error(`Error fetching Polymarket slug ${slug}:`, error);
1247
- return [];
1248
- }
1249
- }
1250
- &nbsp;
1251
- /**
1252
- * Map our generic CandleInterval to Polymarket's fidelity (in minutes)
1253
- */
1254
- private mapIntervalToFidelity(interval: CandleInterval): number {
1255
- const mapping: Record&lt;CandleInterval, number&gt; = {
1256
- '1m': 1,
1257
- '5m': 5,
1258
- '15m': 15,
1259
- '1h': 60,
1260
- '6h': 360,
1261
- '1d': 1440
1262
- };
1263
- return mapping[interval];
1264
- }
1265
- &nbsp;
1266
- /**
1267
- * Fetch historical price data (OHLCV candles) for a specific token.
1268
- * @param id - The CLOB token ID (e.g., outcome token ID)
1269
- */
1270
- async getMarketHistory(id: string, params: HistoryFilterParams): Promise&lt;PriceCandle[]&gt; {
1271
- // ID Validation: Polymarket CLOB requires a Token ID (long numeric string) not a Market ID
1272
- if (id.length &lt; 10 &amp;&amp; /^\d+$/.test(id)) {
1273
- throw new Error(`Invalid ID for Polymarket history: "${id}". You provided a Market ID, but Polymarket's CLOB API requires a Token ID. Use outcome.metadata.clobTokenId instead.`);
1274
- }
1275
- &nbsp;
1276
- try {
1277
- const fidelity = this.mapIntervalToFidelity(params.resolution);
1278
- const nowTs = Math.floor(Date.now() / 1000);
1279
- &nbsp;
1280
- // 1. Smart Lookback Calculation
1281
- // If start/end not provided, calculate window based on limit * resolution
1282
- let startTs = params.start ? Math.floor(params.start.getTime() / 1000) : 0;
1283
- let endTs = params.end ? Math.floor(params.end.getTime() / 1000) : nowTs;
1284
- &nbsp;
1285
- if (!params.start) {
1286
- // Default limit is usually 20 in the example, but safety margin is good.
1287
- // If limit is not set, we default to 100 candles.
1288
- const count = params.limit || 100;
1289
- // fidelity is in minutes.
1290
- const durationSeconds = count * fidelity * 60;
1291
- startTs = endTs - durationSeconds;
1292
- }
1293
- &nbsp;
1294
- const queryParams: any = {
1295
- market: id,
1296
- fidelity: fidelity,
1297
- startTs: startTs,
1298
- endTs: endTs
1299
- };
1300
- &nbsp;
1301
- const response = await axios.get(`${this.clobUrl}/prices-history`, {
1302
- params: queryParams
1303
- });
1304
- &nbsp;
1305
- const history = response.data.history || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
1306
- &nbsp;
1307
- // 2. Align Timestamps (Snap to Grid)
1308
- // Polymarket returns random tick timestamps (e.g. 1:00:21).
1309
- // We want to normalize this to the start of the bucket (1:00:00).
1310
- const resolutionMs = fidelity * 60 * 1000;
1311
- &nbsp;
1312
- const candles: PriceCandle[] = history.map((item: any) =&gt; {
1313
- const rawMs = item.t * 1000;
1314
- const snappedMs = Math.floor(rawMs / resolutionMs) * resolutionMs;
1315
- &nbsp;
1316
- return {
1317
- timestamp: snappedMs, // Aligned timestamp
1318
- open: item.p,
1319
- high: item.p,
1320
- low: item.p,
1321
- close: item.p,
1322
- volume: undefined
1323
- };
1324
- });
1325
- &nbsp;
1326
- // Apply limit if specified
1327
- if (params.limit &amp;&amp; candles.length &gt; params.limit) {
1328
- return candles.slice(-params.limit);
1329
- }
1330
- &nbsp;
1331
- return candles;
1332
- &nbsp;
1333
- } catch (error: any) {
1334
- <span class="missing-if-branch" title="else path not taken" >E</span>if (axios.isAxiosError(error) &amp;&amp; error.response) {
1335
- const apiError = error.response.data?.error || <span class="branch-1 cbranch-no" title="branch not covered" >error.response.data?.message </span>|| <span class="branch-2 cbranch-no" title="branch not covered" >"Unknown API Error";</span>
1336
- throw new Error(`Polymarket History API Error (${error.response.status}): ${apiError}. Used ID: ${id}`);
1337
- }
1338
- <span class="cstat-no" title="statement not covered" > console.error(`Unexpected error fetching Polymarket history for ${id}:`, error);</span>
1339
- <span class="cstat-no" title="statement not covered" > throw error;</span>
1340
- }
1341
- }
1342
- &nbsp;
1343
- /**
1344
- * Fetch the current order book for a specific token.
1345
- * @param id - The CLOB token ID
1346
- */
1347
- async getOrderBook(id: string): Promise&lt;OrderBook&gt; {
1348
- try {
1349
- const response = await axios.get(`${this.clobUrl}/book`, {
1350
- params: { token_id: id }
1351
- });
1352
- &nbsp;
1353
- const data = response.data;
1354
- &nbsp;
1355
- // Response format: { bids: [{price: "0.52", size: "100"}], asks: [...] }
1356
- const bids = (data.bids || []).map((level: any) =&gt; ({
1357
- price: parseFloat(level.price),
1358
- size: parseFloat(level.size)
1359
- })).sort((a: { price: number, size: number }, b: { price: number, size: number }) =&gt; b.price - a.price); // Sort Bids Descending (Best/Highest first)
1360
- &nbsp;
1361
- const asks = (data.asks || []).map((level: any) =&gt; ({
1362
- price: parseFloat(level.price),
1363
- size: parseFloat(level.size)
1364
- })).sort((a: { price: number, size: number }, b: { price: number, size: number }) =&gt; a.price - b.price); // Sort Asks Ascending (Best/Lowest first)
1365
- &nbsp;
1366
- return {
1367
- bids,
1368
- asks,
1369
- timestamp: data.timestamp ? new Date(data.timestamp).getTime() : Date.now()
1370
- };
1371
- &nbsp;
1372
- } catch (error) {
1373
- console.error(`Error fetching Polymarket orderbook for ${id}:`, error);
1374
- return { bids: [], asks: [] };
1375
- }
1376
- }
1377
- &nbsp;
1378
- /**
1379
- * Fetch raw trade history for a specific token.
1380
- * @param id - The CLOB token ID
1381
- *
1382
- * NOTE: Polymarket's /trades endpoint currently requires L2 Authentication (API Key).
1383
- * This method will return an empty array if an API key is not provided in headers.
1384
- * Use getMarketHistory for public historical price data instead.
1385
- */
1386
- async getTradeHistory(id: string, params: HistoryFilterParams): Promise&lt;Trade[]&gt; {
1387
- // ID Validation
1388
- if (id.length &lt; 10 &amp;&amp; /^\d+$/.test(id)) {
1389
- throw new Error(`Invalid ID for Polymarket trades: "${id}". You provided a Market ID, but Polymarket's CLOB API requires a Token ID.`);
1390
- }
1391
- &nbsp;
1392
- try {
1393
- const queryParams: any = {
1394
- market: id
1395
- };
1396
- &nbsp;
1397
- // Add time filters if provided
1398
- if (params.start) {
1399
- queryParams.after = Math.floor(params.start.getTime() / 1000);
1400
- }
1401
- if (params.end) {
1402
- queryParams.before = Math.floor(params.end.getTime() / 1000);
1403
- }
1404
- &nbsp;
1405
- const response = await axios.get(`${this.clobUrl}/trades`, {
1406
- params: queryParams
1407
- });
1408
- &nbsp;
1409
- // Response is an array of trade objects
1410
- const trades = response.data || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
1411
- &nbsp;
1412
- const mappedTrades: Trade[] = trades.map((trade: any) =&gt; ({
1413
- id: trade.id || `${trade.timestamp}-${trade.price}`,
1414
- timestamp: trade.timestamp * 1000, // Convert to milliseconds
1415
- price: parseFloat(trade.price),
1416
- amount: parseFloat(trade.size || trade.amount || <span class="branch-2 cbranch-no" title="branch not covered" >0)</span>,
1417
- side: trade.side === 'BUY' ? 'buy' : trade.side === 'SELL' ? 'sell' : 'unknown'
1418
- }));
1419
- &nbsp;
1420
- // Apply limit if specified
1421
- if (params.limit &amp;&amp; mappedTrades.length &gt; params.limit) {
1422
- return mappedTrades.slice(-params.limit); // Return most recent N trades
1423
- }
1424
- &nbsp;
1425
- return mappedTrades;
1426
- &nbsp;
1427
- } catch (error: any) {
1428
- if (axios.isAxiosError(error) &amp;&amp; error.response) {
1429
- const apiError = error.response.data?.error || <span class="branch-1 cbranch-no" title="branch not covered" >error.response.data?.message </span>|| <span class="branch-2 cbranch-no" title="branch not covered" >"Unknown API Error";</span>
1430
- throw new Error(`Polymarket Trades API Error (${error.response.status}): ${apiError}. Used ID: ${id}`);
1431
- }
1432
- console.error(`Unexpected error fetching Polymarket trades for ${id}:`, error);
1433
- throw error;
1434
- }
1435
- }
1436
- }
1437
- &nbsp;</pre></td></tr></table></pre>
1438
-
1439
- <div class='push'></div><!-- for sticky footer -->
1440
- </div><!-- /wrapper -->
1441
- <div class='footer quiet pad2 space-top1 center small'>
1442
- Code coverage generated by
1443
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1444
- at 2026-01-08T19:42:57.093Z
1445
- </div>
1446
- <script src="../../prettify.js"></script>
1447
- <script>
1448
- window.onload = function () {
1449
- prettyPrint();
1450
- };
1451
- </script>
1452
- <script src="../../sorter.js"></script>
1453
- <script src="../../block-navigation.js"></script>
1454
- </body>
1455
- </html>
1456
-