@mostlyrightmd/markets 1.4.0 → 1.5.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/index.cjs CHANGED
@@ -136,92 +136,92 @@ var POLYMARKET_CITY_STATIONS = {
136
136
  amsterdam: {
137
137
  default: "EHAM"
138
138
  },
139
+ ankara: {
140
+ default: "LTAC"
141
+ },
139
142
  atlanta: {
140
143
  default: "KATL"
141
144
  },
142
- auckland: {
143
- default: "NZAA"
144
- },
145
145
  austin: {
146
146
  default: "KAUS"
147
147
  },
148
- bangkok: {
149
- default: "VTBS"
150
- },
151
- barcelona: {
152
- default: "LEBL"
153
- },
154
148
  beijing: {
155
149
  default: "ZBAA"
156
150
  },
157
- berlin: {
158
- default: "EDDB"
151
+ buenos_aires: {
152
+ default: "SAEZ"
159
153
  },
160
- boston: {
161
- default: "KBOS"
154
+ busan: {
155
+ default: "RKPK"
162
156
  },
163
- brisbane: {
164
- default: "YBBN"
157
+ cape_town: {
158
+ default: "FACT"
165
159
  },
166
- buenos_aires: {
167
- default: "SAEZ"
160
+ chengdu: {
161
+ default: "ZUUU"
168
162
  },
169
163
  chicago: {
170
164
  default: "KORD",
171
165
  high: "KORD",
172
166
  low: "KORD"
173
167
  },
174
- copenhagen: {
175
- default: "EKCH"
168
+ chongqing: {
169
+ default: "ZUCK"
176
170
  },
177
171
  dallas: {
178
- default: "KDFW"
179
- },
180
- delhi: {
181
- default: "VIDP"
172
+ default: "KDAL"
182
173
  },
183
174
  denver: {
184
- default: "KDEN"
175
+ default: "KBKF"
185
176
  },
186
- detroit: {
187
- default: "KDTW"
188
- },
189
- doha: {
190
- default: "OTHH"
191
- },
192
- dubai: {
193
- default: "OMDB"
194
- },
195
- frankfurt: {
196
- default: "EDDF"
177
+ guangzhou: {
178
+ default: "ZGGG"
197
179
  },
198
180
  helsinki: {
199
181
  default: "EFHK"
200
182
  },
201
183
  hong_kong: {
202
- default: "VHHH",
203
- high: "VHHH",
204
- low: "VHHH"
184
+ default: "HKO",
185
+ high: "HKO",
186
+ low: "HKO"
205
187
  },
206
188
  houston: {
207
- default: "KIAH"
189
+ default: "KHOU"
208
190
  },
209
- london: {
210
- default: "EGLL"
191
+ istanbul: {
192
+ default: "LTFM"
193
+ },
194
+ jeddah: {
195
+ default: "OEJN"
196
+ },
197
+ jinan: {
198
+ default: "ZSJN"
199
+ },
200
+ karachi: {
201
+ default: "OPKC"
202
+ },
203
+ kuala_lumpur: {
204
+ default: "WMKK"
211
205
  },
212
- london_gatwick: {
213
- default: "EGKK"
206
+ london: {
207
+ default: "EGLC"
214
208
  },
215
209
  los_angeles: {
216
210
  default: "KLAX",
217
211
  high: "KLAX",
218
212
  low: "KLAX"
219
213
  },
214
+ lucknow: {
215
+ default: "VILK"
216
+ },
220
217
  madrid: {
221
218
  default: "LEMD"
222
219
  },
223
- melbourne: {
224
- default: "YMML"
220
+ manila: {
221
+ default: "RPLL"
222
+ },
223
+ mexico_city: {
224
+ default: "MMMX"
225
225
  },
226
226
  miami: {
227
227
  default: "KMIA"
@@ -229,14 +229,8 @@ var POLYMARKET_CITY_STATIONS = {
229
229
  milan: {
230
230
  default: "LIMC"
231
231
  },
232
- minneapolis: {
233
- default: "KMSP"
234
- },
235
232
  moscow: {
236
- default: "UUEE"
237
- },
238
- mumbai: {
239
- default: "VABB"
233
+ default: "UUWW"
240
234
  },
241
235
  munich: {
242
236
  default: "EDDM"
@@ -246,25 +240,14 @@ var POLYMARKET_CITY_STATIONS = {
246
240
  high: "KLGA",
247
241
  low: "KLGA"
248
242
  },
249
- paris: {
250
- default: "LFPG",
251
- high: "LFPG",
252
- low: "LFPB"
253
- },
254
- paris_orly: {
255
- default: "LFPO"
256
- },
257
- philadelphia: {
258
- default: "KPHL"
259
- },
260
- phoenix: {
261
- default: "KPHX"
243
+ panama_city: {
244
+ default: "MPMG"
262
245
  },
263
- riyadh: {
264
- default: "OERK"
246
+ paris: {
247
+ default: "LFPB"
265
248
  },
266
- rome: {
267
- default: "LIRF"
249
+ qingdao: {
250
+ default: "ZSQD"
268
251
  },
269
252
  san_francisco: {
270
253
  default: "KSFO"
@@ -281,40 +264,37 @@ var POLYMARKET_CITY_STATIONS = {
281
264
  shanghai: {
282
265
  default: "ZSPD"
283
266
  },
267
+ shenzhen: {
268
+ default: "ZGSZ"
269
+ },
284
270
  singapore: {
285
271
  default: "WSSS"
286
272
  },
287
- stockholm: {
288
- default: "ESSA"
289
- },
290
- sydney: {
291
- default: "YSSY"
292
- },
293
273
  taipei: {
294
- default: "RCTP"
274
+ default: "RCSS"
275
+ },
276
+ tel_aviv: {
277
+ default: "LLBG"
295
278
  },
296
279
  tokyo: {
297
280
  default: "RJTT",
298
281
  high: "RJTT",
299
282
  low: "RJTT"
300
283
  },
301
- tokyo_narita: {
302
- default: "RJAA"
303
- },
304
- vienna: {
305
- default: "LOWW"
284
+ toronto: {
285
+ default: "CYYZ"
306
286
  },
307
287
  warsaw: {
308
288
  default: "EPWA"
309
289
  },
310
- washington_dc: {
311
- default: "KDCA"
312
- },
313
290
  wellington: {
314
291
  default: "NZWN"
315
292
  },
316
- zurich: {
317
- default: "LSZH"
293
+ wuhan: {
294
+ default: "ZHHH"
295
+ },
296
+ zhengzhou: {
297
+ default: "ZHCC"
318
298
  }
319
299
  };
320
300
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/data/generated/kalshi-stations.ts","../src/data/generated/polymarket-city-stations.ts","../src/resolvers/kalshi-nhigh.ts","../src/resolvers/kalshi-nlow.ts","../src/kalshi-settlement.ts"],"sourcesContent":["// @mostlyrightmd/markets — placeholder scaffold for TS-W0 Wave 1.\n// Real implementation (Kalshi NHIGH/NLOW resolvers, Polymarket discover/settle) lands in TS-W1+.\n\n/**\n * Placeholder version string from the TS-W0 Wave 1 scaffold. The\n * authoritative package version lives in `package.json#version`\n * (currently `0.1.0-rc.7`); this constant has not been bumped.\n */\nexport const version = \"0.0.0\";\n\n/**\n * Smoke-test export from the TS-W0 Wave 1 scaffold. Returns the literal\n * string `\"hello @mostlyrightmd/markets\"`. Retained so the published\n * package has at least one importable runtime export until the scaffold\n * is removed in a later phase.\n */\nexport function helloMarkets(): string {\n return \"hello @mostlyrightmd/markets\";\n}\n\n// Re-export generated data (NOT auto-generated; hand-maintained barrel).\n// The targets ARE auto-generated by @mostlyrightmd/codegen — see packages-ts/codegen.\nexport * from \"./data/generated/index.js\";\n\n// Kalshi NHIGH/NLOW resolvers (TS-W1 Wave 2).\nexport * from \"./resolvers/index.js\";\n\n// Kalshi settlement helper (TS-W5 Wave 5) — higher-level dispatch by\n// prefix (KHIGH* vs KLOW*).\nexport { kalshiSettlementFor } from \"./kalshi-settlement.js\";\nexport type { KalshiSettlement } from \"./kalshi-settlement.js\";\n\n// NOTE: Polymarket discover/settle (TS-W5 Waves 1-4) live at the\n// `./polymarket` subpath, NOT the root barrel — keeps the IIFE bundle\n// lean (Polymarket is server-side by design; CORS-blocked from\n// browsers per .planning/research/TS-CORS-MATRIX.md). Import with:\n//\n// import { polymarketDiscover, polymarketSettle } from \"@mostlyrightmd/markets/polymarket\";\n","// AUTO-GENERATED by @mostlyrightmd/codegen from schemas/kalshi-settlement-stations.json.\n// DO NOT EDIT — regenerate with: pnpm codegen\n// Last manifest SHA recorded in schemas/EXPORT_MANIFEST.json\n\nexport interface KalshiStation {\n station: string;\n citation: string;\n}\n\nexport const KALSHI_SETTLEMENT_STATIONS: Readonly<Record<string, KalshiStation>> = {\n ATL: {\n citation: \"https://kalshi.com/markets/khighatl (Atlanta Hartsfield-Jackson)\",\n station: \"KATL\",\n },\n AUS: {\n citation: \"https://kalshi.com/markets/khighaus (Austin-Bergstrom; the only Austin station Kalshi cites)\",\n station: \"KAUS\",\n },\n BNA: {\n citation: \"https://kalshi.com/markets/khighbna (Nashville International)\",\n station: \"KBNA\",\n },\n BOS: {\n citation: \"https://kalshi.com/markets/khighbos (Boston Logan)\",\n station: \"KBOS\",\n },\n CHI: {\n citation: \"https://kalshi.com/markets/khighchi (Midway, NOT ORD)\",\n station: \"KMDW\",\n },\n CVG: {\n citation: \"https://kalshi.com/markets/khighcvg (Cincinnati/Northern Kentucky International)\",\n station: \"KCVG\",\n },\n DAL: {\n citation: \"https://kalshi.com/markets/khighdal (DFW, NOT Love Field)\",\n station: \"KDFW\",\n },\n DCA: {\n citation: \"https://kalshi.com/markets/khighdca (Reagan National, NOT Dulles or BWI)\",\n station: \"KDCA\",\n },\n DEN: {\n citation: \"https://kalshi.com/markets/khighden (Denver International)\",\n station: \"KDEN\",\n },\n DTW: {\n citation: \"https://kalshi.com/markets/khighdtw (Detroit Metropolitan)\",\n station: \"KDTW\",\n },\n HOU: {\n citation: \"https://kalshi.com/markets/khighhou (Intercontinental, NOT Hobby; Kalshi cites IAH)\",\n station: \"KIAH\",\n },\n LAX: {\n citation: \"https://kalshi.com/markets/khighlax (LAX international)\",\n station: \"KLAX\",\n },\n MIA: {\n citation: \"https://kalshi.com/markets/khighmia (Miami International)\",\n station: \"KMIA\",\n },\n MSP: {\n citation: \"https://kalshi.com/markets/khighmsp (Minneapolis-St. Paul International)\",\n station: \"KMSP\",\n },\n NYC: {\n citation: \"https://kalshi.com/markets/khighny (Central Park, NOT LGA/JFK)\",\n station: \"KNYC\",\n },\n PHL: {\n citation: \"https://kalshi.com/markets/khighphl (Philadelphia International)\",\n station: \"KPHL\",\n },\n PHX: {\n citation: \"https://kalshi.com/markets/khighphx (Sky Harbor International)\",\n station: \"KPHX\",\n },\n SEA: {\n citation: \"https://kalshi.com/markets/khighsea (SeaTac, NOT BFI)\",\n station: \"KSEA\",\n },\n SFO: {\n citation: \"https://kalshi.com/markets/khighsfo (San Francisco International, NOT OAK)\",\n station: \"KSFO\",\n },\n SLC: {\n citation: \"https://kalshi.com/markets/khighslc (Salt Lake City International)\",\n station: \"KSLC\",\n },\n TLV: {\n citation: \"https://kalshi.com/markets/kxhightlv (Harry Reid/McCarran; settles vs NWS CLILAS)\",\n station: \"KLAS\",\n },\n} as const;\n\nexport const KNOWN_WRONG_STATIONS: ReadonlySet<string> = new Set<string>([\n \"KBWI\",\n \"KDAL\",\n \"KEWR\",\n \"KHOU\",\n \"KIAD\",\n \"KJFK\",\n \"KLGA\",\n \"KOAK\",\n \"KORD\",\n]);\n","// AUTO-GENERATED by @mostlyrightmd/codegen from schemas/polymarket-city-stations.json.\n// DO NOT EDIT — regenerate with: pnpm codegen\n// Last manifest SHA recorded in schemas/EXPORT_MANIFEST.json\n\nexport interface PolymarketCityStation {\n default: string;\n high?: string;\n low?: string;\n [measure: string]: string | undefined;\n}\n\nexport const POLYMARKET_CITY_STATIONS: Readonly<Record<string, PolymarketCityStation>> = {\n amsterdam: {\n default: \"EHAM\",\n },\n atlanta: {\n default: \"KATL\",\n },\n auckland: {\n default: \"NZAA\",\n },\n austin: {\n default: \"KAUS\",\n },\n bangkok: {\n default: \"VTBS\",\n },\n barcelona: {\n default: \"LEBL\",\n },\n beijing: {\n default: \"ZBAA\",\n },\n berlin: {\n default: \"EDDB\",\n },\n boston: {\n default: \"KBOS\",\n },\n brisbane: {\n default: \"YBBN\",\n },\n buenos_aires: {\n default: \"SAEZ\",\n },\n chicago: {\n default: \"KORD\",\n high: \"KORD\",\n low: \"KORD\",\n },\n copenhagen: {\n default: \"EKCH\",\n },\n dallas: {\n default: \"KDFW\",\n },\n delhi: {\n default: \"VIDP\",\n },\n denver: {\n default: \"KDEN\",\n },\n detroit: {\n default: \"KDTW\",\n },\n doha: {\n default: \"OTHH\",\n },\n dubai: {\n default: \"OMDB\",\n },\n frankfurt: {\n default: \"EDDF\",\n },\n helsinki: {\n default: \"EFHK\",\n },\n hong_kong: {\n default: \"VHHH\",\n high: \"VHHH\",\n low: \"VHHH\",\n },\n houston: {\n default: \"KIAH\",\n },\n london: {\n default: \"EGLL\",\n },\n london_gatwick: {\n default: \"EGKK\",\n },\n los_angeles: {\n default: \"KLAX\",\n high: \"KLAX\",\n low: \"KLAX\",\n },\n madrid: {\n default: \"LEMD\",\n },\n melbourne: {\n default: \"YMML\",\n },\n miami: {\n default: \"KMIA\",\n },\n milan: {\n default: \"LIMC\",\n },\n minneapolis: {\n default: \"KMSP\",\n },\n moscow: {\n default: \"UUEE\",\n },\n mumbai: {\n default: \"VABB\",\n },\n munich: {\n default: \"EDDM\",\n },\n nyc: {\n default: \"KLGA\",\n high: \"KLGA\",\n low: \"KLGA\",\n },\n paris: {\n default: \"LFPG\",\n high: \"LFPG\",\n low: \"LFPB\",\n },\n paris_orly: {\n default: \"LFPO\",\n },\n philadelphia: {\n default: \"KPHL\",\n },\n phoenix: {\n default: \"KPHX\",\n },\n riyadh: {\n default: \"OERK\",\n },\n rome: {\n default: \"LIRF\",\n },\n san_francisco: {\n default: \"KSFO\",\n },\n sao_paulo: {\n default: \"SBGR\",\n },\n seattle: {\n default: \"KSEA\",\n },\n seoul: {\n default: \"RKSI\",\n },\n shanghai: {\n default: \"ZSPD\",\n },\n singapore: {\n default: \"WSSS\",\n },\n stockholm: {\n default: \"ESSA\",\n },\n sydney: {\n default: \"YSSY\",\n },\n taipei: {\n default: \"RCTP\",\n },\n tokyo: {\n default: \"RJTT\",\n high: \"RJTT\",\n low: \"RJTT\",\n },\n tokyo_narita: {\n default: \"RJAA\",\n },\n vienna: {\n default: \"LOWW\",\n },\n warsaw: {\n default: \"EPWA\",\n },\n washington_dc: {\n default: \"KDCA\",\n },\n wellington: {\n default: \"NZWN\",\n },\n zurich: {\n default: \"LSZH\",\n },\n} as const;\n","// Kalshi NHIGH (daily HIGH temperature) contract resolver.\n//\n// NHIGH markets resolve against the NWS CLI `max_temp_f` value for a\n// specific station on a specific date. `kalshiNhighResolve` is the\n// deterministic mapping from a Kalshi market identifier to the\n// (settlement_source, settlement_station) tuple downstream code uses\n// to pull the right settlement row from the CLI catalog.\n//\n// Ported byte-faithful from packages/markets/src/mostlyright/markets/catalog/kalshi_nhigh.py.\n\nimport { KALSHI_SETTLEMENT_STATIONS } from \"../data/generated/kalshi-stations.js\";\n\nexport interface NHighResolution {\n readonly settlementSource: \"cli.archive\";\n readonly settlementStation: string; // 4-letter ICAO\n readonly cityTicker: string;\n readonly contractDate: string; // YYYY-MM-DD\n}\n\n/**\n * Custom error type for contract-id parsing / validation failures.\n *\n * Mirrors the Python `ValueError`/`TypeError` distinction: in TS we use a\n * named subclass so callers can `instanceof`-check rather than parse\n * error messages.\n */\nexport class ContractIdError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ContractIdError\";\n }\n}\n\n/**\n * Coerce a Date or YYYY-MM-DD string into an ISO date-only string.\n *\n * Rejects Date instances whose UTC hours/minutes/seconds/ms are non-zero —\n * those would silently corrupt downstream settlement-date matching\n * (date-equality is strict).\n *\n * Mirrors the Python `isinstance(settlement_date, datetime)` guard in\n * `kalshi_nhigh.resolve`.\n */\nfunction coerceContractDate(value: Date | string): string {\n if (typeof value === \"string\") {\n // YYYY-MM-DD strict format check.\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n throw new ContractIdError(\n `settlementDate string must be YYYY-MM-DD; got ${JSON.stringify(value)}`,\n );\n }\n // Validate it parses to a real calendar date.\n const parsed = new Date(`${value}T00:00:00Z`);\n if (Number.isNaN(parsed.getTime())) {\n throw new ContractIdError(\n `settlementDate string is not a valid calendar date; got ${JSON.stringify(value)}`,\n );\n }\n // Round-trip check — guards against e.g. \"2025-02-30\" silently\n // rolling forward.\n const iso = parsed.toISOString().slice(0, 10);\n if (iso !== value) {\n throw new ContractIdError(\n `settlementDate string is not a valid calendar date; got ${JSON.stringify(value)}`,\n );\n }\n return value;\n }\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) {\n throw new ContractIdError(\"settlementDate is an invalid Date instance\");\n }\n // Reject any Date with a non-zero UTC time component — mirrors\n // Python's `isinstance(settlement_date, datetime)` guard. A Date\n // carries a time component which would break downstream\n // date-equality matching.\n if (\n value.getUTCHours() !== 0 ||\n value.getUTCMinutes() !== 0 ||\n value.getUTCSeconds() !== 0 ||\n value.getUTCMilliseconds() !== 0\n ) {\n throw new ContractIdError(\n `settlementDate must be a UTC date-only Date (H/M/S/ms = 0); got ${value.toISOString()}. Use new Date('YYYY-MM-DDT00:00:00Z') or pass a 'YYYY-MM-DD' string.`,\n );\n }\n return value.toISOString().slice(0, 10);\n }\n throw new ContractIdError(\"settlementDate must be a Date instance or YYYY-MM-DD string\");\n}\n\n/**\n * Resolve a Kalshi NHIGH contract to its settlement source + station.\n *\n * The contract id format is `KHIGH<CITY>` (case-insensitive), where\n * `<CITY>` is a city ticker present in\n * {@link KALSHI_SETTLEMENT_STATIONS}.\n *\n * @param contractId Kalshi market identifier. Case-insensitive.\n * @param settlementDate Calendar date the market settles for. Either a\n * UTC date-only `Date` (H/M/S/ms == 0) or a `YYYY-MM-DD` string.\n * @returns A frozen {@link NHighResolution}.\n * @throws {ContractIdError} The contract id doesn't follow\n * `KHIGH<CITY>`, the city is unknown, or the settlement date is\n * invalid.\n */\nexport function kalshiNhighResolve(\n contractId: string,\n settlementDate: Date | string,\n): NHighResolution {\n if (typeof contractId !== \"string\") {\n throw new ContractIdError(`contractId must be a string; got ${typeof contractId}`);\n }\n\n const contractDate = coerceContractDate(settlementDate);\n\n const cid = contractId.toUpperCase();\n if (!cid.startsWith(\"KHIGH\") || cid.length <= 5) {\n throw new ContractIdError(\n `NHIGH contractId must follow 'KHIGH<CITY>' format; got ${JSON.stringify(contractId)}`,\n );\n }\n const cityTicker = cid.slice(5);\n const station = KALSHI_SETTLEMENT_STATIONS[cityTicker];\n if (station === undefined) {\n const known = Object.keys(KALSHI_SETTLEMENT_STATIONS).sort();\n throw new ContractIdError(\n `unknown city ${JSON.stringify(cityTicker)} (known: ${known.join(\", \")})`,\n );\n }\n\n return Object.freeze({\n settlementSource: \"cli.archive\" as const,\n settlementStation: station.station,\n cityTicker,\n contractDate,\n });\n}\n","// Kalshi NLOW (daily LOW temperature) contract resolver.\n//\n// Mirror of kalshi-nhigh — same station whitelist + same source\n// (cli.archive); only the metric differs. NLOW markets resolve against\n// the NWS CLI `min_temp_f` value for a specific station on a specific\n// date.\n//\n// Ported byte-faithful from packages/markets/src/mostlyright/markets/catalog/kalshi_nlow.py.\n\nimport { KALSHI_SETTLEMENT_STATIONS } from \"../data/generated/kalshi-stations.js\";\nimport { ContractIdError } from \"./kalshi-nhigh.js\";\n\nexport interface NLowResolution {\n readonly settlementSource: \"cli.archive\";\n readonly settlementStation: string; // 4-letter ICAO\n readonly cityTicker: string;\n readonly contractDate: string; // YYYY-MM-DD\n}\n\n/**\n * Coerce a Date or YYYY-MM-DD string into an ISO date-only string.\n *\n * Rejects Date instances whose UTC hours/minutes/seconds/ms are non-zero —\n * those would silently corrupt downstream settlement-date matching.\n *\n * Mirrors the Python `isinstance(settlement_date, datetime)` guard.\n *\n * Note: duplicated here (rather than imported) so kalshi-nlow stays a\n * standalone file matching the Python module split. The two functions\n * are byte-identical by design.\n */\nfunction coerceContractDate(value: Date | string): string {\n if (typeof value === \"string\") {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n throw new ContractIdError(\n `settlementDate string must be YYYY-MM-DD; got ${JSON.stringify(value)}`,\n );\n }\n const parsed = new Date(`${value}T00:00:00Z`);\n if (Number.isNaN(parsed.getTime())) {\n throw new ContractIdError(\n `settlementDate string is not a valid calendar date; got ${JSON.stringify(value)}`,\n );\n }\n const iso = parsed.toISOString().slice(0, 10);\n if (iso !== value) {\n throw new ContractIdError(\n `settlementDate string is not a valid calendar date; got ${JSON.stringify(value)}`,\n );\n }\n return value;\n }\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) {\n throw new ContractIdError(\"settlementDate is an invalid Date instance\");\n }\n if (\n value.getUTCHours() !== 0 ||\n value.getUTCMinutes() !== 0 ||\n value.getUTCSeconds() !== 0 ||\n value.getUTCMilliseconds() !== 0\n ) {\n throw new ContractIdError(\n `settlementDate must be a UTC date-only Date (H/M/S/ms = 0); got ${value.toISOString()}. Use new Date('YYYY-MM-DDT00:00:00Z') or pass a 'YYYY-MM-DD' string.`,\n );\n }\n return value.toISOString().slice(0, 10);\n }\n throw new ContractIdError(\"settlementDate must be a Date instance or YYYY-MM-DD string\");\n}\n\n/**\n * Resolve a Kalshi NLOW contract to its settlement source + station.\n *\n * The contract id format is `KLOW<CITY>` (case-insensitive), where\n * `<CITY>` is a city ticker present in\n * {@link KALSHI_SETTLEMENT_STATIONS}.\n *\n * @param contractId Kalshi market identifier. Case-insensitive.\n * @param settlementDate Calendar date the market settles for. Either a\n * UTC date-only `Date` (H/M/S/ms == 0) or a `YYYY-MM-DD` string.\n * @returns A frozen {@link NLowResolution}.\n * @throws {ContractIdError} The contract id doesn't follow\n * `KLOW<CITY>`, the city is unknown, or the settlement date is\n * invalid.\n */\nexport function kalshiNlowResolve(\n contractId: string,\n settlementDate: Date | string,\n): NLowResolution {\n if (typeof contractId !== \"string\") {\n throw new ContractIdError(`contractId must be a string; got ${typeof contractId}`);\n }\n\n const contractDate = coerceContractDate(settlementDate);\n\n const cid = contractId.toUpperCase();\n if (!cid.startsWith(\"KLOW\") || cid.length <= 4) {\n throw new ContractIdError(\n `NLOW contractId must follow 'KLOW<CITY>' format; got ${JSON.stringify(contractId)}`,\n );\n }\n const cityTicker = cid.slice(4);\n const station = KALSHI_SETTLEMENT_STATIONS[cityTicker];\n if (station === undefined) {\n const known = Object.keys(KALSHI_SETTLEMENT_STATIONS).sort();\n throw new ContractIdError(\n `unknown city ${JSON.stringify(cityTicker)} (known: ${known.join(\", \")})`,\n );\n }\n\n return Object.freeze({\n settlementSource: \"cli.archive\" as const,\n settlementStation: station.station,\n cityTicker,\n contractDate,\n });\n}\n","// TS-W5 Wave 5 — kalshiSettlementFor higher-level helper.\n//\n// Dispatch by Kalshi contract-id prefix (KHIGH* vs KLOW*) to the right\n// resolver. Returns the same shape both NHIGH and NLOW resolvers use so\n// downstream consumers don't need to know about the city-suffix split.\n\nimport { type NHighResolution, kalshiNhighResolve } from \"./resolvers/kalshi-nhigh.js\";\nimport { ContractIdError } from \"./resolvers/kalshi-nhigh.js\";\nimport { type NLowResolution, kalshiNlowResolve } from \"./resolvers/kalshi-nlow.js\";\n\nexport type KalshiSettlement = NHighResolution | NLowResolution;\n\n/**\n * Resolve a Kalshi NHIGH or NLOW contract id to its settlement metadata.\n *\n * `KHIGH*` prefixes dispatch to the NHIGH resolver; `KLOW*` prefixes\n * dispatch to NLOW. Anything else raises `ContractIdError`.\n *\n * @example\n * kalshiSettlementFor(\"KHIGHNYC\", \"2025-01-06\")\n * // → { settlementSource: \"cli.archive\", settlementStation: \"KNYC\",\n * // cityTicker: \"NYC\", contractDate: \"2025-01-06\" }\n */\nexport function kalshiSettlementFor(contractId: string, date: string): KalshiSettlement {\n if (typeof contractId !== \"string\" || contractId.length === 0) {\n throw new ContractIdError(\"contractId must be a non-empty string\");\n }\n const upper = contractId.toUpperCase();\n if (upper.startsWith(\"KHIGH\")) return kalshiNhighResolve(upper, date);\n if (upper.startsWith(\"KLOW\")) return kalshiNlowResolve(upper, date);\n throw new ContractIdError(\n `contractId ${JSON.stringify(contractId)} does not start with KHIGH or KLOW`,\n );\n}\n"],"mappings":"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","names":["coerceContractDate"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/data/generated/kalshi-stations.ts","../src/data/generated/polymarket-city-stations.ts","../src/resolvers/kalshi-nhigh.ts","../src/resolvers/kalshi-nlow.ts","../src/kalshi-settlement.ts"],"sourcesContent":["// @mostlyrightmd/markets — placeholder scaffold for TS-W0 Wave 1.\n// Real implementation (Kalshi NHIGH/NLOW resolvers, Polymarket discover/settle) lands in TS-W1+.\n\n/**\n * Placeholder version string from the TS-W0 Wave 1 scaffold. The\n * authoritative package version lives in `package.json#version`\n * (currently `0.1.0-rc.7`); this constant has not been bumped.\n */\nexport const version = \"0.0.0\";\n\n/**\n * Smoke-test export from the TS-W0 Wave 1 scaffold. Returns the literal\n * string `\"hello @mostlyrightmd/markets\"`. Retained so the published\n * package has at least one importable runtime export until the scaffold\n * is removed in a later phase.\n */\nexport function helloMarkets(): string {\n return \"hello @mostlyrightmd/markets\";\n}\n\n// Re-export generated data (NOT auto-generated; hand-maintained barrel).\n// The targets ARE auto-generated by @mostlyrightmd/codegen — see packages-ts/codegen.\nexport * from \"./data/generated/index.js\";\n\n// Kalshi NHIGH/NLOW resolvers (TS-W1 Wave 2).\nexport * from \"./resolvers/index.js\";\n\n// Kalshi settlement helper (TS-W5 Wave 5) — higher-level dispatch by\n// prefix (KHIGH* vs KLOW*).\nexport { kalshiSettlementFor } from \"./kalshi-settlement.js\";\nexport type { KalshiSettlement } from \"./kalshi-settlement.js\";\n\n// NOTE: Polymarket discover/settle (TS-W5 Waves 1-4) live at the\n// `./polymarket` subpath, NOT the root barrel — keeps the IIFE bundle\n// lean (Polymarket is server-side by design; CORS-blocked from\n// browsers per .planning/research/TS-CORS-MATRIX.md). Import with:\n//\n// import { polymarketDiscover, polymarketSettle } from \"@mostlyrightmd/markets/polymarket\";\n","// AUTO-GENERATED by @mostlyrightmd/codegen from schemas/kalshi-settlement-stations.json.\n// DO NOT EDIT — regenerate with: pnpm codegen\n// Last manifest SHA recorded in schemas/EXPORT_MANIFEST.json\n\nexport interface KalshiStation {\n station: string;\n citation: string;\n}\n\nexport const KALSHI_SETTLEMENT_STATIONS: Readonly<Record<string, KalshiStation>> = {\n ATL: {\n citation: \"https://kalshi.com/markets/khighatl (Atlanta Hartsfield-Jackson)\",\n station: \"KATL\",\n },\n AUS: {\n citation: \"https://kalshi.com/markets/khighaus (Austin-Bergstrom; the only Austin station Kalshi cites)\",\n station: \"KAUS\",\n },\n BNA: {\n citation: \"https://kalshi.com/markets/khighbna (Nashville International)\",\n station: \"KBNA\",\n },\n BOS: {\n citation: \"https://kalshi.com/markets/khighbos (Boston Logan)\",\n station: \"KBOS\",\n },\n CHI: {\n citation: \"https://kalshi.com/markets/khighchi (Midway, NOT ORD)\",\n station: \"KMDW\",\n },\n CVG: {\n citation: \"https://kalshi.com/markets/khighcvg (Cincinnati/Northern Kentucky International)\",\n station: \"KCVG\",\n },\n DAL: {\n citation: \"https://kalshi.com/markets/khighdal (DFW, NOT Love Field)\",\n station: \"KDFW\",\n },\n DCA: {\n citation: \"https://kalshi.com/markets/khighdca (Reagan National, NOT Dulles or BWI)\",\n station: \"KDCA\",\n },\n DEN: {\n citation: \"https://kalshi.com/markets/khighden (Denver International)\",\n station: \"KDEN\",\n },\n DTW: {\n citation: \"https://kalshi.com/markets/khighdtw (Detroit Metropolitan)\",\n station: \"KDTW\",\n },\n HOU: {\n citation: \"https://kalshi.com/markets/khighhou (Intercontinental, NOT Hobby; Kalshi cites IAH)\",\n station: \"KIAH\",\n },\n LAX: {\n citation: \"https://kalshi.com/markets/khighlax (LAX international)\",\n station: \"KLAX\",\n },\n MIA: {\n citation: \"https://kalshi.com/markets/khighmia (Miami International)\",\n station: \"KMIA\",\n },\n MSP: {\n citation: \"https://kalshi.com/markets/khighmsp (Minneapolis-St. Paul International)\",\n station: \"KMSP\",\n },\n NYC: {\n citation: \"https://kalshi.com/markets/khighny (Central Park, NOT LGA/JFK)\",\n station: \"KNYC\",\n },\n PHL: {\n citation: \"https://kalshi.com/markets/khighphl (Philadelphia International)\",\n station: \"KPHL\",\n },\n PHX: {\n citation: \"https://kalshi.com/markets/khighphx (Sky Harbor International)\",\n station: \"KPHX\",\n },\n SEA: {\n citation: \"https://kalshi.com/markets/khighsea (SeaTac, NOT BFI)\",\n station: \"KSEA\",\n },\n SFO: {\n citation: \"https://kalshi.com/markets/khighsfo (San Francisco International, NOT OAK)\",\n station: \"KSFO\",\n },\n SLC: {\n citation: \"https://kalshi.com/markets/khighslc (Salt Lake City International)\",\n station: \"KSLC\",\n },\n TLV: {\n citation: \"https://kalshi.com/markets/kxhightlv (Harry Reid/McCarran; settles vs NWS CLILAS)\",\n station: \"KLAS\",\n },\n} as const;\n\nexport const KNOWN_WRONG_STATIONS: ReadonlySet<string> = new Set<string>([\n \"KBWI\",\n \"KDAL\",\n \"KEWR\",\n \"KHOU\",\n \"KIAD\",\n \"KJFK\",\n \"KLGA\",\n \"KOAK\",\n \"KORD\",\n]);\n","// AUTO-GENERATED by @mostlyrightmd/codegen from schemas/polymarket-city-stations.json.\n// DO NOT EDIT — regenerate with: pnpm codegen\n// Last manifest SHA recorded in schemas/EXPORT_MANIFEST.json\n\nexport interface PolymarketCityStation {\n default: string;\n high?: string;\n low?: string;\n [measure: string]: string | undefined;\n}\n\nexport const POLYMARKET_CITY_STATIONS: Readonly<Record<string, PolymarketCityStation>> = {\n amsterdam: {\n default: \"EHAM\",\n },\n ankara: {\n default: \"LTAC\",\n },\n atlanta: {\n default: \"KATL\",\n },\n austin: {\n default: \"KAUS\",\n },\n beijing: {\n default: \"ZBAA\",\n },\n buenos_aires: {\n default: \"SAEZ\",\n },\n busan: {\n default: \"RKPK\",\n },\n cape_town: {\n default: \"FACT\",\n },\n chengdu: {\n default: \"ZUUU\",\n },\n chicago: {\n default: \"KORD\",\n high: \"KORD\",\n low: \"KORD\",\n },\n chongqing: {\n default: \"ZUCK\",\n },\n dallas: {\n default: \"KDAL\",\n },\n denver: {\n default: \"KBKF\",\n },\n guangzhou: {\n default: \"ZGGG\",\n },\n helsinki: {\n default: \"EFHK\",\n },\n hong_kong: {\n default: \"HKO\",\n high: \"HKO\",\n low: \"HKO\",\n },\n houston: {\n default: \"KHOU\",\n },\n istanbul: {\n default: \"LTFM\",\n },\n jeddah: {\n default: \"OEJN\",\n },\n jinan: {\n default: \"ZSJN\",\n },\n karachi: {\n default: \"OPKC\",\n },\n kuala_lumpur: {\n default: \"WMKK\",\n },\n london: {\n default: \"EGLC\",\n },\n los_angeles: {\n default: \"KLAX\",\n high: \"KLAX\",\n low: \"KLAX\",\n },\n lucknow: {\n default: \"VILK\",\n },\n madrid: {\n default: \"LEMD\",\n },\n manila: {\n default: \"RPLL\",\n },\n mexico_city: {\n default: \"MMMX\",\n },\n miami: {\n default: \"KMIA\",\n },\n milan: {\n default: \"LIMC\",\n },\n moscow: {\n default: \"UUWW\",\n },\n munich: {\n default: \"EDDM\",\n },\n nyc: {\n default: \"KLGA\",\n high: \"KLGA\",\n low: \"KLGA\",\n },\n panama_city: {\n default: \"MPMG\",\n },\n paris: {\n default: \"LFPB\",\n },\n qingdao: {\n default: \"ZSQD\",\n },\n san_francisco: {\n default: \"KSFO\",\n },\n sao_paulo: {\n default: \"SBGR\",\n },\n seattle: {\n default: \"KSEA\",\n },\n seoul: {\n default: \"RKSI\",\n },\n shanghai: {\n default: \"ZSPD\",\n },\n shenzhen: {\n default: \"ZGSZ\",\n },\n singapore: {\n default: \"WSSS\",\n },\n taipei: {\n default: \"RCSS\",\n },\n tel_aviv: {\n default: \"LLBG\",\n },\n tokyo: {\n default: \"RJTT\",\n high: \"RJTT\",\n low: \"RJTT\",\n },\n toronto: {\n default: \"CYYZ\",\n },\n warsaw: {\n default: \"EPWA\",\n },\n wellington: {\n default: \"NZWN\",\n },\n wuhan: {\n default: \"ZHHH\",\n },\n zhengzhou: {\n default: \"ZHCC\",\n },\n} as const;\n","// Kalshi NHIGH (daily HIGH temperature) contract resolver.\n//\n// NHIGH markets resolve against the NWS CLI `max_temp_f` value for a\n// specific station on a specific date. `kalshiNhighResolve` is the\n// deterministic mapping from a Kalshi market identifier to the\n// (settlement_source, settlement_station) tuple downstream code uses\n// to pull the right settlement row from the CLI catalog.\n//\n// Ported byte-faithful from packages/markets/src/mostlyright/markets/catalog/kalshi_nhigh.py.\n\nimport { KALSHI_SETTLEMENT_STATIONS } from \"../data/generated/kalshi-stations.js\";\n\nexport interface NHighResolution {\n readonly settlementSource: \"cli.archive\";\n readonly settlementStation: string; // 4-letter ICAO\n readonly cityTicker: string;\n readonly contractDate: string; // YYYY-MM-DD\n}\n\n/**\n * Custom error type for contract-id parsing / validation failures.\n *\n * Mirrors the Python `ValueError`/`TypeError` distinction: in TS we use a\n * named subclass so callers can `instanceof`-check rather than parse\n * error messages.\n */\nexport class ContractIdError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ContractIdError\";\n }\n}\n\n/**\n * Coerce a Date or YYYY-MM-DD string into an ISO date-only string.\n *\n * Rejects Date instances whose UTC hours/minutes/seconds/ms are non-zero —\n * those would silently corrupt downstream settlement-date matching\n * (date-equality is strict).\n *\n * Mirrors the Python `isinstance(settlement_date, datetime)` guard in\n * `kalshi_nhigh.resolve`.\n */\nfunction coerceContractDate(value: Date | string): string {\n if (typeof value === \"string\") {\n // YYYY-MM-DD strict format check.\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n throw new ContractIdError(\n `settlementDate string must be YYYY-MM-DD; got ${JSON.stringify(value)}`,\n );\n }\n // Validate it parses to a real calendar date.\n const parsed = new Date(`${value}T00:00:00Z`);\n if (Number.isNaN(parsed.getTime())) {\n throw new ContractIdError(\n `settlementDate string is not a valid calendar date; got ${JSON.stringify(value)}`,\n );\n }\n // Round-trip check — guards against e.g. \"2025-02-30\" silently\n // rolling forward.\n const iso = parsed.toISOString().slice(0, 10);\n if (iso !== value) {\n throw new ContractIdError(\n `settlementDate string is not a valid calendar date; got ${JSON.stringify(value)}`,\n );\n }\n return value;\n }\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) {\n throw new ContractIdError(\"settlementDate is an invalid Date instance\");\n }\n // Reject any Date with a non-zero UTC time component — mirrors\n // Python's `isinstance(settlement_date, datetime)` guard. A Date\n // carries a time component which would break downstream\n // date-equality matching.\n if (\n value.getUTCHours() !== 0 ||\n value.getUTCMinutes() !== 0 ||\n value.getUTCSeconds() !== 0 ||\n value.getUTCMilliseconds() !== 0\n ) {\n throw new ContractIdError(\n `settlementDate must be a UTC date-only Date (H/M/S/ms = 0); got ${value.toISOString()}. Use new Date('YYYY-MM-DDT00:00:00Z') or pass a 'YYYY-MM-DD' string.`,\n );\n }\n return value.toISOString().slice(0, 10);\n }\n throw new ContractIdError(\"settlementDate must be a Date instance or YYYY-MM-DD string\");\n}\n\n/**\n * Resolve a Kalshi NHIGH contract to its settlement source + station.\n *\n * The contract id format is `KHIGH<CITY>` (case-insensitive), where\n * `<CITY>` is a city ticker present in\n * {@link KALSHI_SETTLEMENT_STATIONS}.\n *\n * @param contractId Kalshi market identifier. Case-insensitive.\n * @param settlementDate Calendar date the market settles for. Either a\n * UTC date-only `Date` (H/M/S/ms == 0) or a `YYYY-MM-DD` string.\n * @returns A frozen {@link NHighResolution}.\n * @throws {ContractIdError} The contract id doesn't follow\n * `KHIGH<CITY>`, the city is unknown, or the settlement date is\n * invalid.\n */\nexport function kalshiNhighResolve(\n contractId: string,\n settlementDate: Date | string,\n): NHighResolution {\n if (typeof contractId !== \"string\") {\n throw new ContractIdError(`contractId must be a string; got ${typeof contractId}`);\n }\n\n const contractDate = coerceContractDate(settlementDate);\n\n const cid = contractId.toUpperCase();\n if (!cid.startsWith(\"KHIGH\") || cid.length <= 5) {\n throw new ContractIdError(\n `NHIGH contractId must follow 'KHIGH<CITY>' format; got ${JSON.stringify(contractId)}`,\n );\n }\n const cityTicker = cid.slice(5);\n const station = KALSHI_SETTLEMENT_STATIONS[cityTicker];\n if (station === undefined) {\n const known = Object.keys(KALSHI_SETTLEMENT_STATIONS).sort();\n throw new ContractIdError(\n `unknown city ${JSON.stringify(cityTicker)} (known: ${known.join(\", \")})`,\n );\n }\n\n return Object.freeze({\n settlementSource: \"cli.archive\" as const,\n settlementStation: station.station,\n cityTicker,\n contractDate,\n });\n}\n","// Kalshi NLOW (daily LOW temperature) contract resolver.\n//\n// Mirror of kalshi-nhigh — same station whitelist + same source\n// (cli.archive); only the metric differs. NLOW markets resolve against\n// the NWS CLI `min_temp_f` value for a specific station on a specific\n// date.\n//\n// Ported byte-faithful from packages/markets/src/mostlyright/markets/catalog/kalshi_nlow.py.\n\nimport { KALSHI_SETTLEMENT_STATIONS } from \"../data/generated/kalshi-stations.js\";\nimport { ContractIdError } from \"./kalshi-nhigh.js\";\n\nexport interface NLowResolution {\n readonly settlementSource: \"cli.archive\";\n readonly settlementStation: string; // 4-letter ICAO\n readonly cityTicker: string;\n readonly contractDate: string; // YYYY-MM-DD\n}\n\n/**\n * Coerce a Date or YYYY-MM-DD string into an ISO date-only string.\n *\n * Rejects Date instances whose UTC hours/minutes/seconds/ms are non-zero —\n * those would silently corrupt downstream settlement-date matching.\n *\n * Mirrors the Python `isinstance(settlement_date, datetime)` guard.\n *\n * Note: duplicated here (rather than imported) so kalshi-nlow stays a\n * standalone file matching the Python module split. The two functions\n * are byte-identical by design.\n */\nfunction coerceContractDate(value: Date | string): string {\n if (typeof value === \"string\") {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n throw new ContractIdError(\n `settlementDate string must be YYYY-MM-DD; got ${JSON.stringify(value)}`,\n );\n }\n const parsed = new Date(`${value}T00:00:00Z`);\n if (Number.isNaN(parsed.getTime())) {\n throw new ContractIdError(\n `settlementDate string is not a valid calendar date; got ${JSON.stringify(value)}`,\n );\n }\n const iso = parsed.toISOString().slice(0, 10);\n if (iso !== value) {\n throw new ContractIdError(\n `settlementDate string is not a valid calendar date; got ${JSON.stringify(value)}`,\n );\n }\n return value;\n }\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) {\n throw new ContractIdError(\"settlementDate is an invalid Date instance\");\n }\n if (\n value.getUTCHours() !== 0 ||\n value.getUTCMinutes() !== 0 ||\n value.getUTCSeconds() !== 0 ||\n value.getUTCMilliseconds() !== 0\n ) {\n throw new ContractIdError(\n `settlementDate must be a UTC date-only Date (H/M/S/ms = 0); got ${value.toISOString()}. Use new Date('YYYY-MM-DDT00:00:00Z') or pass a 'YYYY-MM-DD' string.`,\n );\n }\n return value.toISOString().slice(0, 10);\n }\n throw new ContractIdError(\"settlementDate must be a Date instance or YYYY-MM-DD string\");\n}\n\n/**\n * Resolve a Kalshi NLOW contract to its settlement source + station.\n *\n * The contract id format is `KLOW<CITY>` (case-insensitive), where\n * `<CITY>` is a city ticker present in\n * {@link KALSHI_SETTLEMENT_STATIONS}.\n *\n * @param contractId Kalshi market identifier. Case-insensitive.\n * @param settlementDate Calendar date the market settles for. Either a\n * UTC date-only `Date` (H/M/S/ms == 0) or a `YYYY-MM-DD` string.\n * @returns A frozen {@link NLowResolution}.\n * @throws {ContractIdError} The contract id doesn't follow\n * `KLOW<CITY>`, the city is unknown, or the settlement date is\n * invalid.\n */\nexport function kalshiNlowResolve(\n contractId: string,\n settlementDate: Date | string,\n): NLowResolution {\n if (typeof contractId !== \"string\") {\n throw new ContractIdError(`contractId must be a string; got ${typeof contractId}`);\n }\n\n const contractDate = coerceContractDate(settlementDate);\n\n const cid = contractId.toUpperCase();\n if (!cid.startsWith(\"KLOW\") || cid.length <= 4) {\n throw new ContractIdError(\n `NLOW contractId must follow 'KLOW<CITY>' format; got ${JSON.stringify(contractId)}`,\n );\n }\n const cityTicker = cid.slice(4);\n const station = KALSHI_SETTLEMENT_STATIONS[cityTicker];\n if (station === undefined) {\n const known = Object.keys(KALSHI_SETTLEMENT_STATIONS).sort();\n throw new ContractIdError(\n `unknown city ${JSON.stringify(cityTicker)} (known: ${known.join(\", \")})`,\n );\n }\n\n return Object.freeze({\n settlementSource: \"cli.archive\" as const,\n settlementStation: station.station,\n cityTicker,\n contractDate,\n });\n}\n","// TS-W5 Wave 5 — kalshiSettlementFor higher-level helper.\n//\n// Dispatch by Kalshi contract-id prefix (KHIGH* vs KLOW*) to the right\n// resolver. Returns the same shape both NHIGH and NLOW resolvers use so\n// downstream consumers don't need to know about the city-suffix split.\n\nimport { type NHighResolution, kalshiNhighResolve } from \"./resolvers/kalshi-nhigh.js\";\nimport { ContractIdError } from \"./resolvers/kalshi-nhigh.js\";\nimport { type NLowResolution, kalshiNlowResolve } from \"./resolvers/kalshi-nlow.js\";\n\nexport type KalshiSettlement = NHighResolution | NLowResolution;\n\n/**\n * Resolve a Kalshi NHIGH or NLOW contract id to its settlement metadata.\n *\n * `KHIGH*` prefixes dispatch to the NHIGH resolver; `KLOW*` prefixes\n * dispatch to NLOW. Anything else raises `ContractIdError`.\n *\n * @example\n * kalshiSettlementFor(\"KHIGHNYC\", \"2025-01-06\")\n * // → { settlementSource: \"cli.archive\", settlementStation: \"KNYC\",\n * // cityTicker: \"NYC\", contractDate: \"2025-01-06\" }\n */\nexport function kalshiSettlementFor(contractId: string, date: string): KalshiSettlement {\n if (typeof contractId !== \"string\" || contractId.length === 0) {\n throw new ContractIdError(\"contractId must be a non-empty string\");\n }\n const upper = contractId.toUpperCase();\n if (upper.startsWith(\"KHIGH\")) return kalshiNhighResolve(upper, date);\n if (upper.startsWith(\"KLOW\")) return kalshiNlowResolve(upper, date);\n throw new ContractIdError(\n `contractId ${JSON.stringify(contractId)} does not start with KHIGH or KLOW`,\n );\n}\n"],"mappings":"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","names":["coerceContractDate"]}
@@ -136,92 +136,92 @@ var mostlyrightMarkets = (() => {
136
136
  amsterdam: {
137
137
  default: "EHAM"
138
138
  },
139
+ ankara: {
140
+ default: "LTAC"
141
+ },
139
142
  atlanta: {
140
143
  default: "KATL"
141
144
  },
142
- auckland: {
143
- default: "NZAA"
144
- },
145
145
  austin: {
146
146
  default: "KAUS"
147
147
  },
148
- bangkok: {
149
- default: "VTBS"
150
- },
151
- barcelona: {
152
- default: "LEBL"
153
- },
154
148
  beijing: {
155
149
  default: "ZBAA"
156
150
  },
157
- berlin: {
158
- default: "EDDB"
151
+ buenos_aires: {
152
+ default: "SAEZ"
159
153
  },
160
- boston: {
161
- default: "KBOS"
154
+ busan: {
155
+ default: "RKPK"
162
156
  },
163
- brisbane: {
164
- default: "YBBN"
157
+ cape_town: {
158
+ default: "FACT"
165
159
  },
166
- buenos_aires: {
167
- default: "SAEZ"
160
+ chengdu: {
161
+ default: "ZUUU"
168
162
  },
169
163
  chicago: {
170
164
  default: "KORD",
171
165
  high: "KORD",
172
166
  low: "KORD"
173
167
  },
174
- copenhagen: {
175
- default: "EKCH"
168
+ chongqing: {
169
+ default: "ZUCK"
176
170
  },
177
171
  dallas: {
178
- default: "KDFW"
179
- },
180
- delhi: {
181
- default: "VIDP"
172
+ default: "KDAL"
182
173
  },
183
174
  denver: {
184
- default: "KDEN"
175
+ default: "KBKF"
185
176
  },
186
- detroit: {
187
- default: "KDTW"
188
- },
189
- doha: {
190
- default: "OTHH"
191
- },
192
- dubai: {
193
- default: "OMDB"
194
- },
195
- frankfurt: {
196
- default: "EDDF"
177
+ guangzhou: {
178
+ default: "ZGGG"
197
179
  },
198
180
  helsinki: {
199
181
  default: "EFHK"
200
182
  },
201
183
  hong_kong: {
202
- default: "VHHH",
203
- high: "VHHH",
204
- low: "VHHH"
184
+ default: "HKO",
185
+ high: "HKO",
186
+ low: "HKO"
205
187
  },
206
188
  houston: {
207
- default: "KIAH"
189
+ default: "KHOU"
208
190
  },
209
- london: {
210
- default: "EGLL"
191
+ istanbul: {
192
+ default: "LTFM"
193
+ },
194
+ jeddah: {
195
+ default: "OEJN"
196
+ },
197
+ jinan: {
198
+ default: "ZSJN"
199
+ },
200
+ karachi: {
201
+ default: "OPKC"
202
+ },
203
+ kuala_lumpur: {
204
+ default: "WMKK"
211
205
  },
212
- london_gatwick: {
213
- default: "EGKK"
206
+ london: {
207
+ default: "EGLC"
214
208
  },
215
209
  los_angeles: {
216
210
  default: "KLAX",
217
211
  high: "KLAX",
218
212
  low: "KLAX"
219
213
  },
214
+ lucknow: {
215
+ default: "VILK"
216
+ },
220
217
  madrid: {
221
218
  default: "LEMD"
222
219
  },
223
- melbourne: {
224
- default: "YMML"
220
+ manila: {
221
+ default: "RPLL"
222
+ },
223
+ mexico_city: {
224
+ default: "MMMX"
225
225
  },
226
226
  miami: {
227
227
  default: "KMIA"
@@ -229,14 +229,8 @@ var mostlyrightMarkets = (() => {
229
229
  milan: {
230
230
  default: "LIMC"
231
231
  },
232
- minneapolis: {
233
- default: "KMSP"
234
- },
235
232
  moscow: {
236
- default: "UUEE"
237
- },
238
- mumbai: {
239
- default: "VABB"
233
+ default: "UUWW"
240
234
  },
241
235
  munich: {
242
236
  default: "EDDM"
@@ -246,25 +240,14 @@ var mostlyrightMarkets = (() => {
246
240
  high: "KLGA",
247
241
  low: "KLGA"
248
242
  },
249
- paris: {
250
- default: "LFPG",
251
- high: "LFPG",
252
- low: "LFPB"
253
- },
254
- paris_orly: {
255
- default: "LFPO"
256
- },
257
- philadelphia: {
258
- default: "KPHL"
259
- },
260
- phoenix: {
261
- default: "KPHX"
243
+ panama_city: {
244
+ default: "MPMG"
262
245
  },
263
- riyadh: {
264
- default: "OERK"
246
+ paris: {
247
+ default: "LFPB"
265
248
  },
266
- rome: {
267
- default: "LIRF"
249
+ qingdao: {
250
+ default: "ZSQD"
268
251
  },
269
252
  san_francisco: {
270
253
  default: "KSFO"
@@ -281,40 +264,37 @@ var mostlyrightMarkets = (() => {
281
264
  shanghai: {
282
265
  default: "ZSPD"
283
266
  },
267
+ shenzhen: {
268
+ default: "ZGSZ"
269
+ },
284
270
  singapore: {
285
271
  default: "WSSS"
286
272
  },
287
- stockholm: {
288
- default: "ESSA"
289
- },
290
- sydney: {
291
- default: "YSSY"
292
- },
293
273
  taipei: {
294
- default: "RCTP"
274
+ default: "RCSS"
275
+ },
276
+ tel_aviv: {
277
+ default: "LLBG"
295
278
  },
296
279
  tokyo: {
297
280
  default: "RJTT",
298
281
  high: "RJTT",
299
282
  low: "RJTT"
300
283
  },
301
- tokyo_narita: {
302
- default: "RJAA"
303
- },
304
- vienna: {
305
- default: "LOWW"
284
+ toronto: {
285
+ default: "CYYZ"
306
286
  },
307
287
  warsaw: {
308
288
  default: "EPWA"
309
289
  },
310
- washington_dc: {
311
- default: "KDCA"
312
- },
313
290
  wellington: {
314
291
  default: "NZWN"
315
292
  },
316
- zurich: {
317
- default: "LSZH"
293
+ wuhan: {
294
+ default: "ZHHH"
295
+ },
296
+ zhengzhou: {
297
+ default: "ZHCC"
318
298
  }
319
299
  };
320
300