@usherlabs/cex-broker 0.1.12 → 0.1.15

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.
@@ -26948,9 +26948,11 @@ var require_websocket_server = __commonJS((exports, module) => {
26948
26948
  abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);
26949
26949
  return;
26950
26950
  }
26951
- if (version !== 8 && version !== 13) {
26951
+ if (version !== 13 && version !== 8) {
26952
26952
  const message = "Missing or invalid Sec-WebSocket-Version header";
26953
- abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);
26953
+ abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {
26954
+ "Sec-WebSocket-Version": "13, 8"
26955
+ });
26954
26956
  return;
26955
26957
  }
26956
26958
  if (!this.shouldHandle(req)) {
@@ -27089,13 +27091,13 @@ var require_websocket_server = __commonJS((exports, module) => {
27089
27091
  \r
27090
27092
  ` + message);
27091
27093
  }
27092
- function abortHandshakeOrEmitwsClientError(server, req, socket, code, message) {
27094
+ function abortHandshakeOrEmitwsClientError(server, req, socket, code, message, headers) {
27093
27095
  if (server.listenerCount("wsClientError")) {
27094
27096
  const err = new Error(message);
27095
27097
  Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);
27096
27098
  server.emit("wsClientError", err, socket, req);
27097
27099
  } else {
27098
- abortHandshake(socket, code, message);
27100
+ abortHandshake(socket, code, message, headers);
27099
27101
  }
27100
27102
  }
27101
27103
  });
@@ -36912,6 +36914,7 @@ var require_form_data = __commonJS((exports, module) => {
36912
36914
  var parseUrl = __require("url").parse;
36913
36915
  var fs = __require("fs");
36914
36916
  var Stream2 = __require("stream").Stream;
36917
+ var crypto3 = __require("crypto");
36915
36918
  var mime = require_mime_types();
36916
36919
  var asynckit = require_asynckit();
36917
36920
  var setToStringTag = require_es_set_tostringtag();
@@ -37116,11 +37119,7 @@ var require_form_data = __commonJS((exports, module) => {
37116
37119
  return Buffer.concat([dataBuffer, Buffer.from(this._lastBoundary())]);
37117
37120
  };
37118
37121
  FormData2.prototype._generateBoundary = function() {
37119
- var boundary = "--------------------------";
37120
- for (var i2 = 0;i2 < 24; i2++) {
37121
- boundary += Math.floor(Math.random() * 10).toString(16);
37122
- }
37123
- this._boundary = boundary;
37122
+ this._boundary = "--------------------------" + crypto3.randomBytes(12).toString("hex");
37124
37123
  };
37125
37124
  FormData2.prototype.getLengthSync = function() {
37126
37125
  var knownLength = this._overheadLength + this._valueLength;
@@ -38188,7 +38187,7 @@ var require_follow_redirects = __commonJS((exports, module) => {
38188
38187
 
38189
38188
  // node_modules/axios/dist/node/axios.cjs
38190
38189
  var require_axios = __commonJS((exports, module) => {
38191
- /*! Axios v1.10.0 Copyright (c) 2025 Matt Zabriskie and contributors */
38190
+ /*! Axios v1.11.0 Copyright (c) 2025 Matt Zabriskie and contributors */
38192
38191
  var FormData$1 = require_form_data();
38193
38192
  var crypto4 = __require("crypto");
38194
38193
  var url2 = __require("url");
@@ -38257,6 +38256,16 @@ var require_axios = __commonJS((exports, module) => {
38257
38256
  const prototype4 = getPrototypeOf2(val);
38258
38257
  return (prototype4 === null || prototype4 === Object.prototype || Object.getPrototypeOf(prototype4) === null) && !(toStringTag2 in val) && !(iterator2 in val);
38259
38258
  };
38259
+ var isEmptyObject2 = (val) => {
38260
+ if (!isObject3(val) || isBuffer2(val)) {
38261
+ return false;
38262
+ }
38263
+ try {
38264
+ return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;
38265
+ } catch (e) {
38266
+ return false;
38267
+ }
38268
+ };
38260
38269
  var isDate2 = kindOfTest2("Date");
38261
38270
  var isFile2 = kindOfTest2("File");
38262
38271
  var isBlob2 = kindOfTest2("Blob");
@@ -38283,6 +38292,9 @@ var require_axios = __commonJS((exports, module) => {
38283
38292
  fn.call(null, obj[i2], i2, obj);
38284
38293
  }
38285
38294
  } else {
38295
+ if (isBuffer2(obj)) {
38296
+ return;
38297
+ }
38286
38298
  const keys2 = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
38287
38299
  const len = keys2.length;
38288
38300
  let key;
@@ -38293,6 +38305,9 @@ var require_axios = __commonJS((exports, module) => {
38293
38305
  }
38294
38306
  }
38295
38307
  function findKey2(obj, key) {
38308
+ if (isBuffer2(obj)) {
38309
+ return null;
38310
+ }
38296
38311
  key = key.toLowerCase();
38297
38312
  const keys2 = Object.keys(obj);
38298
38313
  let i2 = keys2.length;
@@ -38485,6 +38500,9 @@ var require_axios = __commonJS((exports, module) => {
38485
38500
  if (stack.indexOf(source) >= 0) {
38486
38501
  return;
38487
38502
  }
38503
+ if (isBuffer2(source)) {
38504
+ return source;
38505
+ }
38488
38506
  if (!("toJSON" in source)) {
38489
38507
  stack[i2] = source;
38490
38508
  const target = isArray3(source) ? [] : {};
@@ -38531,6 +38549,7 @@ var require_axios = __commonJS((exports, module) => {
38531
38549
  isBoolean: isBoolean3,
38532
38550
  isObject: isObject3,
38533
38551
  isPlainObject: isPlainObject2,
38552
+ isEmptyObject: isEmptyObject2,
38534
38553
  isReadableStream: isReadableStream2,
38535
38554
  isRequest: isRequest2,
38536
38555
  isResponse: isResponse2,
@@ -38896,15 +38915,16 @@ var require_axios = __commonJS((exports, module) => {
38896
38915
  ...platform$1
38897
38916
  };
38898
38917
  function toURLEncodedForm2(data, options) {
38899
- return toFormData2(data, new platform2.classes.URLSearchParams, Object.assign({
38918
+ return toFormData2(data, new platform2.classes.URLSearchParams, {
38900
38919
  visitor: function(value, key, path, helpers) {
38901
38920
  if (platform2.isNode && utils$1.isBuffer(value)) {
38902
38921
  this.append(key, value.toString("base64"));
38903
38922
  return false;
38904
38923
  }
38905
38924
  return helpers.defaultVisitor.apply(this, arguments);
38906
- }
38907
- }, options));
38925
+ },
38926
+ ...options
38927
+ });
38908
38928
  }
38909
38929
  function parsePropPath2(name) {
38910
38930
  return utils$1.matchAll(/\w+|\[(\w*)]/g, name).map((match) => {
@@ -39372,7 +39392,7 @@ var require_axios = __commonJS((exports, module) => {
39372
39392
  }
39373
39393
  return requestedURL;
39374
39394
  }
39375
- var VERSION2 = "1.10.0";
39395
+ var VERSION2 = "1.11.0";
39376
39396
  function parseProtocol2(url3) {
39377
39397
  const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url3);
39378
39398
  return match && match[1] || "";
@@ -39687,7 +39707,7 @@ var require_axios = __commonJS((exports, module) => {
39687
39707
  clearTimeout(timer);
39688
39708
  timer = null;
39689
39709
  }
39690
- fn.apply(null, args);
39710
+ fn(...args);
39691
39711
  };
39692
39712
  const throttled = (...args) => {
39693
39713
  const now2 = Date.now();
@@ -40288,7 +40308,7 @@ var require_axios = __commonJS((exports, module) => {
40288
40308
  validateStatus: mergeDirectKeys,
40289
40309
  headers: (a, b2, prop3) => mergeDeepProperties(headersToObject2(a), headersToObject2(b2), prop3, true)
40290
40310
  };
40291
- utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop3) {
40311
+ utils$1.forEach(Object.keys({ ...config1, ...config2 }), function computeConfigValue(prop3) {
40292
40312
  const merge4 = mergeMap[prop3] || mergeDeepProperties;
40293
40313
  const configValue = merge4(config1[prop3], config2[prop3], prop3);
40294
40314
  utils$1.isUndefined(configValue) && merge4 !== mergeDirectKeys || (config[prop3] = configValue);
@@ -40927,8 +40947,8 @@ var require_axios = __commonJS((exports, module) => {
40927
40947
  let len;
40928
40948
  if (!synchronousRequestInterceptors) {
40929
40949
  const chain2 = [dispatchRequest2.bind(this), undefined];
40930
- chain2.unshift.apply(chain2, requestInterceptorChain);
40931
- chain2.push.apply(chain2, responseInterceptorChain);
40950
+ chain2.unshift(...requestInterceptorChain);
40951
+ chain2.push(...responseInterceptorChain);
40932
40952
  len = chain2.length;
40933
40953
  promise = Promise.resolve(config);
40934
40954
  while (i2 < len) {
@@ -68180,6 +68200,16 @@ var isPlainObject = (val) => {
68180
68200
  const prototype = getPrototypeOf(val);
68181
68201
  return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);
68182
68202
  };
68203
+ var isEmptyObject = (val) => {
68204
+ if (!isObject2(val) || isBuffer(val)) {
68205
+ return false;
68206
+ }
68207
+ try {
68208
+ return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;
68209
+ } catch (e) {
68210
+ return false;
68211
+ }
68212
+ };
68183
68213
  var isDate = kindOfTest("Date");
68184
68214
  var isFile = kindOfTest("File");
68185
68215
  var isBlob = kindOfTest("Blob");
@@ -68206,6 +68236,9 @@ function forEach(obj, fn, { allOwnKeys = false } = {}) {
68206
68236
  fn.call(null, obj[i2], i2, obj);
68207
68237
  }
68208
68238
  } else {
68239
+ if (isBuffer(obj)) {
68240
+ return;
68241
+ }
68209
68242
  const keys2 = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
68210
68243
  const len = keys2.length;
68211
68244
  let key;
@@ -68216,6 +68249,9 @@ function forEach(obj, fn, { allOwnKeys = false } = {}) {
68216
68249
  }
68217
68250
  }
68218
68251
  function findKey(obj, key) {
68252
+ if (isBuffer(obj)) {
68253
+ return null;
68254
+ }
68219
68255
  key = key.toLowerCase();
68220
68256
  const keys2 = Object.keys(obj);
68221
68257
  let i2 = keys2.length;
@@ -68408,6 +68444,9 @@ var toJSONObject = (obj) => {
68408
68444
  if (stack.indexOf(source) >= 0) {
68409
68445
  return;
68410
68446
  }
68447
+ if (isBuffer(source)) {
68448
+ return source;
68449
+ }
68411
68450
  if (!("toJSON" in source)) {
68412
68451
  stack[i2] = source;
68413
68452
  const target = isArray2(source) ? [] : {};
@@ -68454,6 +68493,7 @@ var utils_default = {
68454
68493
  isBoolean: isBoolean2,
68455
68494
  isObject: isObject2,
68456
68495
  isPlainObject,
68496
+ isEmptyObject,
68457
68497
  isReadableStream,
68458
68498
  isRequest,
68459
68499
  isResponse,
@@ -68851,15 +68891,16 @@ var platform_default = {
68851
68891
 
68852
68892
  // node_modules/axios/lib/helpers/toURLEncodedForm.js
68853
68893
  function toURLEncodedForm(data, options) {
68854
- return toFormData_default(data, new platform_default.classes.URLSearchParams, Object.assign({
68894
+ return toFormData_default(data, new platform_default.classes.URLSearchParams, {
68855
68895
  visitor: function(value, key, path, helpers) {
68856
68896
  if (platform_default.isNode && utils_default.isBuffer(value)) {
68857
68897
  this.append(key, value.toString("base64"));
68858
68898
  return false;
68859
68899
  }
68860
68900
  return helpers.defaultVisitor.apply(this, arguments);
68861
- }
68862
- }, options));
68901
+ },
68902
+ ...options
68903
+ });
68863
68904
  }
68864
68905
 
68865
68906
  // node_modules/axios/lib/helpers/formDataToJSON.js
@@ -69361,7 +69402,7 @@ import util2 from "util";
69361
69402
  import zlib from "zlib";
69362
69403
 
69363
69404
  // node_modules/axios/lib/env/data.js
69364
- var VERSION = "1.10.0";
69405
+ var VERSION = "1.11.0";
69365
69406
 
69366
69407
  // node_modules/axios/lib/helpers/parseProtocol.js
69367
69408
  function parseProtocol(url2) {
@@ -69707,7 +69748,7 @@ function throttle2(fn, freq) {
69707
69748
  clearTimeout(timer);
69708
69749
  timer = null;
69709
69750
  }
69710
- fn.apply(null, args);
69751
+ fn(...args);
69711
69752
  };
69712
69753
  const throttled = (...args) => {
69713
69754
  const now2 = Date.now();
@@ -70317,7 +70358,7 @@ function mergeConfig(config1, config2) {
70317
70358
  validateStatus: mergeDirectKeys,
70318
70359
  headers: (a, b2, prop3) => mergeDeepProperties(headersToObject(a), headersToObject(b2), prop3, true)
70319
70360
  };
70320
- utils_default.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop3) {
70361
+ utils_default.forEach(Object.keys({ ...config1, ...config2 }), function computeConfigValue(prop3) {
70321
70362
  const merge3 = mergeMap[prop3] || mergeDeepProperties;
70322
70363
  const configValue = merge3(config1[prop3], config2[prop3], prop3);
70323
70364
  utils_default.isUndefined(configValue) && merge3 !== mergeDirectKeys || (config[prop3] = configValue);
@@ -70972,8 +71013,8 @@ class Axios {
70972
71013
  let len;
70973
71014
  if (!synchronousRequestInterceptors) {
70974
71015
  const chain2 = [dispatchRequest.bind(this), undefined];
70975
- chain2.unshift.apply(chain2, requestInterceptorChain);
70976
- chain2.push.apply(chain2, responseInterceptorChain);
71016
+ chain2.unshift(...requestInterceptorChain);
71017
+ chain2.push(...responseInterceptorChain);
70977
71018
  len = chain2.length;
70978
71019
  promise = Promise.resolve(config);
70979
71020
  while (i2 < len) {
@@ -73465,7 +73506,6 @@ class Exchange {
73465
73506
  this.countries = undefined;
73466
73507
  this.userAgent = undefined;
73467
73508
  this.user_agent = undefined;
73468
- this.redact_exclusion = "api-key";
73469
73509
  this.userAgents = {
73470
73510
  chrome: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36",
73471
73511
  chrome39: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36",
@@ -73481,6 +73521,8 @@ class Exchange {
73481
73521
  this.useVerity = false;
73482
73522
  this.verityProverUrl = "http://localhost:8080";
73483
73523
  this.verityMethods = ["fetchBalance", "fetchDepositAddress", "fetchDepositAddress", "fetchDepositAddresses", "fetchDepositAddressesByNetwork", "fetchDeposits", "withdraw", "fetchFundingHistory", "fetchWithdrawals", "fetchWithdrawal"];
73524
+ this.verityRequestOptions = { redact: "" };
73525
+ //! ------------------------------
73484
73526
  this.minFundingAddressLength = 1;
73485
73527
  this.substituteCommonCurrencyCodes = true;
73486
73528
  this.quoteJsonNumbers = true;
@@ -73901,6 +73943,9 @@ class Exchange {
73901
73943
  }
73902
73944
  return;
73903
73945
  }
73946
+ addVerityRequestOptions(options) {
73947
+ this.verityRequestOptions = options;
73948
+ }
73904
73949
  async fetch(url2, method = "GET", headers = undefined, body = undefined) {
73905
73950
  if (isNode2) {
73906
73951
  if (!this.nodeHttpModuleLoaded) {
@@ -73977,8 +74022,7 @@ RequestBody:
73977
74022
  }
73978
74023
  if (this.useVerity && ["get", "post"].includes(method.toLowerCase()) && this.verityMethods.includes(methodCalled)) {
73979
74024
  const client = new import_verity_client.default.VerityClient({ prover_url: this.verityProverUrl });
73980
- const lowercase = Object.keys(axiosConfig.headers).filter((header) => !header.toLowerCase().includes(this.redact_exclusion.toLowerCase())).map((h) => `req:header:${h.toLowerCase()}`).join(",");
73981
- const response = await client.get(axiosConfig.url, axiosConfig).redact(lowercase);
74025
+ const response = await client.get(axiosConfig.url, axiosConfig).redact(this.verityRequestOptions.redact || "");
73982
74026
  if (this.verbose) {
73983
74027
  this.log("verityProof:", response.proof, `
73984
74028
 
@@ -289223,7 +289267,7 @@ class xt2 extends xt {
289223
289267
  }
289224
289268
 
289225
289269
  // node_modules/@usherlabs/ccxt/js/ccxt.js
289226
- var version2 = "0.0.6";
289270
+ var version2 = "0.0.10";
289227
289271
  Exchange.ccxtVersion = version2;
289228
289272
  var exchanges = {
289229
289273
  alpaca,
@@ -289979,7 +290023,7 @@ class Logger extends BaseLogger {
289979
290023
  // src/helpers/logger.ts
289980
290024
  var log = new Logger({
289981
290025
  type: "pretty",
289982
- stylePrettyLogs: false,
290026
+ stylePrettyLogs: true,
289983
290027
  minLevel: process.env.LOG_LEVEL === "debug" ? 0 : 3
289984
290028
  });
289985
290029
 
@@ -290020,7 +290064,6 @@ function createBroker(cex3, metadata, useVerity, verityProverUrl) {
290020
290064
  exchange.setSandboxMode(true);
290021
290065
  }
290022
290066
  exchange.options.recvWindow = 60000;
290023
- exchange.redact_exclusion = "key";
290024
290067
  return exchange;
290025
290068
  }
290026
290069
  function selectBroker(brokers, metadata) {
@@ -290190,11 +290233,11 @@ function getServer(policy, brokers, whitelistIps, useVerity, verityProverUrl) {
290190
290233
  const server = new grpc.Server;
290191
290234
  server.addService(cexNode.cex_service.service, {
290192
290235
  ExecuteAction: async (call, callback) => {
290193
- log.info(`Request - ExecuteAction: ${JSON.stringify({
290236
+ log.info(`Request - ExecuteAction:`, {
290194
290237
  action: call.request.action,
290195
290238
  cex: call.request.cex,
290196
290239
  symbol: call.request.symbol
290197
- })}`);
290240
+ });
290198
290241
  if (!authenticateRequest(call, whitelistIps)) {
290199
290242
  return callback({
290200
290243
  code: grpc.status.PERMISSION_DENIED,
@@ -290203,10 +290246,10 @@ function getServer(policy, brokers, whitelistIps, useVerity, verityProverUrl) {
290203
290246
  }
290204
290247
  const metadata = call.metadata;
290205
290248
  const { action, cex: cex3, symbol } = call.request;
290206
- if (!action || !cex3 || !symbol) {
290249
+ if (!action || !cex3) {
290207
290250
  return callback({
290208
290251
  code: grpc.status.INVALID_ARGUMENT,
290209
- message: "action, cex, symbol, and cex are required"
290252
+ message: "`action` AND `cex` fields are required"
290210
290253
  }, null);
290211
290254
  }
290212
290255
  const broker = selectBroker(brokers[cex3], metadata) ?? createBroker(cex3, metadata, useVerity, verityProverUrl);
@@ -290216,6 +290259,13 @@ function getServer(policy, brokers, whitelistIps, useVerity, verityProverUrl) {
290216
290259
  message: `This Exchange is not registered and No API metadata ws found`
290217
290260
  }, null);
290218
290261
  }
290262
+ if (useVerity && broker.useVerity) {
290263
+ const redact = metadata.get("verity-t-redacted")?.[0]?.toString() || "";
290264
+ log.info(`Verity Options: Redact`, { redact });
290265
+ broker.addVerityRequestOptions({
290266
+ redact
290267
+ });
290268
+ }
290219
290269
  switch (action) {
290220
290270
  case Action.Deposit: {
290221
290271
  const transactionSchema = import_joi2.default.object({
@@ -290256,6 +290306,12 @@ function getServer(policy, brokers, whitelistIps, useVerity, verityProverUrl) {
290256
290306
  break;
290257
290307
  }
290258
290308
  case Action.FetchDepositAddresses: {
290309
+ if (!symbol) {
290310
+ return callback({
290311
+ code: grpc.status.INVALID_ARGUMENT,
290312
+ message: `ValidationError: Symbol requied`
290313
+ }, null);
290314
+ }
290259
290315
  const fetchDepositAddressesSchema = import_joi2.default.object({
290260
290316
  chain: import_joi2.default.string().required(),
290261
290317
  params: import_joi2.default.object().pattern(import_joi2.default.string(), import_joi2.default.string()).default({})
@@ -290299,6 +290355,12 @@ function getServer(policy, brokers, whitelistIps, useVerity, verityProverUrl) {
290299
290355
  break;
290300
290356
  }
290301
290357
  case Action.Transfer: {
290358
+ if (!symbol) {
290359
+ return callback({
290360
+ code: grpc.status.INVALID_ARGUMENT,
290361
+ message: `ValidationError: Symbol requied`
290362
+ }, null);
290363
+ }
290302
290364
  const transferSchema = import_joi2.default.object({
290303
290365
  recipientAddress: import_joi2.default.string().required(),
290304
290366
  amount: import_joi2.default.number().positive().required(),
@@ -290450,7 +290512,7 @@ function getServer(policy, brokers, whitelistIps, useVerity, verityProverUrl) {
290450
290512
  const balance = await broker.fetchFreeBalance({
290451
290513
  ...call.request.payload ?? {}
290452
290514
  });
290453
- const currencyBalance = balance[symbol];
290515
+ const currencyBalance = symbol ? balance[symbol] : balance;
290454
290516
  callback(null, {
290455
290517
  proof: broker.last_proof || "",
290456
290518
  result: JSON.stringify({
@@ -290484,6 +290546,12 @@ function getServer(policy, brokers, whitelistIps, useVerity, verityProverUrl) {
290484
290546
  }
290485
290547
  break;
290486
290548
  case Action.FetchTicker:
290549
+ if (!symbol) {
290550
+ return callback({
290551
+ code: grpc.status.INVALID_ARGUMENT,
290552
+ message: `ValidationError: Symbol requied`
290553
+ }, null);
290554
+ }
290487
290555
  try {
290488
290556
  const ticker = await broker.fetchTicker(symbol);
290489
290557
  callback(null, {
@@ -290894,7 +290962,7 @@ class CEXBroker {
290894
290962
  }
290895
290963
  }
290896
290964
  if (Object.keys(configMap).length === 0) {
290897
- log.error(`❌ NO CEX Broker Key Found`);
290965
+ log.warn(`❌ NO CEX Broker Key Found`);
290898
290966
  }
290899
290967
  for (const [broker, creds] of Object.entries(configMap)) {
290900
290968
  const hasKey = !!creds.apiKey;
@@ -290927,7 +290995,6 @@ class CEXBroker {
290927
290995
  recvWindow: 60000
290928
290996
  }
290929
290997
  });
290930
- exchange.redact_exclusion = "key";
290931
290998
  secondaryBrokers[+index2] = exchange;
290932
290999
  } else {
290933
291000
  log.warn(`⚠️ Incomplete secondary credentials for broker "${broker}" at index ${index2}`);
@@ -291006,7 +291073,6 @@ class CEXBroker {
291006
291073
  recvWindow: 60000
291007
291074
  }
291008
291075
  });
291009
- exchange.redact_exclusion = "key";
291010
291076
  secondaryBroker[+index2] = exchange;
291011
291077
  } else {
291012
291078
  log.warn(`⚠️ Incomplete secondary credentials for broker "${broker}" at index ${index2}`);
@@ -291030,7 +291096,6 @@ class CEXBroker {
291030
291096
  recvWindow: 60000
291031
291097
  }
291032
291098
  });
291033
- client.redact_exclusion = "key";
291034
291099
  this.brokers[broker] = {
291035
291100
  primary: client,
291036
291101
  secondaryBrokers: secondaryBroker
@@ -291097,26 +291162,32 @@ class CEXBroker {
291097
291162
  }
291098
291163
 
291099
291164
  // src/commands/start-broker.ts
291100
- async function startBrokerCommand(policyPath, port, whitelistIps, url2) {
291101
- const broker = new CEXBroker({}, policyPath, { port, whitelistIps, verityProverUrl: url2 });
291165
+ async function startBrokerCommand(policyPath, port, whitelistIps, verityProverUrl) {
291166
+ const broker = new CEXBroker({}, policyPath, {
291167
+ port,
291168
+ whitelistIps,
291169
+ verityProverUrl,
291170
+ useVerity: !!verityProverUrl
291171
+ });
291102
291172
  broker.loadEnvConfig();
291103
291173
  await broker.run();
291104
291174
  }
291105
291175
 
291106
291176
  // src/cli.ts
291107
291177
  var program2 = new Command;
291108
- program2.name("cex-broker").description("CLI to start the CEXBroker service").requiredOption("-p, --policy <path>", "Policy JSON file").option("--port <number>", "Port number (default: 8086)", "8086").option("-w, --whitelist <addresses...>", "IPv4 address whitelist (space-separated list)").option("--verityProverUrl <url>", "Verity Prover Url").action(async (options) => {
291178
+ program2.name("cex-broker").description("CLI to start the CEXBroker service").requiredOption("-p, --policy <path>", "Policy JSON file").option("--port <number>", "Port number (default: 8086)", "8086").option("-w, --whitelist <addresses...>", "IPv4 address whitelist (space-separated list)").option("--whitelistAll", "Allow all IPv4 addresses (development mode)").option("--verityProverUrl <url>", "Verity Prover Url").action(async (options) => {
291109
291179
  try {
291110
- if (options.whitelist) {
291180
+ const whitelist = options.whitelistAll ? ["*"] : options.whitelist ?? [];
291181
+ if (whitelist.length > 0 && !whitelist.includes("*")) {
291111
291182
  const isValidIPv4 = (ip) => /^(\d{1,3}\.){3}\d{1,3}$/.test(ip) && ip.split(".").every((part) => Number(part) >= 0 && Number(part) <= 255);
291112
- for (const ip of options.whitelist) {
291183
+ for (const ip of whitelist) {
291113
291184
  if (!isValidIPv4(ip)) {
291114
291185
  console.error(`\u274C Invalid IPv4 address: ${ip}`);
291115
291186
  process.exit(1);
291116
291187
  }
291117
291188
  }
291118
291189
  }
291119
- await startBrokerCommand(options.policy, parseInt(options.port, 10), options.whitelist ?? [], options.verityProverUrl);
291190
+ await startBrokerCommand(options.policy, parseInt(options.port, 10), whitelist, options.verityProverUrl);
291120
291191
  } catch (err2) {
291121
291192
  console.error("\u274C Failed to start broker:", err2);
291122
291193
  process.exit(1);