@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.
- package/dist/commands/cli.js +118 -47
- package/dist/index.js +101 -38
- package/dist/index.js.map +16 -16
- package/package.json +4 -3
package/dist/commands/cli.js
CHANGED
|
@@ -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 !==
|
|
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
|
-
|
|
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.
|
|
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,
|
|
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
|
-
|
|
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.
|
|
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
|
|
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(
|
|
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
|
|
40931
|
-
chain2.push
|
|
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,
|
|
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
|
-
|
|
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.
|
|
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
|
|
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(
|
|
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
|
|
70976
|
-
chain2.push
|
|
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
|
|
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.
|
|
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:
|
|
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
|
|
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
|
|
290249
|
+
if (!action || !cex3) {
|
|
290207
290250
|
return callback({
|
|
290208
290251
|
code: grpc.status.INVALID_ARGUMENT,
|
|
290209
|
-
message: "action
|
|
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.
|
|
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,
|
|
291101
|
-
const broker = new CEXBroker({}, policyPath, {
|
|
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
|
-
|
|
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
|
|
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),
|
|
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);
|