@riocrypto/common-server 1.0.2807 → 1.0.2809

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.
@@ -230,11 +230,13 @@ declare class ClusterClient {
230
230
  twoWaySettlementDateOffset?: number;
231
231
  }): Promise<TWAPSession>;
232
232
  stopTWAPSession(id: string): Promise<void>;
233
- getUserTWAPSettings({ userId, country, fiat, side, }: {
233
+ getUserTWAPSettings({ userId, country, fiat, side, twoWaySettlementType, twoWaySettlementDateOffset, }: {
234
234
  userId: string;
235
235
  country: Country;
236
236
  fiat: Fiat;
237
237
  side: Side;
238
+ twoWaySettlementType?: TwoWaySettlementType;
239
+ twoWaySettlementDateOffset?: number;
238
240
  }): Promise<{
239
241
  spread: number;
240
242
  minClipSize: number;
@@ -802,9 +802,20 @@ class ClusterClient {
802
802
  yield this.axios.post(`${this.baseUrl}/api/twap/sessions/${id}/stop`, {}, { headers: { "x-cluster-api-key": this.clusterApiKey } });
803
803
  });
804
804
  }
805
- getUserTWAPSettings({ userId, country, fiat, side, }) {
805
+ getUserTWAPSettings({ userId, country, fiat, side, twoWaySettlementType, twoWaySettlementDateOffset, }) {
806
806
  return __awaiter(this, void 0, void 0, function* () {
807
- const response = yield this.axios.get(`${this.baseUrl}/api/users/${userId}/TWAP/settings?country=${country}&fiat=${fiat}&side=${side}`, { headers: { "x-cluster-api-key": this.clusterApiKey } });
807
+ const params = new URLSearchParams({
808
+ country,
809
+ fiat,
810
+ side,
811
+ });
812
+ if (twoWaySettlementType !== undefined) {
813
+ params.set("twoWaySettlementType", twoWaySettlementType);
814
+ }
815
+ if (twoWaySettlementDateOffset !== undefined) {
816
+ params.set("twoWaySettlementDateOffset", String(twoWaySettlementDateOffset));
817
+ }
818
+ const response = yield this.axios.get(`${this.baseUrl}/api/users/${userId}/TWAP/settings?${params.toString()}`, { headers: { "x-cluster-api-key": this.clusterApiKey } });
808
819
  return response.data;
809
820
  });
810
821
  }
@@ -1,4 +1,5 @@
1
1
  import { Country, Side, User } from "@riocrypto/common";
2
+ export type ForwardCurveKind = "regular" | "twap";
2
3
  /**
3
4
  * Walks the user's tier ranges from the current tier (matched by amount)
4
5
  * down to lower tiers, returning the first defined interpolated rate.
@@ -7,11 +8,16 @@ import { Country, Side, User } from "@riocrypto/common";
7
8
  * forward curve omits a day can still inherit from a lower tier with a more
8
9
  * complete curve. Returns undefined if no tier matches the amount or no
9
10
  * tier contains the requested day.
11
+ *
12
+ * `kind` selects which curve on the tier is consulted: the regular order
13
+ * forward curve (`twoWaySettlementDateOffsetFee`) or the TWAP forward curve
14
+ * (`TWAPTwoWaySettlementDateOffsetFee`).
10
15
  */
11
- export declare const findUserTierForwardCurveRate: ({ user, country, side, amount, day, }: {
16
+ export declare const findUserTierForwardCurveRate: ({ user, country, side, amount, day, kind, }: {
12
17
  user: User | undefined | null;
13
18
  country: Country;
14
19
  side: Side;
15
20
  amount: number;
16
21
  day: number;
22
+ kind?: ForwardCurveKind | undefined;
17
23
  }) => number | undefined;
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.findUserTierForwardCurveRate = void 0;
4
4
  const interpolate_forward_curve_rate_1 = require("./interpolate-forward-curve-rate");
5
+ const getRangeCurve = (range, kind) => kind === "twap"
6
+ ? range.TWAPTwoWaySettlementDateOffsetFee
7
+ : range.twoWaySettlementDateOffsetFee;
5
8
  /**
6
9
  * Walks the user's tier ranges from the current tier (matched by amount)
7
10
  * down to lower tiers, returning the first defined interpolated rate.
@@ -10,8 +13,12 @@ const interpolate_forward_curve_rate_1 = require("./interpolate-forward-curve-ra
10
13
  * forward curve omits a day can still inherit from a lower tier with a more
11
14
  * complete curve. Returns undefined if no tier matches the amount or no
12
15
  * tier contains the requested day.
16
+ *
17
+ * `kind` selects which curve on the tier is consulted: the regular order
18
+ * forward curve (`twoWaySettlementDateOffsetFee`) or the TWAP forward curve
19
+ * (`TWAPTwoWaySettlementDateOffsetFee`).
13
20
  */
14
- const findUserTierForwardCurveRate = ({ user, country, side, amount, day, }) => {
21
+ const findUserTierForwardCurveRate = ({ user, country, side, amount, day, kind = "regular", }) => {
15
22
  var _a, _b;
16
23
  const ranges = (_b = (_a = user === null || user === void 0 ? void 0 : user.platformFeeRanges) === null || _a === void 0 ? void 0 : _a[country]) === null || _b === void 0 ? void 0 : _b[side];
17
24
  if (!ranges || ranges.length === 0)
@@ -33,7 +40,7 @@ const findUserTierForwardCurveRate = ({ user, country, side, amount, day, }) =>
33
40
  if (currentRangeIndex === -1)
34
41
  return undefined;
35
42
  for (let i = currentRangeIndex; i >= 0; i--) {
36
- const rate = (0, interpolate_forward_curve_rate_1.interpolateForwardCurveRate)(sorted[i].twoWaySettlementDateOffsetFee, day);
43
+ const rate = (0, interpolate_forward_curve_rate_1.interpolateForwardCurveRate)(getRangeCurve(sorted[i], kind), day);
37
44
  if (rate !== undefined)
38
45
  return rate;
39
46
  }
@@ -38,7 +38,11 @@ function getJWKS() {
38
38
  return __awaiter(this, void 0, void 0, function* () {
39
39
  if (!jwks) {
40
40
  const { createRemoteJWKSet } = yield Promise.resolve().then(() => __importStar(require("jose")));
41
- jwks = createRemoteJWKSet(new URL("https://keys.fireblocks.io/.well-known/jwks.json"));
41
+ jwks = createRemoteJWKSet(new URL("https://keys.fireblocks.io/.well-known/jwks.json"), {
42
+ timeoutDuration: 5000,
43
+ cooldownDuration: 30000,
44
+ cacheMaxAge: 10 * 60000,
45
+ });
42
46
  }
43
47
  return jwks;
44
48
  });
@@ -1,4 +1,5 @@
1
1
  import { Country, RioSettings, Side, User } from "@riocrypto/common";
2
+ import { ForwardCurveKind } from "./find-user-tier-forward-curve-rate";
2
3
  export type ResolvedForwardCurveTier = {
3
4
  min: number;
4
5
  max: number;
@@ -26,10 +27,11 @@ export type ResolvedForwardCurveTier = {
26
27
  * can then linearly interpolate between anchors to render a single
27
28
  * continuous line.
28
29
  */
29
- export declare const getResolvedForwardCurveTiers: ({ user, broker, country, side, rioSettings, }: {
30
+ export declare const getResolvedForwardCurveTiers: ({ user, broker, country, side, rioSettings, kind, }: {
30
31
  user: User;
31
32
  broker?: User | null | undefined;
32
33
  country: Country;
33
34
  side: Side;
34
- rioSettings: Pick<RioSettings, "defaultTwoWaySettlementDateOffsetFee">;
35
+ rioSettings: Pick<RioSettings, "defaultTwoWaySettlementDateOffsetFee" | "defaultTWAPTwoWaySettlementDateOffsetFee">;
36
+ kind?: ForwardCurveKind | undefined;
35
37
  }) => ResolvedForwardCurveTier[];
@@ -12,11 +12,13 @@ const resolve_forward_curve_rate_1 = require("./resolve-forward-curve-rate");
12
12
  * can then linearly interpolate between anchors to render a single
13
13
  * continuous line.
14
14
  */
15
- const getResolvedForwardCurveTiers = ({ user, broker, country, side, rioSettings, }) => {
16
- var _a, _b, _c, _d, _e, _f;
15
+ const getResolvedForwardCurveTiers = ({ user, broker, country, side, rioSettings, kind = "regular", }) => {
16
+ var _a, _b, _c, _d, _e, _f, _g, _h;
17
17
  const userRanges = (_b = (_a = user.platformFeeRanges) === null || _a === void 0 ? void 0 : _a[country]) === null || _b === void 0 ? void 0 : _b[side];
18
18
  const brokerRanges = (_d = (_c = broker === null || broker === void 0 ? void 0 : broker.platformFeeRanges) === null || _c === void 0 ? void 0 : _c[country]) === null || _d === void 0 ? void 0 : _d[side];
19
- const platformCurve = (_f = (_e = rioSettings.defaultTwoWaySettlementDateOffsetFee) === null || _e === void 0 ? void 0 : _e[country]) === null || _f === void 0 ? void 0 : _f[side];
19
+ const platformCurve = kind === "twap"
20
+ ? (_f = (_e = rioSettings.defaultTWAPTwoWaySettlementDateOffsetFee) === null || _e === void 0 ? void 0 : _e[country]) === null || _f === void 0 ? void 0 : _f[side]
21
+ : (_h = (_g = rioSettings.defaultTwoWaySettlementDateOffsetFee) === null || _g === void 0 ? void 0 : _g[country]) === null || _h === void 0 ? void 0 : _h[side];
20
22
  let tiers = [];
21
23
  if (userRanges && userRanges.length > 0) {
22
24
  tiers = [...userRanges]
@@ -38,15 +40,18 @@ const getResolvedForwardCurveTiers = ({ user, broker, country, side, rioSettings
38
40
  .map((k) => Number(k))
39
41
  .filter((d) => Number.isFinite(d));
40
42
  };
43
+ const pickRangeCurve = (range) => kind === "twap"
44
+ ? range.TWAPTwoWaySettlementDateOffsetFee
45
+ : range.twoWaySettlementDateOffsetFee;
41
46
  const anchorDays = new Set();
42
47
  if (userRanges) {
43
48
  for (const r of userRanges) {
44
- collectDays(r.twoWaySettlementDateOffsetFee).forEach((d) => anchorDays.add(d));
49
+ collectDays(pickRangeCurve(r)).forEach((d) => anchorDays.add(d));
45
50
  }
46
51
  }
47
52
  if (brokerRanges) {
48
53
  for (const r of brokerRanges) {
49
- collectDays(r.twoWaySettlementDateOffsetFee).forEach((d) => anchorDays.add(d));
54
+ collectDays(pickRangeCurve(r)).forEach((d) => anchorDays.add(d));
50
55
  }
51
56
  }
52
57
  collectDays(platformCurve).forEach((d) => anchorDays.add(d));
@@ -68,6 +73,7 @@ const getResolvedForwardCurveTiers = ({ user, broker, country, side, rioSettings
68
73
  amount: sampleAmount,
69
74
  day,
70
75
  rioSettings,
76
+ kind,
71
77
  });
72
78
  if (rate !== undefined)
73
79
  curve[String(day)] = rate;
@@ -1,4 +1,5 @@
1
1
  import { Country, RioSettings, Side, User } from "@riocrypto/common";
2
+ import { ForwardCurveKind } from "./find-user-tier-forward-curve-rate";
2
3
  /**
3
4
  * Resolves the effective two-way-settlement-date-offset rate at a given day,
4
5
  * walking the full fallback chain:
@@ -6,14 +7,19 @@ import { Country, RioSettings, Side, User } from "@riocrypto/common";
6
7
  * 2. broker parent's tier curves (same logic applied to broker)
7
8
  * 3. platform default forward curve from RioSettings
8
9
  *
10
+ * `kind` selects which forward curve to consult on each layer:
11
+ * - "regular" → `twoWaySettlementDateOffsetFee` / `defaultTwoWaySettlementDateOffsetFee`
12
+ * - "twap" → `TWAPTwoWaySettlementDateOffsetFee` / `defaultTWAPTwoWaySettlementDateOffsetFee`
13
+ *
9
14
  * Returns undefined only if every layer is missing or out of range.
10
15
  */
11
- export declare const resolveForwardCurveRate: ({ user, broker, country, side, amount, day, rioSettings, }: {
16
+ export declare const resolveForwardCurveRate: ({ user, broker, country, side, amount, day, rioSettings, kind, }: {
12
17
  user: User | undefined | null;
13
18
  broker?: User | null | undefined;
14
19
  country: Country;
15
20
  side: Side;
16
21
  amount: number;
17
22
  day: number;
18
- rioSettings: Pick<RioSettings, "defaultTwoWaySettlementDateOffsetFee">;
23
+ rioSettings: Pick<RioSettings, "defaultTwoWaySettlementDateOffsetFee" | "defaultTWAPTwoWaySettlementDateOffsetFee">;
24
+ kind?: ForwardCurveKind | undefined;
19
25
  }) => number | undefined;
@@ -10,16 +10,21 @@ const interpolate_forward_curve_rate_1 = require("./interpolate-forward-curve-ra
10
10
  * 2. broker parent's tier curves (same logic applied to broker)
11
11
  * 3. platform default forward curve from RioSettings
12
12
  *
13
+ * `kind` selects which forward curve to consult on each layer:
14
+ * - "regular" → `twoWaySettlementDateOffsetFee` / `defaultTwoWaySettlementDateOffsetFee`
15
+ * - "twap" → `TWAPTwoWaySettlementDateOffsetFee` / `defaultTWAPTwoWaySettlementDateOffsetFee`
16
+ *
13
17
  * Returns undefined only if every layer is missing or out of range.
14
18
  */
15
- const resolveForwardCurveRate = ({ user, broker, country, side, amount, day, rioSettings, }) => {
16
- var _a, _b;
19
+ const resolveForwardCurveRate = ({ user, broker, country, side, amount, day, rioSettings, kind = "regular", }) => {
20
+ var _a, _b, _c, _d;
17
21
  const userRate = (0, find_user_tier_forward_curve_rate_1.findUserTierForwardCurveRate)({
18
22
  user,
19
23
  country,
20
24
  side,
21
25
  amount,
22
26
  day,
27
+ kind,
23
28
  });
24
29
  if (userRate !== undefined)
25
30
  return userRate;
@@ -30,10 +35,14 @@ const resolveForwardCurveRate = ({ user, broker, country, side, amount, day, rio
30
35
  side,
31
36
  amount,
32
37
  day,
38
+ kind,
33
39
  });
34
40
  if (brokerRate !== undefined)
35
41
  return brokerRate;
36
42
  }
37
- return (0, interpolate_forward_curve_rate_1.interpolateForwardCurveRate)((_b = (_a = rioSettings.defaultTwoWaySettlementDateOffsetFee) === null || _a === void 0 ? void 0 : _a[country]) === null || _b === void 0 ? void 0 : _b[side], day);
43
+ const defaultCurve = kind === "twap"
44
+ ? (_b = (_a = rioSettings.defaultTWAPTwoWaySettlementDateOffsetFee) === null || _a === void 0 ? void 0 : _a[country]) === null || _b === void 0 ? void 0 : _b[side]
45
+ : (_d = (_c = rioSettings.defaultTwoWaySettlementDateOffsetFee) === null || _c === void 0 ? void 0 : _c[country]) === null || _d === void 0 ? void 0 : _d[side];
46
+ return (0, interpolate_forward_curve_rate_1.interpolateForwardCurveRate)(defaultCurve, day);
38
47
  };
39
48
  exports.resolveForwardCurveRate = resolveForwardCurveRate;
@@ -63,6 +63,13 @@ interface RioSettingsAttrs {
63
63
  };
64
64
  };
65
65
  };
66
+ defaultTWAPTwoWaySettlementDateOffsetFee?: {
67
+ [key in Country]?: {
68
+ [key in Side]?: {
69
+ [key: number]: number;
70
+ };
71
+ };
72
+ };
66
73
  holidays: {
67
74
  [key in Country]: {
68
75
  dates: string[];
@@ -148,6 +155,13 @@ interface RioSettingsDoc extends mongoose.Document {
148
155
  };
149
156
  };
150
157
  };
158
+ defaultTWAPTwoWaySettlementDateOffsetFee?: {
159
+ [key in Country]?: {
160
+ [key in Side]?: {
161
+ [key: number]: number;
162
+ };
163
+ };
164
+ };
151
165
  holidays: {
152
166
  [key in Country]: {
153
167
  dates: string[];
@@ -60,6 +60,9 @@ const buildRioSettings = (mongoose) => {
60
60
  defaultTwoWaySettlementDateOffsetFee: {
61
61
  type: Object,
62
62
  },
63
+ defaultTWAPTwoWaySettlementDateOffsetFee: {
64
+ type: Object,
65
+ },
63
66
  holidays: {
64
67
  type: Object,
65
68
  },
@@ -14,6 +14,11 @@ interface TWAPSessionAttrs {
14
14
  maxOriginAmount?: number;
15
15
  tradeCurrency: Fiat | Crypto;
16
16
  spread: number;
17
+ spreadHistory: {
18
+ spread: number;
19
+ appliedAt: Date;
20
+ firstOrderId?: string;
21
+ }[];
17
22
  clipSize: number;
18
23
  interval: number;
19
24
  isRunning: boolean;
@@ -56,6 +61,11 @@ interface TWAPSessionDoc extends Document {
56
61
  activeTWAPSettlementId?: string;
57
62
  TWAPSettlementIdsPendingSettlement: string[];
58
63
  spread: number;
64
+ spreadHistory: {
65
+ spread: number;
66
+ appliedAt: Date;
67
+ firstOrderId?: string;
68
+ }[];
59
69
  clipSize: number;
60
70
  interval: number;
61
71
  isRunning: boolean;
@@ -64,6 +64,16 @@ const buildTWAPSession = (mongoose) => {
64
64
  type: Number,
65
65
  required: true,
66
66
  },
67
+ spreadHistory: {
68
+ type: [
69
+ {
70
+ spread: { type: Number, required: true },
71
+ appliedAt: { type: Date, required: true },
72
+ firstOrderId: { type: String },
73
+ },
74
+ ],
75
+ default: [],
76
+ },
67
77
  clipSize: {
68
78
  type: Number,
69
79
  required: true,
@@ -17,6 +17,7 @@ interface TWAPSettlementAttrs {
17
17
  bulkBankPayoutId?: string;
18
18
  bulkCryptoPayoutId?: string;
19
19
  orderIds: string[];
20
+ twoWaySettlementDate?: Date;
20
21
  }
21
22
  interface TWAPSettlementModel extends Model<TWAPSettlementDoc> {
22
23
  build(attrs: TWAPSettlementAttrs): HydratedDocument<TWAPSettlementDoc>;
@@ -39,6 +40,7 @@ interface TWAPSettlementDoc extends Document {
39
40
  bulkBankPayoutId?: string;
40
41
  bulkCryptoPayoutId?: string;
41
42
  orderIds: string[];
43
+ twoWaySettlementDate?: Date;
42
44
  }
43
45
  declare const buildTWAPSettlement: (mongoose: Mongoose) => TWAPSettlementModel;
44
46
  export { buildTWAPSettlement, TWAPSettlementDoc, TWAPSettlementAttrs };
@@ -66,6 +66,9 @@ const buildTWAPSettlement = (mongoose) => {
66
66
  type: [String],
67
67
  required: true,
68
68
  },
69
+ twoWaySettlementDate: {
70
+ type: Date,
71
+ },
69
72
  }, {
70
73
  toJSON: {
71
74
  transform(doc, ret) {
@@ -80,6 +80,9 @@ const buildUser = (mongoose) => {
80
80
  TWAPFee: {
81
81
  type: Number,
82
82
  },
83
+ TWAPTwoWaySettlementDateOffsetFee: {
84
+ type: Object,
85
+ },
83
86
  },
84
87
  ],
85
88
  sell: [
@@ -105,6 +108,9 @@ const buildUser = (mongoose) => {
105
108
  TWAPFee: {
106
109
  type: Number,
107
110
  },
111
+ TWAPTwoWaySettlementDateOffsetFee: {
112
+ type: Object,
113
+ },
108
114
  },
109
115
  ],
110
116
  },
@@ -132,6 +138,9 @@ const buildUser = (mongoose) => {
132
138
  TWAPFee: {
133
139
  type: Number,
134
140
  },
141
+ TWAPTwoWaySettlementDateOffsetFee: {
142
+ type: Object,
143
+ },
135
144
  },
136
145
  ],
137
146
  sell: [
@@ -157,6 +166,9 @@ const buildUser = (mongoose) => {
157
166
  TWAPFee: {
158
167
  type: Number,
159
168
  },
169
+ TWAPTwoWaySettlementDateOffsetFee: {
170
+ type: Object,
171
+ },
160
172
  },
161
173
  ],
162
174
  },
@@ -184,6 +196,9 @@ const buildUser = (mongoose) => {
184
196
  TWAPFee: {
185
197
  type: Number,
186
198
  },
199
+ TWAPTwoWaySettlementDateOffsetFee: {
200
+ type: Object,
201
+ },
187
202
  },
188
203
  ],
189
204
  sell: [
@@ -209,6 +224,9 @@ const buildUser = (mongoose) => {
209
224
  TWAPFee: {
210
225
  type: Number,
211
226
  },
227
+ TWAPTwoWaySettlementDateOffsetFee: {
228
+ type: Object,
229
+ },
212
230
  },
213
231
  ],
214
232
  },
@@ -236,6 +254,9 @@ const buildUser = (mongoose) => {
236
254
  TWAPFee: {
237
255
  type: Number,
238
256
  },
257
+ TWAPTwoWaySettlementDateOffsetFee: {
258
+ type: Object,
259
+ },
239
260
  },
240
261
  ],
241
262
  sell: [
@@ -261,6 +282,9 @@ const buildUser = (mongoose) => {
261
282
  TWAPFee: {
262
283
  type: Number,
263
284
  },
285
+ TWAPTwoWaySettlementDateOffsetFee: {
286
+ type: Object,
287
+ },
264
288
  },
265
289
  ],
266
290
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riocrypto/common-server",
3
- "version": "1.0.2807",
3
+ "version": "1.0.2809",
4
4
  "description": "",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",
@@ -28,7 +28,7 @@
28
28
  "@google-cloud/secret-manager": "^5.6.0",
29
29
  "@google-cloud/storage": "^7.19.0",
30
30
  "@hyperdx/node-opentelemetry": "^0.10.3",
31
- "@riocrypto/common": "1.0.2609",
31
+ "@riocrypto/common": "1.0.2612",
32
32
  "@slack/web-api": "^7.15.0",
33
33
  "@types/express": "^4.17.25",
34
34
  "axios": "1.16.0",