@riocrypto/common 1.0.2583 → 1.0.2587

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.
Files changed (32) hide show
  1. package/build/events/external-trade-updated-event.d.ts +2 -0
  2. package/build/events/{emarkets-fx-trade-alternative-requested-event.d.ts → fx-trade-alternative-provider-requested-event.d.ts} +3 -2
  3. package/build/events/rio-settings-updated-event.d.ts +2 -7
  4. package/build/events/subjects.d.ts +1 -2
  5. package/build/events/subjects.js +1 -2
  6. package/build/helpers/get-country-for-fiat.d.ts +11 -0
  7. package/build/helpers/get-country-for-fiat.js +28 -0
  8. package/build/index.d.ts +4 -2
  9. package/build/index.js +4 -2
  10. package/build/types/cancel-external-trade-reason.d.ts +3 -0
  11. package/build/types/cancel-external-trade-reason.js +7 -0
  12. package/build/types/emarkets-fx-trade-status.d.ts +2 -1
  13. package/build/types/emarkets-fx-trade-status.js +1 -0
  14. package/build/types/emarkets-fx-trade.d.ts +1 -2
  15. package/build/types/external-trade-status.d.ts +3 -1
  16. package/build/types/external-trade-status.js +2 -0
  17. package/build/types/external-trade.d.ts +1 -0
  18. package/build/types/fx-provider.d.ts +1 -0
  19. package/build/types/fx-provider.js +1 -0
  20. package/build/types/fx-trade-status.d.ts +3 -1
  21. package/build/types/fx-trade-status.js +2 -0
  22. package/build/types/fx-trade.d.ts +6 -5
  23. package/build/types/fx-trading-policy.d.ts +123 -0
  24. package/build/{events/transnetwork-fx-trade-alternative-requested-event.js → types/fx-trading-policy.js} +1 -0
  25. package/build/types/rio-settings-update.d.ts +2 -7
  26. package/build/types/rio-settings.d.ts +9 -7
  27. package/build/types/transnetwork-fx-trade-status.d.ts +2 -1
  28. package/build/types/transnetwork-fx-trade-status.js +1 -0
  29. package/build/types/transnetwork-fx-trade.d.ts +0 -2
  30. package/package.json +1 -1
  31. package/build/events/transnetwork-fx-trade-alternative-requested-event.d.ts +0 -12
  32. /package/build/events/{emarkets-fx-trade-alternative-requested-event.js → fx-trade-alternative-provider-requested-event.js} +0 -0
@@ -1,7 +1,9 @@
1
+ import { ExternalTradeStatus } from "../types/external-trade-status";
1
2
  import { Subjects } from "./subjects";
2
3
  export interface ExternalTradeUpdatedEvent {
3
4
  subject: Subjects.ExternalTradeUpdated;
4
5
  data: {
5
6
  id: string;
7
+ status: ExternalTradeStatus;
6
8
  };
7
9
  }
@@ -2,10 +2,11 @@ import { EmarketsSettlementType } from "../types/emarkets-settlement-type";
2
2
  import { FXProvider } from "../types/fx-provider";
3
3
  import { TransnetworkSettlementType } from "../types/transnetwork-settlement-type";
4
4
  import { Subjects } from "./subjects";
5
- export interface EmarketsFXTradeAlternativeRequestedEvent {
6
- subject: Subjects.EmarketsFXTradeAlternativeRequested;
5
+ export interface FXTradeAlternativeProviderRequestedEvent {
6
+ subject: Subjects.FXTradeAlternativeProviderRequested;
7
7
  data: {
8
8
  id: string;
9
+ currentProvider?: FXProvider;
9
10
  newProvider?: FXProvider;
10
11
  newSettlementType?: EmarketsSettlementType | TransnetworkSettlementType;
11
12
  };
@@ -2,6 +2,7 @@ import { Country } from "../types/country";
2
2
  import { DeferredPaymentType } from "../types/deferred-payment-type";
3
3
  import { Fiat } from "../types/fiat";
4
4
  import { FXProvider } from "../types/fx-provider";
5
+ import { FXTradingPolicies } from "../types/fx-trading-policy";
5
6
  import { Processor } from "../types/processor";
6
7
  import { Side } from "../types/side";
7
8
  import { TVFXDataProvider } from "../types/TV-FX-data-provider";
@@ -24,12 +25,6 @@ export interface RioSettingsUpdatedEvent {
24
25
  frozen: boolean;
25
26
  };
26
27
  };
27
- buyOrderAutomaticFXTradeLimit?: {
28
- [key: string]: number;
29
- };
30
- sellOrderAutomaticFXTradeLimit?: {
31
- [key: string]: number;
32
- };
33
28
  buyOrderAfterHoursExchangeRateMarkup?: {
34
29
  [key: string]: number;
35
30
  };
@@ -54,7 +49,7 @@ export interface RioSettingsUpdatedEvent {
54
49
  };
55
50
  };
56
51
  };
57
- fxExecutionThreshold?: number;
52
+ fxTradingPolicies?: FXTradingPolicies;
58
53
  defaultServiceFee?: {
59
54
  [key in Country]?: {
60
55
  [key in Side]?: number;
@@ -185,8 +185,7 @@ export declare enum Subjects {
185
185
  EmarketsFXTradeCreated = "emarketsFXTrade:created",
186
186
  EmarketsFXTradeFailed = "emarketsFXTrade:failed",
187
187
  EmarketsFXTradeCompleted = "emarketsFXTrade:completed",
188
- EmarketsFXTradeAlternativeRequested = "emarketsFXTrade:alternativeRequested",
189
- TransnetworkFXTradeAlternativeRequested = "transnetworkFXTrade:alternativeRequested",
188
+ FXTradeAlternativeProviderRequested = "fxTrade:alternativeProviderRequested",
190
189
  TransnetworkFXTradeCompleted = "transnetworkFXTrade:completed",
191
190
  TransnetworkFXTradeFailed = "transnetworkFXTrade:failed",
192
191
  TransnetworkFXTradeCreated = "transnetworkFXTrade:created",
@@ -189,8 +189,7 @@ var Subjects;
189
189
  Subjects["EmarketsFXTradeCreated"] = "emarketsFXTrade:created";
190
190
  Subjects["EmarketsFXTradeFailed"] = "emarketsFXTrade:failed";
191
191
  Subjects["EmarketsFXTradeCompleted"] = "emarketsFXTrade:completed";
192
- Subjects["EmarketsFXTradeAlternativeRequested"] = "emarketsFXTrade:alternativeRequested";
193
- Subjects["TransnetworkFXTradeAlternativeRequested"] = "transnetworkFXTrade:alternativeRequested";
192
+ Subjects["FXTradeAlternativeProviderRequested"] = "fxTrade:alternativeProviderRequested";
194
193
  Subjects["TransnetworkFXTradeCompleted"] = "transnetworkFXTrade:completed";
195
194
  Subjects["TransnetworkFXTradeFailed"] = "transnetworkFXTrade:failed";
196
195
  Subjects["TransnetworkFXTradeCreated"] = "transnetworkFXTrade:created";
@@ -0,0 +1,11 @@
1
+ import { Country } from "../types/country";
2
+ import { Fiat } from "../types/fiat";
3
+ /**
4
+ * Returns the primary country whose local timezone "owns" a given
5
+ * fiat. Used by the FX trading-policy resolver to evaluate time-of-day
6
+ * windows in the currency's natural local time.
7
+ *
8
+ * This is intentionally a 1:1 mapping; there's no concept of a fiat
9
+ * being shared across multiple jurisdictions in our system today.
10
+ */
11
+ export declare const getCountryForFiat: (fiat: Fiat) => Country;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCountryForFiat = void 0;
4
+ const country_1 = require("../types/country");
5
+ const fiat_1 = require("../types/fiat");
6
+ /**
7
+ * Returns the primary country whose local timezone "owns" a given
8
+ * fiat. Used by the FX trading-policy resolver to evaluate time-of-day
9
+ * windows in the currency's natural local time.
10
+ *
11
+ * This is intentionally a 1:1 mapping; there's no concept of a fiat
12
+ * being shared across multiple jurisdictions in our system today.
13
+ */
14
+ const getCountryForFiat = (fiat) => {
15
+ switch (fiat) {
16
+ case fiat_1.Fiat.MXN:
17
+ return country_1.Country.Mexico;
18
+ case fiat_1.Fiat.PEN:
19
+ return country_1.Country.Peru;
20
+ case fiat_1.Fiat.COP:
21
+ return country_1.Country.Colombia;
22
+ case fiat_1.Fiat.USD:
23
+ return country_1.Country.UnitedStates;
24
+ default:
25
+ throw new Error(`Unsupported fiat: ${fiat}`);
26
+ }
27
+ };
28
+ exports.getCountryForFiat = getCountryForFiat;
package/build/index.d.ts CHANGED
@@ -246,8 +246,7 @@ export * from "./events/inbound-fireblocks-crypto-deposit-received-event";
246
246
  export * from "./events/inbound-bitso-crypto-deposit-received-event";
247
247
  export * from "./events/inbound-binance-crypto-deposit-received-event";
248
248
  export * from "./events/internal-transfer-updated-event";
249
- export * from "./events/emarkets-fx-trade-alternative-requested-event";
250
- export * from "./events/transnetwork-fx-trade-alternative-requested-event";
249
+ export * from "./events/fx-trade-alternative-provider-requested-event";
251
250
  export * from "./events/auth-kyc-needs-review-event";
252
251
  export * from "./events/order-emergency-support-requested-event";
253
252
  export * from "./events/fill-created-event";
@@ -388,6 +387,7 @@ export * from "./types/arbitrage-asset";
388
387
  export * from "./types/arbitrage-frequency";
389
388
  export * from "./types/arbitrage-provider";
390
389
  export * from "./types/fx-provider";
390
+ export * from "./types/fx-trading-policy";
391
391
  export * from "./types/liquidity-automation-frequency";
392
392
  export * from "./types/liquidity-automation";
393
393
  export * from "./types/liquidity-automation-type";
@@ -408,6 +408,7 @@ export * from "./types/CEP-status";
408
408
  export * from "./types/external-trade";
409
409
  export * from "./types/external-trade-status";
410
410
  export * from "./types/external-trade-type";
411
+ export * from "./types/cancel-external-trade-reason";
411
412
  export * from "./types/external-trading-algorithm";
412
413
  export * from "./types/external-trading-algorithm-status";
413
414
  export * from "./types/external-trading-algorithm-type";
@@ -538,6 +539,7 @@ export * from "./helpers/is-overnight-or-weekend-mexico-city";
538
539
  export * from "./helpers/get-user-payout-vault-id";
539
540
  export * from "./helpers/should-add-one-day-to-settlement-date";
540
541
  export * from "./helpers/get-country-timezone";
542
+ export * from "./helpers/get-country-for-fiat";
541
543
  export * from "./helpers/get-days-between-agreed-two-way-settlement-date-and-payment-date";
542
544
  export * from "./helpers/get-days-until-two-way-settlement-date";
543
545
  export * from "./helpers/get-two-way-settlement-date-offset-from-date";
package/build/index.js CHANGED
@@ -262,8 +262,7 @@ __exportStar(require("./events/inbound-fireblocks-crypto-deposit-received-event"
262
262
  __exportStar(require("./events/inbound-bitso-crypto-deposit-received-event"), exports);
263
263
  __exportStar(require("./events/inbound-binance-crypto-deposit-received-event"), exports);
264
264
  __exportStar(require("./events/internal-transfer-updated-event"), exports);
265
- __exportStar(require("./events/emarkets-fx-trade-alternative-requested-event"), exports);
266
- __exportStar(require("./events/transnetwork-fx-trade-alternative-requested-event"), exports);
265
+ __exportStar(require("./events/fx-trade-alternative-provider-requested-event"), exports);
267
266
  __exportStar(require("./events/auth-kyc-needs-review-event"), exports);
268
267
  __exportStar(require("./events/order-emergency-support-requested-event"), exports);
269
268
  __exportStar(require("./events/fill-created-event"), exports);
@@ -404,6 +403,7 @@ __exportStar(require("./types/arbitrage-asset"), exports);
404
403
  __exportStar(require("./types/arbitrage-frequency"), exports);
405
404
  __exportStar(require("./types/arbitrage-provider"), exports);
406
405
  __exportStar(require("./types/fx-provider"), exports);
406
+ __exportStar(require("./types/fx-trading-policy"), exports);
407
407
  __exportStar(require("./types/liquidity-automation-frequency"), exports);
408
408
  __exportStar(require("./types/liquidity-automation"), exports);
409
409
  __exportStar(require("./types/liquidity-automation-type"), exports);
@@ -424,6 +424,7 @@ __exportStar(require("./types/CEP-status"), exports);
424
424
  __exportStar(require("./types/external-trade"), exports);
425
425
  __exportStar(require("./types/external-trade-status"), exports);
426
426
  __exportStar(require("./types/external-trade-type"), exports);
427
+ __exportStar(require("./types/cancel-external-trade-reason"), exports);
427
428
  __exportStar(require("./types/external-trading-algorithm"), exports);
428
429
  __exportStar(require("./types/external-trading-algorithm-status"), exports);
429
430
  __exportStar(require("./types/external-trading-algorithm-type"), exports);
@@ -554,6 +555,7 @@ __exportStar(require("./helpers/is-overnight-or-weekend-mexico-city"), exports);
554
555
  __exportStar(require("./helpers/get-user-payout-vault-id"), exports);
555
556
  __exportStar(require("./helpers/should-add-one-day-to-settlement-date"), exports);
556
557
  __exportStar(require("./helpers/get-country-timezone"), exports);
558
+ __exportStar(require("./helpers/get-country-for-fiat"), exports);
557
559
  __exportStar(require("./helpers/get-days-between-agreed-two-way-settlement-date-and-payment-date"), exports);
558
560
  __exportStar(require("./helpers/get-days-until-two-way-settlement-date"), exports);
559
561
  __exportStar(require("./helpers/get-two-way-settlement-date-offset-from-date"), exports);
@@ -0,0 +1,3 @@
1
+ export declare enum CancelExternalTradeReason {
2
+ PriceRejected = "priceRejected"
3
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CancelExternalTradeReason = void 0;
4
+ var CancelExternalTradeReason;
5
+ (function (CancelExternalTradeReason) {
6
+ CancelExternalTradeReason["PriceRejected"] = "priceRejected";
7
+ })(CancelExternalTradeReason = exports.CancelExternalTradeReason || (exports.CancelExternalTradeReason = {}));
@@ -3,5 +3,6 @@ export declare enum EmarketsFXTradeStatus {
3
3
  Expired = "expired",
4
4
  Completed = "completed",
5
5
  Cancelled = "cancelled",
6
- Failed = "failed"
6
+ Failed = "failed",
7
+ PriceRejected = "priceRejected"
7
8
  }
@@ -8,4 +8,5 @@ var EmarketsFXTradeStatus;
8
8
  EmarketsFXTradeStatus["Completed"] = "completed";
9
9
  EmarketsFXTradeStatus["Cancelled"] = "cancelled";
10
10
  EmarketsFXTradeStatus["Failed"] = "failed";
11
+ EmarketsFXTradeStatus["PriceRejected"] = "priceRejected";
11
12
  })(EmarketsFXTradeStatus = exports.EmarketsFXTradeStatus || (exports.EmarketsFXTradeStatus = {}));
@@ -10,8 +10,7 @@ export interface EmarketsFXTrade {
10
10
  provider: "BBVA";
11
11
  status: EmarketsFXTradeStatus;
12
12
  settlementType: EmarketsSettlementType;
13
- FXTradeId?: string;
14
- isExternalTrade: boolean;
13
+ externalTradeId: string;
15
14
  fiat: Fiat;
16
15
  amountToTrade: number;
17
16
  amountReceived?: number;
@@ -9,5 +9,7 @@ export declare enum ExternalTradeStatus {
9
9
  Filling = "filling",
10
10
  Cancelled = "cancelled",
11
11
  Rejected = "rejected",
12
- Expired = "expired"
12
+ Expired = "expired",
13
+ PendingApproval = "pendingApproval",
14
+ PriceRejected = "priceRejected"
13
15
  }
@@ -14,4 +14,6 @@ var ExternalTradeStatus;
14
14
  ExternalTradeStatus["Cancelled"] = "cancelled";
15
15
  ExternalTradeStatus["Rejected"] = "rejected";
16
16
  ExternalTradeStatus["Expired"] = "expired";
17
+ ExternalTradeStatus["PendingApproval"] = "pendingApproval";
18
+ ExternalTradeStatus["PriceRejected"] = "priceRejected";
17
19
  })(ExternalTradeStatus = exports.ExternalTradeStatus || (exports.ExternalTradeStatus = {}));
@@ -25,6 +25,7 @@ export interface ExternalTrade {
25
25
  actualPrice?: number;
26
26
  associatedMidmarketPrice?: number;
27
27
  status: ExternalTradeStatus;
28
+ fxTradeId?: string;
28
29
  providerOptions?: {
29
30
  emarkets?: {
30
31
  settlementType?: EmarketsSettlementType;
@@ -5,5 +5,6 @@ export declare enum FXProvider {
5
5
  Nonco = "nonco",
6
6
  Bitso = "bitso",
7
7
  Binance = "binance",
8
+ StoneX = "stonex",
8
9
  Other = "other"
9
10
  }
@@ -9,5 +9,6 @@ var FXProvider;
9
9
  FXProvider["Nonco"] = "nonco";
10
10
  FXProvider["Bitso"] = "bitso";
11
11
  FXProvider["Binance"] = "binance";
12
+ FXProvider["StoneX"] = "stonex";
12
13
  FXProvider["Other"] = "other";
13
14
  })(FXProvider = exports.FXProvider || (exports.FXProvider = {}));
@@ -5,5 +5,7 @@ export declare enum FXTradeStatus {
5
5
  Cancelled = "cancelled",
6
6
  Failed = "failed",
7
7
  PendingExecutionThreshold = "pendingExecutionThreshold",
8
- WaitingForFunds = "waitingForFunds"
8
+ WaitingForFunds = "waitingForFunds",
9
+ WaitingForQuote = "waitingForQuote",
10
+ PriceRejected = "priceRejected"
9
11
  }
@@ -10,4 +10,6 @@ var FXTradeStatus;
10
10
  FXTradeStatus["Failed"] = "failed";
11
11
  FXTradeStatus["PendingExecutionThreshold"] = "pendingExecutionThreshold";
12
12
  FXTradeStatus["WaitingForFunds"] = "waitingForFunds";
13
+ FXTradeStatus["WaitingForQuote"] = "waitingForQuote";
14
+ FXTradeStatus["PriceRejected"] = "priceRejected";
13
15
  })(FXTradeStatus = exports.FXTradeStatus || (exports.FXTradeStatus = {}));
@@ -1,9 +1,8 @@
1
- import { EmarketsSettlementType } from "./emarkets-settlement-type";
1
+ import { ExternalTradeStatus } from "./external-trade-status";
2
2
  import { Fiat } from "./fiat";
3
3
  import { FXProvider } from "./fx-provider";
4
4
  import { FXTradeStatus } from "./fx-trade-status";
5
5
  import { Side } from "./side";
6
- import { TransnetworkSettlementType } from "./transnetwork-settlement-type";
7
6
  export interface FXTrade {
8
7
  id: string;
9
8
  createdAt: Date;
@@ -12,17 +11,19 @@ export interface FXTrade {
12
11
  amount: number;
13
12
  fiat: Fiat;
14
13
  amountTraded: number;
15
- settlementType?: EmarketsSettlementType | TransnetworkSettlementType;
16
14
  averageOfferedPrice: number;
17
15
  price: number;
18
16
  provider: FXProvider;
19
17
  partiallyFilledOrderTTL: number;
18
+ twoWaySettlementDateOffset: number;
19
+ twoWaySettlementDate: Date;
20
20
  executedTrades: {
21
+ status: ExternalTradeStatus;
21
22
  amount: number;
22
23
  provider: FXProvider;
23
- price: number;
24
+ price?: number;
24
25
  matchedTradeId?: string;
25
- providerOrderId?: string;
26
+ externalTradeId?: string;
26
27
  }[];
27
28
  status: FXTradeStatus;
28
29
  }
@@ -0,0 +1,123 @@
1
+ import { Fiat } from "./fiat";
2
+ import { FXProvider } from "./fx-provider";
3
+ import { Side } from "./side";
4
+ /**
5
+ * One amount band within a (fiat, settlement offset, side) policy.
6
+ *
7
+ * The band is interpreted as `[minAmount, maxAmount)` in the policy's fiat.
8
+ * Both bounds are required and finite. Operators that want a "catch-all
9
+ * upper tail" set `maxAmount` to a value larger than any plausible single
10
+ * trade for that fiat (e.g. 1,000,000,000) rather than leaving it
11
+ * unbounded - this avoids accidentally routing arbitrary-size trades
12
+ * through automation just because no upper bound was specified.
13
+ *
14
+ * `automatic` is only meaningful for providers that support a cosigner
15
+ * approval workflow (Emarkets, Transnetwork, StoneX). For Matching / Other
16
+ * the runtime always treats this band as automatic regardless of the
17
+ * stored value.
18
+ */
19
+ export interface FXTradingPolicyAmountRange {
20
+ minAmount: number;
21
+ maxAmount: number;
22
+ provider: FXProvider;
23
+ automatic: boolean;
24
+ }
25
+ /**
26
+ * One time-of-day window within a (fiat, settlement offset, side) policy.
27
+ *
28
+ * Times are minutes from midnight in the currency's country-local
29
+ * timezone, interpreted as `[startMinute, endMinute)`. The full set of
30
+ * windows must be contiguous and cover `[0, 1440)` (midnight to
31
+ * midnight) so every moment of the day maps to exactly one window. A
32
+ * window that needs to span midnight (e.g. an "after-hours" 22:00-06:00
33
+ * gate) is split into two rows with identical inner configuration.
34
+ *
35
+ * `executionThresholdMs` is the milliseconds an FX trade can dwell in
36
+ * PendingExecutionThreshold before checkExecutionThreshold transitions
37
+ * it for placement. It is per-time-window so operators can specify
38
+ * a different aggregation behavior during the day vs at night.
39
+ * Re-evaluated against the current time at every step in the trade's
40
+ * lifecycle (initial creation, cron sweep). A trade created during a
41
+ * 30s-aggregation window may sit in PendingExecutionThreshold; when the
42
+ * window flips to 0ms the next cron tick dispatches the trade.
43
+ *
44
+ * `byAmountRange` is the amount-range table that applies while this
45
+ * time window is active. First range starts at 0, ranges are ordered
46
+ * and strictly contiguous, and every range (including the last) has an
47
+ * explicit, finite `maxAmount`. Trades whose amount falls above the
48
+ * last range's cap fall through to the safe Other/manual fallback.
49
+ */
50
+ export interface FXTradingPolicyTimeRange {
51
+ startMinute: number;
52
+ endMinute: number;
53
+ executionThresholdMs: number;
54
+ byAmountRange: FXTradingPolicyAmountRange[];
55
+ }
56
+ /**
57
+ * Per-(fiat, settlement offset, side) trading rules.
58
+ *
59
+ * `byTimeRange` is the ordered list of time windows that govern routing
60
+ * and aggregation across a 24-hour day in the currency's country-local
61
+ * timezone. The resolver picks the window containing "now" and then
62
+ * uses that window's `executionThresholdMs` and `byAmountRange`.
63
+ */
64
+ export interface FXTradingSidePolicy {
65
+ byTimeRange: FXTradingPolicyTimeRange[];
66
+ }
67
+ export interface FXTradingPolicyBySide {
68
+ [Side.Buy]?: FXTradingSidePolicy;
69
+ [Side.Sell]?: FXTradingSidePolicy;
70
+ }
71
+ /**
72
+ * `default` applies whenever `byOffset[offset]` is not set for the
73
+ * requested (fiat, side). `byOffset` keys are stored as strings in Mongo
74
+ * (object property names) but always represent non-negative integer
75
+ * `twoWaySettlementDateOffset` values.
76
+ *
77
+ * Override semantics are all-or-nothing per side: if `byOffset[3].buy` is
78
+ * defined it fully replaces `default.buy` for offset 3 buy trades; nothing
79
+ * is merged field-by-field. Offsets that have no override fall back to
80
+ * `default` regardless of how distant they are from any configured
81
+ * override.
82
+ */
83
+ export interface FXTradingPoliciesForFiat {
84
+ default: FXTradingPolicyBySide;
85
+ byOffset?: {
86
+ [offset: number]: FXTradingPolicyBySide;
87
+ };
88
+ }
89
+ export type FXTradingPolicies = {
90
+ [key in Fiat]?: FXTradingPoliciesForFiat;
91
+ };
92
+ /**
93
+ * Result of resolving a (policy, amount) pair: the provider that should
94
+ * handle the trade and whether placement is automatic. Callers that need
95
+ * to know how the trade should be staged (Trading vs PendingApproval vs
96
+ * Completed) derive that from `{ provider, automatic }`.
97
+ *
98
+ * The runtime resolver (`resolveFXProviderForAmount` in common-server)
99
+ * returns `ResolvedFXPlacement` which adds the time-window-matched
100
+ * `executionThresholdMs`. Callers that only need to map a placement to
101
+ * the next FX-trade status (e.g. cosigner-notification, alternative
102
+ * approval) build a synthetic `ResolvedFXProvider` because the
103
+ * threshold is irrelevant to that decision.
104
+ */
105
+ export interface ResolvedFXProvider {
106
+ provider: FXProvider;
107
+ automatic: boolean;
108
+ }
109
+ /**
110
+ * Full output of `resolveFXProviderForAmount`. Adds the time-window's
111
+ * `executionThresholdMs` so callers (cron sweep, order-created
112
+ * listener) can decide whether to put the trade in
113
+ * PendingExecutionThreshold for aggregation or dispatch immediately.
114
+ *
115
+ * The threshold reflects the *current* time-of-day window in the
116
+ * currency's country-local timezone. Callers that retain a trade in
117
+ * PendingExecutionThreshold across a window boundary must re-resolve
118
+ * the threshold at sweep time - the rules of the now-active window
119
+ * apply, not the rules at creation time.
120
+ */
121
+ export interface ResolvedFXPlacement extends ResolvedFXProvider {
122
+ executionThresholdMs: number;
123
+ }
@@ -1,2 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const side_1 = require("./side");
@@ -1,6 +1,7 @@
1
1
  import { Country } from "./country";
2
2
  import { Fiat } from "./fiat";
3
3
  import { FXProvider } from "./fx-provider";
4
+ import { FXTradingPolicies } from "./fx-trading-policy";
4
5
  import { Processor } from "./processor";
5
6
  import { Side } from "./side";
6
7
  import { TVFXDataProvider } from "./TV-FX-data-provider";
@@ -9,12 +10,6 @@ export interface RioSettingsUpdate {
9
10
  afterHoursExchangeRateMarkup?: {
10
11
  [key: string]: number;
11
12
  };
12
- buyOrderAutomaticFXTradeLimit?: {
13
- [key: string]: number;
14
- };
15
- sellOrderAutomaticFXTradeLimit?: {
16
- [key: string]: number;
17
- };
18
13
  buyOrderAfterHoursExchangeRateMarkup?: {
19
14
  [key: string]: number;
20
15
  };
@@ -41,7 +36,7 @@ export interface RioSettingsUpdate {
41
36
  enabled: boolean;
42
37
  };
43
38
  };
44
- fxExecutionThreshold?: number;
39
+ fxTradingPolicies?: FXTradingPolicies;
45
40
  defaultServiceFee?: {
46
41
  [key in Country]?: {
47
42
  [key in Side]?: number;
@@ -3,6 +3,7 @@ import { DeferredPaymentType } from "./deferred-payment-type";
3
3
  import { EmarketsSettlementType } from "./emarkets-settlement-type";
4
4
  import { Fiat } from "./fiat";
5
5
  import { FXProvider } from "./fx-provider";
6
+ import { FXTradingPolicies } from "./fx-trading-policy";
6
7
  import { Processor } from "./processor";
7
8
  import { TransnetworkSettlementType } from "./transnetwork-settlement-type";
8
9
  import { Side } from "./side";
@@ -23,12 +24,6 @@ export interface RioSettings {
23
24
  frozen: boolean;
24
25
  };
25
26
  };
26
- buyOrderAutomaticFXTradeLimit: {
27
- [key: string]: number;
28
- };
29
- sellOrderAutomaticFXTradeLimit: {
30
- [key: string]: number;
31
- };
32
27
  buyOrderAfterHoursExchangeRateMarkup: {
33
28
  [key: string]: number;
34
29
  };
@@ -53,7 +48,14 @@ export interface RioSettings {
53
48
  };
54
49
  };
55
50
  };
56
- fxExecutionThreshold: number;
51
+ /**
52
+ * Per-(fiat, settlement offset, side) FX trading policies. Each side
53
+ * policy carries its own executionThresholdMs and an ordered list of
54
+ * amount ranges that map onto a provider and an automatic-vs-cosigner
55
+ * flag. Resolution is offset-aware: byOffset wins if set, otherwise
56
+ * default applies. See FXTradingSidePolicy for override semantics.
57
+ */
58
+ fxTradingPolicies?: FXTradingPolicies;
57
59
  defaultServiceFee: {
58
60
  [key in Country]?: {
59
61
  [key in Side]?: number;
@@ -3,5 +3,6 @@ export declare enum TransnetworkFXTradeStatus {
3
3
  Expired = "expired",
4
4
  Completed = "completed",
5
5
  Cancelled = "cancelled",
6
- Failed = "failed"
6
+ Failed = "failed",
7
+ PriceRejected = "priceRejected"
7
8
  }
@@ -8,4 +8,5 @@ var TransnetworkFXTradeStatus;
8
8
  TransnetworkFXTradeStatus["Completed"] = "completed";
9
9
  TransnetworkFXTradeStatus["Cancelled"] = "cancelled";
10
10
  TransnetworkFXTradeStatus["Failed"] = "failed";
11
+ TransnetworkFXTradeStatus["PriceRejected"] = "priceRejected";
11
12
  })(TransnetworkFXTradeStatus = exports.TransnetworkFXTradeStatus || (exports.TransnetworkFXTradeStatus = {}));
@@ -10,8 +10,6 @@ export interface TransnetworkFXTrade {
10
10
  provider: "BBVA";
11
11
  status: TransnetworkFXTradeStatus;
12
12
  settlementType: TransnetworkSettlementType;
13
- FXTradeId?: string;
14
- isExternalTrade: boolean;
15
13
  fiat: Fiat;
16
14
  amountToTrade: number;
17
15
  amountReceived?: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riocrypto/common",
3
- "version": "1.0.2583",
3
+ "version": "1.0.2587",
4
4
  "description": "",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",
@@ -1,12 +0,0 @@
1
- import { EmarketsSettlementType } from "../types/emarkets-settlement-type";
2
- import { FXProvider } from "../types/fx-provider";
3
- import { TransnetworkSettlementType } from "../types/transnetwork-settlement-type";
4
- import { Subjects } from "./subjects";
5
- export interface TransnetworkFXTradeAlternativeRequestedEvent {
6
- subject: Subjects.TransnetworkFXTradeAlternativeRequested;
7
- data: {
8
- id: string;
9
- newProvider?: FXProvider;
10
- newSettlementType?: TransnetworkSettlementType | EmarketsSettlementType;
11
- };
12
- }