pmxtjs 0.1.0 → 0.1.1
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.
- package/dist/BaseExchange.js +30 -0
- package/{src/exchanges/Kalshi.ts → dist/exchanges/Kalshi.js} +75 -106
- package/{src/exchanges/Polymarket.ts → dist/exchanges/Polymarket.js} +107 -144
- package/dist/index.js +20 -0
- package/dist/types.js +5 -0
- package/package.json +4 -1
- package/API_REFERENCE.md +0 -88
- package/coverage/clover.xml +0 -334
- package/coverage/coverage-final.json +0 -4
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -131
- package/coverage/lcov-report/pmxt/BaseExchange.ts.html +0 -256
- package/coverage/lcov-report/pmxt/exchanges/Kalshi.ts.html +0 -1132
- package/coverage/lcov-report/pmxt/exchanges/Polymarket.ts.html +0 -1456
- package/coverage/lcov-report/pmxt/exchanges/index.html +0 -131
- package/coverage/lcov-report/pmxt/index.html +0 -116
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -210
- package/coverage/lcov-report/src/BaseExchange.ts.html +0 -256
- package/coverage/lcov-report/src/exchanges/Kalshi.ts.html +0 -1132
- package/coverage/lcov-report/src/exchanges/Polymarket.ts.html +0 -1456
- package/coverage/lcov-report/src/exchanges/index.html +0 -131
- package/coverage/lcov-report/src/index.html +0 -116
- package/coverage/lcov.info +0 -766
- package/examples/get_event_prices.ts +0 -37
- package/examples/historical_prices.ts +0 -117
- package/examples/orderbook.ts +0 -102
- package/examples/recent_trades.ts +0 -29
- package/examples/search_events.ts +0 -68
- package/examples/search_market.ts +0 -29
- package/jest.config.js +0 -11
- package/pmxt-0.1.0.tgz +0 -0
- package/src/BaseExchange.ts +0 -57
- package/src/index.ts +0 -5
- package/src/types.ts +0 -61
- package/test/exchanges/kalshi/ApiErrors.test.ts +0 -132
- package/test/exchanges/kalshi/EmptyResponse.test.ts +0 -44
- package/test/exchanges/kalshi/FetchAndNormalizeMarkets.test.ts +0 -56
- package/test/exchanges/kalshi/LiveApi.integration.test.ts +0 -40
- package/test/exchanges/kalshi/MarketHistory.test.ts +0 -185
- package/test/exchanges/kalshi/OrderBook.test.ts +0 -149
- package/test/exchanges/kalshi/SearchMarkets.test.ts +0 -174
- package/test/exchanges/kalshi/VolumeFallback.test.ts +0 -44
- package/test/exchanges/polymarket/DataValidation.test.ts +0 -271
- package/test/exchanges/polymarket/ErrorHandling.test.ts +0 -34
- package/test/exchanges/polymarket/FetchAndNormalizeMarkets.test.ts +0 -68
- package/test/exchanges/polymarket/GetMarketsBySlug.test.ts +0 -268
- package/test/exchanges/polymarket/LiveApi.integration.test.ts +0 -44
- package/test/exchanges/polymarket/MarketHistory.test.ts +0 -207
- package/test/exchanges/polymarket/OrderBook.test.ts +0 -167
- package/test/exchanges/polymarket/RequestParameters.test.ts +0 -39
- package/test/exchanges/polymarket/SearchMarkets.test.ts +0 -176
- package/test/exchanges/polymarket/TradeHistory.test.ts +0 -248
- package/tsconfig.json +0 -12
|
@@ -1,1132 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
<!doctype html>
|
|
3
|
-
<html lang="en">
|
|
4
|
-
|
|
5
|
-
<head>
|
|
6
|
-
<title>Code coverage report for pmxt/exchanges/Kalshi.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">pmxt/exchanges</a> Kalshi.ts</h1>
|
|
23
|
-
<div class='clearfix'>
|
|
24
|
-
|
|
25
|
-
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">82.5% </span>
|
|
27
|
-
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>132/160</span>
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">77.86% </span>
|
|
34
|
-
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>95/122</span>
|
|
36
|
-
</div>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">80% </span>
|
|
41
|
-
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>16/20</span>
|
|
43
|
-
</div>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">85.13% </span>
|
|
48
|
-
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>126/148</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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">8x</span>
|
|
416
|
-
<span class="cline-any cline-yes">8x</span>
|
|
417
|
-
<span class="cline-any cline-neutral"> </span>
|
|
418
|
-
<span class="cline-any cline-neutral"> </span>
|
|
419
|
-
<span class="cline-any cline-yes">8x</span>
|
|
420
|
-
<span class="cline-any cline-neutral"> </span>
|
|
421
|
-
<span class="cline-any cline-no"> </span>
|
|
422
|
-
<span class="cline-any cline-neutral"> </span>
|
|
423
|
-
<span class="cline-any cline-yes">34x</span>
|
|
424
|
-
<span class="cline-any cline-neutral"> </span>
|
|
425
|
-
<span class="cline-any cline-neutral"> </span>
|
|
426
|
-
<span class="cline-any cline-yes">15x</span>
|
|
427
|
-
<span class="cline-any cline-neutral"> </span>
|
|
428
|
-
<span class="cline-any cline-yes">15x</span>
|
|
429
|
-
<span class="cline-any cline-neutral"> </span>
|
|
430
|
-
<span class="cline-any cline-neutral"> </span>
|
|
431
|
-
<span class="cline-any cline-yes">15x</span>
|
|
432
|
-
<span class="cline-any cline-neutral"> </span>
|
|
433
|
-
<span class="cline-any cline-neutral"> </span>
|
|
434
|
-
<span class="cline-any cline-yes">15x</span>
|
|
435
|
-
<span class="cline-any cline-neutral"> </span>
|
|
436
|
-
<span class="cline-any cline-yes">15x</span>
|
|
437
|
-
<span class="cline-any cline-yes">459x</span>
|
|
438
|
-
<span class="cline-any cline-yes">459x</span>
|
|
439
|
-
<span class="cline-any cline-yes">1591x</span>
|
|
440
|
-
<span class="cline-any cline-yes">1591x</span>
|
|
441
|
-
<span class="cline-any cline-yes">1591x</span>
|
|
442
|
-
<span class="cline-any cline-neutral"> </span>
|
|
443
|
-
<span class="cline-any cline-neutral"> </span>
|
|
444
|
-
<span class="cline-any cline-neutral"> </span>
|
|
445
|
-
<span class="cline-any cline-neutral"> </span>
|
|
446
|
-
<span class="cline-any cline-yes">15x</span>
|
|
447
|
-
<span class="cline-any cline-neutral"> </span>
|
|
448
|
-
<span class="cline-any cline-neutral"> </span>
|
|
449
|
-
<span class="cline-any cline-yes">15x</span>
|
|
450
|
-
<span class="cline-any cline-no"> </span>
|
|
451
|
-
<span class="cline-any cline-yes">15x</span>
|
|
452
|
-
<span class="cline-any cline-no"> </span>
|
|
453
|
-
<span class="cline-any cline-neutral"> </span>
|
|
454
|
-
<span class="cline-any cline-neutral"> </span>
|
|
455
|
-
<span class="cline-any cline-yes">15x</span>
|
|
456
|
-
<span class="cline-any cline-neutral"> </span>
|
|
457
|
-
<span class="cline-any cline-neutral"> </span>
|
|
458
|
-
<span class="cline-any cline-no"> </span>
|
|
459
|
-
<span class="cline-any cline-no"> </span>
|
|
460
|
-
<span class="cline-any cline-neutral"> </span>
|
|
461
|
-
<span class="cline-any cline-neutral"> </span>
|
|
462
|
-
<span class="cline-any cline-neutral"> </span>
|
|
463
|
-
<span class="cline-any cline-neutral"> </span>
|
|
464
|
-
<span class="cline-any cline-yes">15x</span>
|
|
465
|
-
<span class="cline-any cline-yes">15x</span>
|
|
466
|
-
<span class="cline-any cline-yes">15x</span>
|
|
467
|
-
<span class="cline-any cline-yes">15x</span>
|
|
468
|
-
<span class="cline-any cline-neutral"> </span>
|
|
469
|
-
<span class="cline-any cline-neutral"> </span>
|
|
470
|
-
<span class="cline-any cline-neutral"> </span>
|
|
471
|
-
<span class="cline-any cline-neutral"> </span>
|
|
472
|
-
<span class="cline-any cline-neutral"> </span>
|
|
473
|
-
<span class="cline-any cline-yes">15x</span>
|
|
474
|
-
<span class="cline-any cline-yes">15x</span>
|
|
475
|
-
<span class="cline-any cline-neutral"> </span>
|
|
476
|
-
<span class="cline-any cline-yes">15x</span>
|
|
477
|
-
<span class="cline-any cline-yes">15x</span>
|
|
478
|
-
<span class="cline-any cline-neutral"> </span>
|
|
479
|
-
<span class="cline-any cline-yes">15x</span>
|
|
480
|
-
<span class="cline-any cline-neutral"> </span>
|
|
481
|
-
<span class="cline-any cline-neutral"> </span>
|
|
482
|
-
<span class="cline-any cline-neutral"> </span>
|
|
483
|
-
<span class="cline-any cline-neutral"> </span>
|
|
484
|
-
<span class="cline-any cline-yes">15x</span>
|
|
485
|
-
<span class="cline-any cline-neutral"> </span>
|
|
486
|
-
<span class="cline-any cline-yes">15x</span>
|
|
487
|
-
<span class="cline-any cline-yes">13x</span>
|
|
488
|
-
<span class="cline-any cline-neutral"> </span>
|
|
489
|
-
<span class="cline-any cline-yes">13x</span>
|
|
490
|
-
<span class="cline-any cline-neutral"> </span>
|
|
491
|
-
<span class="cline-any cline-yes">11x</span>
|
|
492
|
-
<span class="cline-any cline-neutral"> </span>
|
|
493
|
-
<span class="cline-any cline-neutral"> </span>
|
|
494
|
-
<span class="cline-any cline-yes">11x</span>
|
|
495
|
-
<span class="cline-any cline-yes">11x</span>
|
|
496
|
-
<span class="cline-any cline-yes">459x</span>
|
|
497
|
-
<span class="cline-any cline-neutral"> </span>
|
|
498
|
-
<span class="cline-any cline-neutral"> </span>
|
|
499
|
-
<span class="cline-any cline-neutral"> </span>
|
|
500
|
-
<span class="cline-any cline-neutral"> </span>
|
|
501
|
-
<span class="cline-any cline-yes">11x</span>
|
|
502
|
-
<span class="cline-any cline-yes">2x</span>
|
|
503
|
-
<span class="cline-any cline-yes">2x</span>
|
|
504
|
-
<span class="cline-any cline-neutral"> </span>
|
|
505
|
-
<span class="cline-any cline-neutral"> </span>
|
|
506
|
-
<span class="cline-any cline-neutral"> </span>
|
|
507
|
-
<span class="cline-any cline-yes">9x</span>
|
|
508
|
-
<span class="cline-any cline-yes">9x</span>
|
|
509
|
-
<span class="cline-any cline-neutral"> </span>
|
|
510
|
-
<span class="cline-any cline-neutral"> </span>
|
|
511
|
-
<span class="cline-any cline-yes">9x</span>
|
|
512
|
-
<span class="cline-any cline-no"> </span>
|
|
513
|
-
<span class="cline-any cline-neutral"> </span>
|
|
514
|
-
<span class="cline-any cline-neutral"> </span>
|
|
515
|
-
<span class="cline-any cline-neutral"> </span>
|
|
516
|
-
<span class="cline-any cline-yes">2x</span>
|
|
517
|
-
<span class="cline-any cline-yes">2x</span>
|
|
518
|
-
<span class="cline-any cline-neutral"> </span>
|
|
519
|
-
<span class="cline-any cline-neutral"> </span>
|
|
520
|
-
<span class="cline-any cline-neutral"> </span>
|
|
521
|
-
<span class="cline-any cline-yes">15x</span>
|
|
522
|
-
<span class="cline-any cline-yes">15x</span>
|
|
523
|
-
<span class="cline-any cline-neutral"> </span>
|
|
524
|
-
<span class="cline-any cline-neutral"> </span>
|
|
525
|
-
<span class="cline-any cline-neutral"> </span>
|
|
526
|
-
<span class="cline-any cline-yes">1591x</span>
|
|
527
|
-
<span class="cline-any cline-neutral"> </span>
|
|
528
|
-
<span class="cline-any cline-neutral"> </span>
|
|
529
|
-
<span class="cline-any cline-yes">1591x</span>
|
|
530
|
-
<span class="cline-any cline-yes">1591x</span>
|
|
531
|
-
<span class="cline-any cline-yes">1471x</span>
|
|
532
|
-
<span class="cline-any cline-yes">120x</span>
|
|
533
|
-
<span class="cline-any cline-yes">84x</span>
|
|
534
|
-
<span class="cline-any cline-yes">36x</span>
|
|
535
|
-
<span class="cline-any cline-yes">32x</span>
|
|
536
|
-
<span class="cline-any cline-neutral"> </span>
|
|
537
|
-
<span class="cline-any cline-neutral"> </span>
|
|
538
|
-
<span class="cline-any cline-neutral"> </span>
|
|
539
|
-
<span class="cline-any cline-yes">1591x</span>
|
|
540
|
-
<span class="cline-any cline-yes">1591x</span>
|
|
541
|
-
<span class="cline-any cline-yes">1533x</span>
|
|
542
|
-
<span class="cline-any cline-neutral"> </span>
|
|
543
|
-
<span class="cline-any cline-neutral"> </span>
|
|
544
|
-
<span class="cline-any cline-neutral"> </span>
|
|
545
|
-
<span class="cline-any cline-yes">1591x</span>
|
|
546
|
-
<span class="cline-any cline-yes">1591x</span>
|
|
547
|
-
<span class="cline-any cline-yes">1532x</span>
|
|
548
|
-
<span class="cline-any cline-neutral"> </span>
|
|
549
|
-
<span class="cline-any cline-neutral"> </span>
|
|
550
|
-
<span class="cline-any cline-yes">1591x</span>
|
|
551
|
-
<span class="cline-any cline-neutral"> </span>
|
|
552
|
-
<span class="cline-any cline-neutral"> </span>
|
|
553
|
-
<span class="cline-any cline-neutral"> </span>
|
|
554
|
-
<span class="cline-any cline-neutral"> </span>
|
|
555
|
-
<span class="cline-any cline-neutral"> </span>
|
|
556
|
-
<span class="cline-any cline-neutral"> </span>
|
|
557
|
-
<span class="cline-any cline-neutral"> </span>
|
|
558
|
-
<span class="cline-any cline-neutral"> </span>
|
|
559
|
-
<span class="cline-any cline-neutral"> </span>
|
|
560
|
-
<span class="cline-any cline-neutral"> </span>
|
|
561
|
-
<span class="cline-any cline-neutral"> </span>
|
|
562
|
-
<span class="cline-any cline-neutral"> </span>
|
|
563
|
-
<span class="cline-any cline-neutral"> </span>
|
|
564
|
-
<span class="cline-any cline-neutral"> </span>
|
|
565
|
-
<span class="cline-any cline-yes">1591x</span>
|
|
566
|
-
<span class="cline-any cline-neutral"> </span>
|
|
567
|
-
<span class="cline-any cline-neutral"> </span>
|
|
568
|
-
<span class="cline-any cline-neutral"> </span>
|
|
569
|
-
<span class="cline-any cline-neutral"> </span>
|
|
570
|
-
<span class="cline-any cline-neutral"> </span>
|
|
571
|
-
<span class="cline-any cline-neutral"> </span>
|
|
572
|
-
<span class="cline-any cline-neutral"> </span>
|
|
573
|
-
<span class="cline-any cline-neutral"> </span>
|
|
574
|
-
<span class="cline-any cline-neutral"> </span>
|
|
575
|
-
<span class="cline-any cline-neutral"> </span>
|
|
576
|
-
<span class="cline-any cline-neutral"> </span>
|
|
577
|
-
<span class="cline-any cline-neutral"> </span>
|
|
578
|
-
<span class="cline-any cline-neutral"> </span>
|
|
579
|
-
<span class="cline-any cline-neutral"> </span>
|
|
580
|
-
<span class="cline-any cline-neutral"> </span>
|
|
581
|
-
<span class="cline-any cline-neutral"> </span>
|
|
582
|
-
<span class="cline-any cline-neutral"> </span>
|
|
583
|
-
<span class="cline-any cline-yes">7x</span>
|
|
584
|
-
<span class="cline-any cline-yes">7x</span>
|
|
585
|
-
<span class="cline-any cline-yes">7x</span>
|
|
586
|
-
<span class="cline-any cline-yes">7x</span>
|
|
587
|
-
<span class="cline-any cline-yes">7x</span>
|
|
588
|
-
<span class="cline-any cline-yes">56x</span>
|
|
589
|
-
<span class="cline-any cline-neutral"> </span>
|
|
590
|
-
<span class="cline-any cline-neutral"> </span>
|
|
591
|
-
<span class="cline-any cline-yes">7x</span>
|
|
592
|
-
<span class="cline-any cline-yes">7x</span>
|
|
593
|
-
<span class="cline-any cline-neutral"> </span>
|
|
594
|
-
<span class="cline-any cline-no"> </span>
|
|
595
|
-
<span class="cline-any cline-no"> </span>
|
|
596
|
-
<span class="cline-any cline-neutral"> </span>
|
|
597
|
-
<span class="cline-any cline-neutral"> </span>
|
|
598
|
-
<span class="cline-any cline-neutral"> </span>
|
|
599
|
-
<span class="cline-any cline-neutral"> </span>
|
|
600
|
-
<span class="cline-any cline-neutral"> </span>
|
|
601
|
-
<span class="cline-any cline-neutral"> </span>
|
|
602
|
-
<span class="cline-any cline-neutral"> </span>
|
|
603
|
-
<span class="cline-any cline-neutral"> </span>
|
|
604
|
-
<span class="cline-any cline-neutral"> </span>
|
|
605
|
-
<span class="cline-any cline-yes">2x</span>
|
|
606
|
-
<span class="cline-any cline-neutral"> </span>
|
|
607
|
-
<span class="cline-any cline-yes">2x</span>
|
|
608
|
-
<span class="cline-any cline-yes">2x</span>
|
|
609
|
-
<span class="cline-any cline-yes">2x</span>
|
|
610
|
-
<span class="cline-any cline-neutral"> </span>
|
|
611
|
-
<span class="cline-any cline-neutral"> </span>
|
|
612
|
-
<span class="cline-any cline-neutral"> </span>
|
|
613
|
-
<span class="cline-any cline-no"> </span>
|
|
614
|
-
<span class="cline-any cline-no"> </span>
|
|
615
|
-
<span class="cline-any cline-neutral"> </span>
|
|
616
|
-
<span class="cline-any cline-no"> </span>
|
|
617
|
-
<span class="cline-any cline-no"> </span>
|
|
618
|
-
<span class="cline-any cline-neutral"> </span>
|
|
619
|
-
<span class="cline-any cline-no"> </span>
|
|
620
|
-
<span class="cline-any cline-no"> </span>
|
|
621
|
-
<span class="cline-any cline-no"> </span>
|
|
622
|
-
<span class="cline-any cline-no"> </span>
|
|
623
|
-
<span class="cline-any cline-neutral"> </span>
|
|
624
|
-
<span class="cline-any cline-neutral"> </span>
|
|
625
|
-
<span class="cline-any cline-neutral"> </span>
|
|
626
|
-
<span class="cline-any cline-no"> </span>
|
|
627
|
-
<span class="cline-any cline-neutral"> </span>
|
|
628
|
-
<span class="cline-any cline-neutral"> </span>
|
|
629
|
-
<span class="cline-any cline-yes">2x</span>
|
|
630
|
-
<span class="cline-any cline-yes">2x</span>
|
|
631
|
-
<span class="cline-any cline-yes">1x</span>
|
|
632
|
-
<span class="cline-any cline-neutral"> </span>
|
|
633
|
-
<span class="cline-any cline-yes">1x</span>
|
|
634
|
-
<span class="cline-any cline-yes">1x</span>
|
|
635
|
-
<span class="cline-any cline-neutral"> </span>
|
|
636
|
-
<span class="cline-any cline-no"> </span>
|
|
637
|
-
<span class="cline-any cline-no"> </span>
|
|
638
|
-
<span class="cline-any cline-neutral"> </span>
|
|
639
|
-
<span class="cline-any cline-neutral"> </span>
|
|
640
|
-
<span class="cline-any cline-neutral"> </span>
|
|
641
|
-
<span class="cline-any cline-neutral"> </span>
|
|
642
|
-
<span class="cline-any cline-yes">11x</span>
|
|
643
|
-
<span class="cline-any cline-neutral"> </span>
|
|
644
|
-
<span class="cline-any cline-neutral"> </span>
|
|
645
|
-
<span class="cline-any cline-neutral"> </span>
|
|
646
|
-
<span class="cline-any cline-neutral"> </span>
|
|
647
|
-
<span class="cline-any cline-neutral"> </span>
|
|
648
|
-
<span class="cline-any cline-neutral"> </span>
|
|
649
|
-
<span class="cline-any cline-neutral"> </span>
|
|
650
|
-
<span class="cline-any cline-yes">11x</span>
|
|
651
|
-
<span class="cline-any cline-neutral"> </span>
|
|
652
|
-
<span class="cline-any cline-neutral"> </span>
|
|
653
|
-
<span class="cline-any cline-neutral"> </span>
|
|
654
|
-
<span class="cline-any cline-yes">11x</span>
|
|
655
|
-
<span class="cline-any cline-neutral"> </span>
|
|
656
|
-
<span class="cline-any cline-yes">11x</span>
|
|
657
|
-
<span class="cline-any cline-yes">11x</span>
|
|
658
|
-
<span class="cline-any cline-neutral"> </span>
|
|
659
|
-
<span class="cline-any cline-neutral"> </span>
|
|
660
|
-
<span class="cline-any cline-yes">11x</span>
|
|
661
|
-
<span class="cline-any cline-yes">11x</span>
|
|
662
|
-
<span class="cline-any cline-yes">1x</span>
|
|
663
|
-
<span class="cline-any cline-neutral"> </span>
|
|
664
|
-
<span class="cline-any cline-yes">10x</span>
|
|
665
|
-
<span class="cline-any cline-yes">10x</span>
|
|
666
|
-
<span class="cline-any cline-neutral"> </span>
|
|
667
|
-
<span class="cline-any cline-yes">10x</span>
|
|
668
|
-
<span class="cline-any cline-neutral"> </span>
|
|
669
|
-
<span class="cline-any cline-yes">10x</span>
|
|
670
|
-
<span class="cline-any cline-yes">10x</span>
|
|
671
|
-
<span class="cline-any cline-yes">10x</span>
|
|
672
|
-
<span class="cline-any cline-neutral"> </span>
|
|
673
|
-
<span class="cline-any cline-yes">10x</span>
|
|
674
|
-
<span class="cline-any cline-yes">1x</span>
|
|
675
|
-
<span class="cline-any cline-neutral"> </span>
|
|
676
|
-
<span class="cline-any cline-yes">10x</span>
|
|
677
|
-
<span class="cline-any cline-yes">1x</span>
|
|
678
|
-
<span class="cline-any cline-yes">1x</span>
|
|
679
|
-
<span class="cline-any cline-no"> </span>
|
|
680
|
-
<span class="cline-any cline-neutral"> </span>
|
|
681
|
-
<span class="cline-any cline-neutral"> </span>
|
|
682
|
-
<span class="cline-any cline-neutral"> </span>
|
|
683
|
-
<span class="cline-any cline-yes">10x</span>
|
|
684
|
-
<span class="cline-any cline-yes">10x</span>
|
|
685
|
-
<span class="cline-any cline-neutral"> </span>
|
|
686
|
-
<span class="cline-any cline-yes">10x</span>
|
|
687
|
-
<span class="cline-any cline-yes">9x</span>
|
|
688
|
-
<span class="cline-any cline-neutral"> </span>
|
|
689
|
-
<span class="cline-any cline-yes">105x</span>
|
|
690
|
-
<span class="cline-any cline-neutral"> </span>
|
|
691
|
-
<span class="cline-any cline-neutral"> </span>
|
|
692
|
-
<span class="cline-any cline-neutral"> </span>
|
|
693
|
-
<span class="cline-any cline-neutral"> </span>
|
|
694
|
-
<span class="cline-any cline-neutral"> </span>
|
|
695
|
-
<span class="cline-any cline-neutral"> </span>
|
|
696
|
-
<span class="cline-any cline-neutral"> </span>
|
|
697
|
-
<span class="cline-any cline-neutral"> </span>
|
|
698
|
-
<span class="cline-any cline-yes">9x</span>
|
|
699
|
-
<span class="cline-any cline-yes">1x</span>
|
|
700
|
-
<span class="cline-any cline-neutral"> </span>
|
|
701
|
-
<span class="cline-any cline-yes">8x</span>
|
|
702
|
-
<span class="cline-any cline-neutral"> </span>
|
|
703
|
-
<span class="cline-any cline-yes">2x</span>
|
|
704
|
-
<span class="cline-any cline-yes">1x</span>
|
|
705
|
-
<span class="cline-any cline-yes">1x</span>
|
|
706
|
-
<span class="cline-any cline-neutral"> </span>
|
|
707
|
-
<span class="cline-any cline-yes">1x</span>
|
|
708
|
-
<span class="cline-any cline-yes">1x</span>
|
|
709
|
-
<span class="cline-any cline-neutral"> </span>
|
|
710
|
-
<span class="cline-any cline-neutral"> </span>
|
|
711
|
-
<span class="cline-any cline-neutral"> </span>
|
|
712
|
-
<span class="cline-any cline-neutral"> </span>
|
|
713
|
-
<span class="cline-any cline-yes">8x</span>
|
|
714
|
-
<span class="cline-any cline-yes">8x</span>
|
|
715
|
-
<span class="cline-any cline-yes">8x</span>
|
|
716
|
-
<span class="cline-any cline-yes">7x</span>
|
|
717
|
-
<span class="cline-any cline-neutral"> </span>
|
|
718
|
-
<span class="cline-any cline-neutral"> </span>
|
|
719
|
-
<span class="cline-any cline-yes">8x</span>
|
|
720
|
-
<span class="cline-any cline-neutral"> </span>
|
|
721
|
-
<span class="cline-any cline-neutral"> </span>
|
|
722
|
-
<span class="cline-any cline-neutral"> </span>
|
|
723
|
-
<span class="cline-any cline-neutral"> </span>
|
|
724
|
-
<span class="cline-any cline-yes">8x</span>
|
|
725
|
-
<span class="cline-any cline-neutral"> </span>
|
|
726
|
-
<span class="cline-any cline-neutral"> </span>
|
|
727
|
-
<span class="cline-any cline-neutral"> </span>
|
|
728
|
-
<span class="cline-any cline-neutral"> </span>
|
|
729
|
-
<span class="cline-any cline-neutral"> </span>
|
|
730
|
-
<span class="cline-any cline-yes">7x</span>
|
|
731
|
-
<span class="cline-any cline-yes">7x</span>
|
|
732
|
-
<span class="cline-any cline-neutral"> </span>
|
|
733
|
-
<span class="cline-any cline-yes">7x</span>
|
|
734
|
-
<span class="cline-any cline-neutral"> </span>
|
|
735
|
-
<span class="cline-any cline-yes">1x</span>
|
|
736
|
-
<span class="cline-any cline-yes">1x</span>
|
|
737
|
-
<span class="cline-any cline-neutral"> </span>
|
|
738
|
-
<span class="cline-any cline-neutral"> </span>
|
|
739
|
-
<span class="cline-any cline-neutral"> </span>
|
|
740
|
-
<span class="cline-any cline-neutral"> </span>
|
|
741
|
-
<span class="cline-any cline-yes">1x</span>
|
|
742
|
-
<span class="cline-any cline-yes">1x</span>
|
|
743
|
-
<span class="cline-any cline-yes">1x</span>
|
|
744
|
-
<span class="cline-any cline-neutral"> </span>
|
|
745
|
-
<span class="cline-any cline-neutral"> </span>
|
|
746
|
-
<span class="cline-any cline-neutral"> </span>
|
|
747
|
-
<span class="cline-any cline-neutral"> </span>
|
|
748
|
-
<span class="cline-any cline-neutral"> </span>
|
|
749
|
-
<span class="cline-any cline-no"> </span>
|
|
750
|
-
<span class="cline-any cline-neutral"> </span>
|
|
751
|
-
<span class="cline-any cline-no"> </span>
|
|
752
|
-
<span class="cline-any cline-neutral"> </span>
|
|
753
|
-
<span class="cline-any cline-neutral"> </span>
|
|
754
|
-
<span class="cline-any cline-neutral"> </span>
|
|
755
|
-
<span class="cline-any cline-neutral"> </span>
|
|
756
|
-
<span class="cline-any cline-neutral"> </span>
|
|
757
|
-
<span class="cline-any cline-neutral"> </span>
|
|
758
|
-
<span class="cline-any cline-neutral"> </span>
|
|
759
|
-
<span class="cline-any cline-yes">1x</span>
|
|
760
|
-
<span class="cline-any cline-yes">1x</span>
|
|
761
|
-
<span class="cline-any cline-neutral"> </span>
|
|
762
|
-
<span class="cline-any cline-neutral"> </span>
|
|
763
|
-
<span class="cline-any cline-neutral"> </span>
|
|
764
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import axios from 'axios';
|
|
765
|
-
import { PredictionMarketExchange, MarketFilterParams, HistoryFilterParams } from '../BaseExchange';
|
|
766
|
-
import { UnifiedMarket, MarketOutcome, PriceCandle, CandleInterval, OrderBook, Trade } from '../types';
|
|
767
|
-
|
|
768
|
-
export class KalshiExchange extends PredictionMarketExchange {
|
|
769
|
-
<span class="fstat-no" title="function not covered" > get n</span>ame(): string {
|
|
770
|
-
<span class="cstat-no" title="statement not covered" > return "Kalshi";</span>
|
|
771
|
-
}
|
|
772
|
-
private baseUrl = "https://api.elections.kalshi.com/trade-api/v2/events";
|
|
773
|
-
|
|
774
|
-
async fetchMarkets(params?: MarketFilterParams): Promise<UnifiedMarket[]> {
|
|
775
|
-
const limit = params?.limit || 50;
|
|
776
|
-
|
|
777
|
-
try {
|
|
778
|
-
// Fetch active events with nested markets
|
|
779
|
-
// For small limits, we can optimize by fetching fewer pages
|
|
780
|
-
const allEvents = await this.fetchActiveEvents(limit);
|
|
781
|
-
|
|
782
|
-
// Extract ALL markets from all events
|
|
783
|
-
const allMarkets: UnifiedMarket[] = [];
|
|
784
|
-
|
|
785
|
-
for (const event of allEvents) {
|
|
786
|
-
const markets = event.markets || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
|
|
787
|
-
for (const market of markets) {
|
|
788
|
-
const unifiedMarket = this.mapMarketToUnified(event, market);
|
|
789
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (unifiedMarket) {
|
|
790
|
-
allMarkets.push(unifiedMarket);
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
}
|
|
794
|
-
|
|
795
|
-
console.log(`Extracted ${allMarkets.length} markets from ${allEvents.length} events.`);
|
|
796
|
-
|
|
797
|
-
// Sort by 24h volume
|
|
798
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (params?.sort === 'volume') {
|
|
799
|
-
<span class="cstat-no" title="statement not covered" > allMarkets.sort(<span class="fstat-no" title="function not covered" >(a</span>, b) => <span class="cstat-no" title="statement not covered" >b.volume24h - a.volume24h)</span>;</span>
|
|
800
|
-
} else <span class="missing-if-branch" title="if path not taken" >I</span>if (params?.sort === 'liquidity') {
|
|
801
|
-
<span class="cstat-no" title="statement not covered" > allMarkets.sort(<span class="fstat-no" title="function not covered" >(a</span>, b) => <span class="cstat-no" title="statement not covered" >b.liquidity - a.liquidity)</span>;</span>
|
|
802
|
-
}
|
|
803
|
-
|
|
804
|
-
return allMarkets.slice(0, limit);
|
|
805
|
-
|
|
806
|
-
} catch (error) {
|
|
807
|
-
<span class="cstat-no" title="statement not covered" > console.error("Error fetching Kalshi data:", error);</span>
|
|
808
|
-
<span class="cstat-no" title="statement not covered" > return [];</span>
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
private async fetchActiveEvents(targetMarketCount?: number): Promise<any[]> {
|
|
813
|
-
let allEvents: any[] = [];
|
|
814
|
-
let totalMarketCount = 0;
|
|
815
|
-
let cursor = null;
|
|
816
|
-
let page = 0;
|
|
817
|
-
|
|
818
|
-
// Note: Kalshi API uses cursor-based pagination which requires sequential fetching.
|
|
819
|
-
// We cannot parallelize requests for a single list because we need the cursor from page N to fetch page N+1.
|
|
820
|
-
// To optimize, we use the maximum allowed limit (200) and fetch until exhaustion.
|
|
821
|
-
|
|
822
|
-
const MAX_PAGES = 1000; // Safety cap against infinite loops
|
|
823
|
-
const BATCH_SIZE = 200; // Max limit per Kalshi API docs
|
|
824
|
-
|
|
825
|
-
do {
|
|
826
|
-
try {
|
|
827
|
-
// console.log(`Fetching Kalshi page ${page + 1}...`);
|
|
828
|
-
const queryParams: any = {
|
|
829
|
-
limit: BATCH_SIZE,
|
|
830
|
-
with_nested_markets: true,
|
|
831
|
-
status: 'open' // Filter to open markets to improve relevance and speed
|
|
832
|
-
};
|
|
833
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (cursor) <span class="cstat-no" title="statement not covered" >queryParams.cursor = cursor;</span>
|
|
834
|
-
|
|
835
|
-
const response = await axios.get(this.baseUrl, { params: queryParams });
|
|
836
|
-
const events = response.data.events || [];
|
|
837
|
-
|
|
838
|
-
if (events.length === 0) break;
|
|
839
|
-
|
|
840
|
-
allEvents = allEvents.concat(events);
|
|
841
|
-
|
|
842
|
-
// Count markets in this batch for early termination
|
|
843
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (targetMarketCount) {
|
|
844
|
-
for (const event of events) {
|
|
845
|
-
totalMarketCount += (event.markets || <span class="branch-1 cbranch-no" title="branch not covered" >[])</span>.length;
|
|
846
|
-
}
|
|
847
|
-
|
|
848
|
-
// Early termination: if we have enough markets, stop fetching
|
|
849
|
-
// Add a buffer (2x) to ensure we have enough after filtering/sorting
|
|
850
|
-
if (totalMarketCount >= targetMarketCount * 2) {
|
|
851
|
-
console.log(`Early termination: collected ${totalMarketCount} markets (target: ${targetMarketCount})`);
|
|
852
|
-
break;
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
|
|
856
|
-
cursor = response.data.cursor;
|
|
857
|
-
page++;
|
|
858
|
-
|
|
859
|
-
// Log progress every few pages to avoid spam
|
|
860
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (page % 5 === 0) {
|
|
861
|
-
<span class="cstat-no" title="statement not covered" > console.log(`Fetched ${page} pages (${allEvents.length} events) from Kalshi...`);</span>
|
|
862
|
-
}
|
|
863
|
-
|
|
864
|
-
} catch (e) {
|
|
865
|
-
console.error(`Error fetching Kalshi page ${page}:`, e);
|
|
866
|
-
break;
|
|
867
|
-
}
|
|
868
|
-
} while (cursor && <span class="branch-1 cbranch-no" title="branch not covered" >page < MAX_PAGES)</span>;
|
|
869
|
-
|
|
870
|
-
console.log(`Finished fetching Kalshi: ${allEvents.length} total events across ${page} pages.`);
|
|
871
|
-
return allEvents;
|
|
872
|
-
}
|
|
873
|
-
|
|
874
|
-
private mapMarketToUnified(event: any, market: any): UnifiedMarket | null {
|
|
875
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (!market) <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
876
|
-
|
|
877
|
-
// Calculate price
|
|
878
|
-
let price = 0.5;
|
|
879
|
-
if (market.last_price) {
|
|
880
|
-
price = market.last_price / 100;
|
|
881
|
-
} else if (market.yes_ask && market.yes_bid) {
|
|
882
|
-
price = (market.yes_ask + market.yes_bid) / 200;
|
|
883
|
-
} else if (market.yes_ask) {
|
|
884
|
-
price = market.yes_ask / 100;
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
// Extract candidate name
|
|
888
|
-
let candidateName: string | null = null;
|
|
889
|
-
if (market.subtitle || market.yes_sub_title) {
|
|
890
|
-
candidateName = market.subtitle || market.yes_sub_title;
|
|
891
|
-
}
|
|
892
|
-
|
|
893
|
-
// Calculate 24h change
|
|
894
|
-
let priceChange = 0;
|
|
895
|
-
if (market.previous_price_dollars !== undefined && market.last_price_dollars !== undefined) {
|
|
896
|
-
priceChange = market.last_price_dollars - market.previous_price_dollars;
|
|
897
|
-
}
|
|
898
|
-
|
|
899
|
-
const outcomes: MarketOutcome[] = [
|
|
900
|
-
{
|
|
901
|
-
id: 'yes',
|
|
902
|
-
label: candidateName || 'Yes',
|
|
903
|
-
price: price,
|
|
904
|
-
priceChange24h: priceChange
|
|
905
|
-
},
|
|
906
|
-
{
|
|
907
|
-
id: 'no',
|
|
908
|
-
label: candidateName ? `Not ${candidateName}` : 'No',
|
|
909
|
-
price: 1 - price,
|
|
910
|
-
priceChange24h: -priceChange // Inverse change for No? simplified assumption
|
|
911
|
-
}
|
|
912
|
-
];
|
|
913
|
-
|
|
914
|
-
return {
|
|
915
|
-
id: market.ticker,
|
|
916
|
-
title: event.title,
|
|
917
|
-
description: event.sub_title || market.subtitle || "",
|
|
918
|
-
outcomes: outcomes,
|
|
919
|
-
resolutionDate: new Date(market.expiration_time),
|
|
920
|
-
volume24h: Number(market.volume_24h || market.volume || 0),
|
|
921
|
-
volume: Number(market.volume || 0),
|
|
922
|
-
liquidity: Number(market.liquidity || 0), // Kalshi 'liquidity' might need specific mapping if available, otherwise 0 to avoid conflation
|
|
923
|
-
openInterest: Number(market.open_interest || 0),
|
|
924
|
-
url: `https://kalshi.com/events/${event.event_ticker}`,
|
|
925
|
-
category: event.category,
|
|
926
|
-
tags: event.tags || []
|
|
927
|
-
};
|
|
928
|
-
}
|
|
929
|
-
|
|
930
|
-
async searchMarkets(query: string, params?: MarketFilterParams): Promise<UnifiedMarket[]> {
|
|
931
|
-
// We must fetch ALL markets to search them locally since we don't have server-side search
|
|
932
|
-
const fetchLimit = 100000;
|
|
933
|
-
try {
|
|
934
|
-
const markets = await this.fetchMarkets({ ...params, limit: fetchLimit });
|
|
935
|
-
const lowerQuery = query.toLowerCase();
|
|
936
|
-
const filtered = markets.filter(market =>
|
|
937
|
-
market.title.toLowerCase().includes(lowerQuery) ||
|
|
938
|
-
market.description.toLowerCase().includes(lowerQuery)
|
|
939
|
-
);
|
|
940
|
-
const limit = params?.limit || 20;
|
|
941
|
-
return filtered.slice(0, limit);
|
|
942
|
-
} catch (error) {
|
|
943
|
-
<span class="cstat-no" title="statement not covered" > console.error("Error searching Kalshi data:", error);</span>
|
|
944
|
-
<span class="cstat-no" title="statement not covered" > return [];</span>
|
|
945
|
-
}
|
|
946
|
-
}
|
|
947
|
-
|
|
948
|
-
/**
|
|
949
|
-
* Fetch specific markets by their event ticker.
|
|
950
|
-
* Useful for looking up a specific event from a URL.
|
|
951
|
-
* @param eventTicker - The event ticker (e.g. "FED-25JAN" or "PRES-2024")
|
|
952
|
-
*/
|
|
953
|
-
async getMarketsBySlug(eventTicker: string): Promise<UnifiedMarket[]> {
|
|
954
|
-
try {
|
|
955
|
-
// Kalshi API expects uppercase tickers, but URLs use lowercase
|
|
956
|
-
const normalizedTicker = eventTicker.toUpperCase();
|
|
957
|
-
const url = `https://api.elections.kalshi.com/trade-api/v2/events/${normalizedTicker}`;
|
|
958
|
-
const response = await axios.get(url, {
|
|
959
|
-
params: { with_nested_markets: true }
|
|
960
|
-
});
|
|
961
|
-
|
|
962
|
-
const event = <span class="cstat-no" title="statement not covered" >response.data.event;</span>
|
|
963
|
-
<span class="cstat-no" title="statement not covered" > if (!event) <span class="cstat-no" title="statement not covered" >return [];</span></span>
|
|
964
|
-
|
|
965
|
-
const unifiedMarkets: UnifiedMarket[] = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
966
|
-
const markets = <span class="cstat-no" title="statement not covered" >event.markets || [];</span>
|
|
967
|
-
|
|
968
|
-
<span class="cstat-no" title="statement not covered" > for (const market of markets) {</span>
|
|
969
|
-
const unifiedMarket = <span class="cstat-no" title="statement not covered" >this.mapMarketToUnified(event, market);</span>
|
|
970
|
-
<span class="cstat-no" title="statement not covered" > if (unifiedMarket) {</span>
|
|
971
|
-
<span class="cstat-no" title="statement not covered" > unifiedMarkets.push(unifiedMarket);</span>
|
|
972
|
-
}
|
|
973
|
-
}
|
|
974
|
-
|
|
975
|
-
<span class="cstat-no" title="statement not covered" > return unifiedMarkets;</span>
|
|
976
|
-
|
|
977
|
-
} catch (error: any) {
|
|
978
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (axios.isAxiosError(error) && error.response) {
|
|
979
|
-
if (error.response.status === 404) {
|
|
980
|
-
throw new Error(`Kalshi event not found: "${eventTicker}". Check that the event ticker is correct.`);
|
|
981
|
-
}
|
|
982
|
-
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>
|
|
983
|
-
throw new Error(`Kalshi API Error (${error.response.status}): ${apiError}. Event Ticker: ${eventTicker}`);
|
|
984
|
-
}
|
|
985
|
-
<span class="cstat-no" title="statement not covered" > console.error(`Unexpected error fetching Kalshi event ${eventTicker}:`, error);</span>
|
|
986
|
-
<span class="cstat-no" title="statement not covered" > throw error;</span>
|
|
987
|
-
}
|
|
988
|
-
}
|
|
989
|
-
|
|
990
|
-
private mapIntervalToKalshi(interval: CandleInterval): number {
|
|
991
|
-
const mapping: Record<CandleInterval, number> = {
|
|
992
|
-
'1m': 1,
|
|
993
|
-
'5m': 1,
|
|
994
|
-
'15m': 1,
|
|
995
|
-
'1h': 60,
|
|
996
|
-
'6h': 60,
|
|
997
|
-
'1d': 1440
|
|
998
|
-
};
|
|
999
|
-
return mapping[interval];
|
|
1000
|
-
}
|
|
1001
|
-
|
|
1002
|
-
async getMarketHistory(id: string, params: HistoryFilterParams): Promise<PriceCandle[]> {
|
|
1003
|
-
try {
|
|
1004
|
-
// Kalshi API expects uppercase tickers
|
|
1005
|
-
const normalizedId = id.toUpperCase();
|
|
1006
|
-
const interval = this.mapIntervalToKalshi(params.resolution);
|
|
1007
|
-
|
|
1008
|
-
// Heuristic for series_ticker
|
|
1009
|
-
const parts = normalizedId.split('-');
|
|
1010
|
-
if (parts.length < 2) {
|
|
1011
|
-
throw new Error(`Invalid Kalshi Ticker format: "${id}". Expected format like "FED-25JAN29-B4.75".`);
|
|
1012
|
-
}
|
|
1013
|
-
const seriesTicker = parts.slice(0, -1).join('-');
|
|
1014
|
-
const url = `https://api.elections.kalshi.com/trade-api/v2/series/${seriesTicker}/markets/${normalizedId}/candlesticks`;
|
|
1015
|
-
|
|
1016
|
-
const queryParams: any = { period_interval: interval };
|
|
1017
|
-
|
|
1018
|
-
const now = Math.floor(Date.now() / 1000);
|
|
1019
|
-
let startTs = now - (24 * 60 * 60);
|
|
1020
|
-
let endTs = now;
|
|
1021
|
-
|
|
1022
|
-
if (params.start) {
|
|
1023
|
-
startTs = Math.floor(params.start.getTime() / 1000);
|
|
1024
|
-
}
|
|
1025
|
-
if (params.end) {
|
|
1026
|
-
endTs = Math.floor(params.end.getTime() / 1000);
|
|
1027
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (!params.start) {
|
|
1028
|
-
<span class="cstat-no" title="statement not covered" > startTs = endTs - (24 * 60 * 60);</span>
|
|
1029
|
-
}
|
|
1030
|
-
}
|
|
1031
|
-
|
|
1032
|
-
queryParams.start_ts = startTs;
|
|
1033
|
-
queryParams.end_ts = endTs;
|
|
1034
|
-
|
|
1035
|
-
const response = await axios.get(url, { params: queryParams });
|
|
1036
|
-
const candles = response.data.candlesticks || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
|
|
1037
|
-
|
|
1038
|
-
const mappedCandles: PriceCandle[] = candles.map((c: any) => ({
|
|
1039
|
-
timestamp: c.end_period_ts * 1000,
|
|
1040
|
-
open: (c.price.open || 0) / 100,
|
|
1041
|
-
high: (c.price.high || 0) / 100,
|
|
1042
|
-
low: (c.price.low || 0) / 100,
|
|
1043
|
-
close: (c.price.close || 0) / 100,
|
|
1044
|
-
volume: c.volume
|
|
1045
|
-
}));
|
|
1046
|
-
|
|
1047
|
-
if (params.limit && mappedCandles.length > params.limit) {
|
|
1048
|
-
return mappedCandles.slice(-params.limit);
|
|
1049
|
-
}
|
|
1050
|
-
return mappedCandles;
|
|
1051
|
-
} catch (error: any) {
|
|
1052
|
-
if (axios.isAxiosError(error) && error.response) {
|
|
1053
|
-
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>
|
|
1054
|
-
throw new Error(`Kalshi History API Error (${error.response.status}): ${apiError}. Used Ticker: ${id}`);
|
|
1055
|
-
}
|
|
1056
|
-
console.error(`Unexpected error fetching Kalshi history for ${id}:`, error);
|
|
1057
|
-
throw error;
|
|
1058
|
-
}
|
|
1059
|
-
}
|
|
1060
|
-
|
|
1061
|
-
async getOrderBook(id: string): Promise<OrderBook> {
|
|
1062
|
-
try {
|
|
1063
|
-
const url = `https://api.elections.kalshi.com/trade-api/v2/markets/${id}/orderbook`;
|
|
1064
|
-
const response = await axios.get(url);
|
|
1065
|
-
const data = response.data.orderbook;
|
|
1066
|
-
|
|
1067
|
-
// Structure: { yes: [[price, qty], ...], no: [[price, qty], ...] }
|
|
1068
|
-
const bids = (data.yes || []).map((level: number[]) => ({
|
|
1069
|
-
price: level[0] / 100,
|
|
1070
|
-
size: level[1]
|
|
1071
|
-
}));
|
|
1072
|
-
|
|
1073
|
-
const asks = (data.no || []).map((level: number[]) => ({
|
|
1074
|
-
price: (100 - level[0]) / 100,
|
|
1075
|
-
size: level[1]
|
|
1076
|
-
}));
|
|
1077
|
-
|
|
1078
|
-
// Sort bids desc, asks asc
|
|
1079
|
-
bids.sort((a: any, b: any) => b.price - a.price);
|
|
1080
|
-
asks.sort((a: any, b: any) => a.price - b.price);
|
|
1081
|
-
|
|
1082
|
-
return { bids, asks, timestamp: Date.now() };
|
|
1083
|
-
} catch (error) {
|
|
1084
|
-
console.error(`Error fetching Kalshi orderbook for ${id}:`, error);
|
|
1085
|
-
return { bids: [], asks: [] };
|
|
1086
|
-
}
|
|
1087
|
-
}
|
|
1088
|
-
|
|
1089
|
-
async getTradeHistory(id: string, params: HistoryFilterParams): Promise<Trade[]> {
|
|
1090
|
-
try {
|
|
1091
|
-
const url = `https://api.elections.kalshi.com/trade-api/v2/markets/trades`;
|
|
1092
|
-
const response = await axios.get(url, {
|
|
1093
|
-
params: {
|
|
1094
|
-
ticker: id,
|
|
1095
|
-
limit: params.limit || 100
|
|
1096
|
-
}
|
|
1097
|
-
});
|
|
1098
|
-
const trades = <span class="cstat-no" title="statement not covered" >response.data.trades || [];</span>
|
|
1099
|
-
|
|
1100
|
-
<span class="cstat-no" title="statement not covered" > return trades.map(<span class="fstat-no" title="function not covered" >(t</span>: any) => (<span class="cstat-no" title="statement not covered" >{</span></span>
|
|
1101
|
-
id: t.trade_id,
|
|
1102
|
-
timestamp: new Date(t.created_time).getTime(),
|
|
1103
|
-
price: t.yes_price / 100,
|
|
1104
|
-
amount: t.count,
|
|
1105
|
-
side: t.taker_side === 'yes' ? 'buy' : 'sell'
|
|
1106
|
-
}));
|
|
1107
|
-
} catch (error) {
|
|
1108
|
-
console.error(`Error fetching Kalshi trades for ${id}:`, error);
|
|
1109
|
-
return [];
|
|
1110
|
-
}
|
|
1111
|
-
}
|
|
1112
|
-
}
|
|
1113
|
-
</pre></td></tr></table></pre>
|
|
1114
|
-
|
|
1115
|
-
<div class='push'></div><!-- for sticky footer -->
|
|
1116
|
-
</div><!-- /wrapper -->
|
|
1117
|
-
<div class='footer quiet pad2 space-top1 center small'>
|
|
1118
|
-
Code coverage generated by
|
|
1119
|
-
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1120
|
-
at 2026-01-08T19:32:17.978Z
|
|
1121
|
-
</div>
|
|
1122
|
-
<script src="../../prettify.js"></script>
|
|
1123
|
-
<script>
|
|
1124
|
-
window.onload = function () {
|
|
1125
|
-
prettyPrint();
|
|
1126
|
-
};
|
|
1127
|
-
</script>
|
|
1128
|
-
<script src="../../sorter.js"></script>
|
|
1129
|
-
<script src="../../block-navigation.js"></script>
|
|
1130
|
-
</body>
|
|
1131
|
-
</html>
|
|
1132
|
-
|