@openora/core 0.4.1-canary.145 → 0.4.1-canary.147
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/.tsbuildinfo +1 -1
- package/dist/contracts/schemas/platform-config.d.ts +2 -0
- package/dist/contracts/schemas/platform-config.d.ts.map +1 -1
- package/dist/contracts/schemas/platform-config.js +6 -1
- package/dist/contracts/schemas/platform-config.js.map +1 -1
- package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.js +29 -15
- package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.js.map +1 -1
- package/dist/fx/exchange-rate/plugin.d.ts.map +1 -1
- package/dist/fx/exchange-rate/plugin.js +3 -7
- package/dist/fx/exchange-rate/plugin.js.map +1 -1
- package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.js +132 -7
- package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.js.map +1 -1
- package/dist/wallet/drizzle/migrations/0020_salty_infant_terrible.sql +1 -0
- package/dist/wallet/drizzle/migrations/meta/0020_snapshot.json +1979 -0
- package/dist/wallet/drizzle/migrations/meta/_journal.json +7 -0
- package/dist/wallet/plugin.d.ts.map +1 -1
- package/dist/wallet/plugin.js +2 -1
- package/dist/wallet/plugin.js.map +1 -1
- package/dist/wallet/schema/index.d.ts +17 -0
- package/dist/wallet/schema/index.d.ts.map +1 -1
- package/dist/wallet/schema/index.js +4 -0
- package/dist/wallet/schema/index.js.map +1 -1
- package/dist/wallet/service/wallet.service.d.ts +5 -2
- package/dist/wallet/service/wallet.service.d.ts.map +1 -1
- package/dist/wallet/service/wallet.service.js +49 -21
- package/dist/wallet/service/wallet.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -59,6 +59,8 @@ export declare const ExchangeRateConfigSchema: z.ZodObject<{
|
|
|
59
59
|
providerTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
60
60
|
}, z.core.$strict>;
|
|
61
61
|
export type ExchangeRateConfig = z.infer<typeof ExchangeRateConfigSchema>;
|
|
62
|
+
/** The pivot every fx conversion targets. One resolver, so no module converts against another. */
|
|
63
|
+
export declare function resolveExchangeRatePivot(config: ExchangeRateConfig | undefined): string;
|
|
62
64
|
export declare const NotificationsConfigSchema: z.ZodObject<{
|
|
63
65
|
retention: z.ZodOptional<z.ZodObject<{
|
|
64
66
|
days: z.ZodDefault<z.ZodNumber>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-config.d.ts","sourceRoot":"","sources":["../../../src/contracts/schemas/platform-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,kBAAkB,wCAAoC,CAAC;AAEpE,eAAO,MAAM,WAAW;;;;;kBAUb,CAAC;AAEZ,eAAO,MAAM,eAAe;;;;;kBAcjB,CAAC;AAEZ,eAAO,MAAM,0BAA0B;;;;kBAQ5B,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;kBAkEpB,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"platform-config.d.ts","sourceRoot":"","sources":["../../../src/contracts/schemas/platform-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,kBAAkB,wCAAoC,CAAC;AAEpE,eAAO,MAAM,WAAW;;;;;kBAUb,CAAC;AAEZ,eAAO,MAAM,eAAe;;;;;kBAcjB,CAAC;AAEZ,eAAO,MAAM,0BAA0B;;;;kBAQ5B,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;kBAkEpB,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D,eAAO,MAAM,wBAAwB;;;;;kBAY1B,CAAC;AAEZ,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,kGAAkG;AAClG,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,SAAS,GAAG,MAAM,CAEvF;AAED,eAAO,MAAM,yBAAyB;;;;;kBAc3B,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,wBAAwB;;;kBAU1B,CAAC;AAEZ;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,aAK9B,CAAC;AAEJ;;;;;;GAMG;AACH,eAAO,MAAM,mCAAmC,uBAAuB,CAAC;AAExE,eAAO,MAAM,wBAAwB,wDAuBa,CAAC;AAEnD,eAAO,MAAM,gBAAgB;;;;;kBAiBlB,CAAC;AACZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;kBAwC3B,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,eAAe;;kBAKjB,CAAC;AACZ,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA+D7B,CAAC;AAEL,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CAShF;AAED,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,EAAE,cAAyC,CAAC;AAE9E,+EAA+E;AAC/E,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAAiD,CAAC"}
|
|
@@ -118,10 +118,11 @@ export const WalletConfigSchema = z
|
|
|
118
118
|
.optional(),
|
|
119
119
|
})
|
|
120
120
|
.strict();
|
|
121
|
+
const DEFAULT_EXCHANGE_RATE_PIVOT = 'USD';
|
|
121
122
|
export const ExchangeRateConfigSchema = z
|
|
122
123
|
.object({
|
|
123
124
|
/** Comparison currency the fx module derives a cross rate against. Absent = 'USD'. */
|
|
124
|
-
pivot: CurrencyCodeSchema.default(
|
|
125
|
+
pivot: CurrencyCodeSchema.default(DEFAULT_EXCHANGE_RATE_PIVOT),
|
|
125
126
|
freshTtlMs: z.number().int().positive().default(60_000),
|
|
126
127
|
hardMaxAgeMs: z
|
|
127
128
|
.number()
|
|
@@ -131,6 +132,10 @@ export const ExchangeRateConfigSchema = z
|
|
|
131
132
|
providerTimeoutMs: z.number().int().positive().default(2_000),
|
|
132
133
|
})
|
|
133
134
|
.strict();
|
|
135
|
+
/** The pivot every fx conversion targets. One resolver, so no module converts against another. */
|
|
136
|
+
export function resolveExchangeRatePivot(config) {
|
|
137
|
+
return (config?.pivot ?? DEFAULT_EXCHANGE_RATE_PIVOT).toUpperCase();
|
|
138
|
+
}
|
|
134
139
|
export const NotificationsConfigSchema = z
|
|
135
140
|
.object({
|
|
136
141
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-config.js","sourceRoot":"","sources":["../../../src/contracts/schemas/platform-config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"platform-config.js","sourceRoot":"","sources":["../../../src/contracts/schemas/platform-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,12 +41,26 @@ function delayedProvider(rate, delayMs, asOf) {
|
|
|
41
41
|
}));
|
|
42
42
|
return mock({ getRate });
|
|
43
43
|
}
|
|
44
|
+
/** A provider whose quote is held until the test calls `release`, so no assertion races it. */
|
|
45
|
+
function gatedProvider(rate) {
|
|
46
|
+
let release = () => undefined;
|
|
47
|
+
const gate = new Promise((resolve) => {
|
|
48
|
+
release = resolve;
|
|
49
|
+
});
|
|
50
|
+
const getRate = vi.fn(async () => {
|
|
51
|
+
await gate;
|
|
52
|
+
return { rate, asOf: new Date().toISOString() };
|
|
53
|
+
});
|
|
54
|
+
return { provider: mock({ getRate }), release };
|
|
55
|
+
}
|
|
44
56
|
function baseDeps(over = {}) {
|
|
45
57
|
return {
|
|
46
58
|
drizzle: db.drizzle,
|
|
47
59
|
pivot: 'USD',
|
|
48
|
-
|
|
49
|
-
|
|
60
|
+
// Bands in minutes, not milliseconds: a quote's age is seeded in the past, so a wide band
|
|
61
|
+
// costs no wall time, while a narrow one let a loaded runner age a fresh seed into soft-stale.
|
|
62
|
+
freshTtlMs: 60_000,
|
|
63
|
+
hardMaxAgeMs: 120_000,
|
|
50
64
|
providerTimeoutMs: 150,
|
|
51
65
|
...over,
|
|
52
66
|
};
|
|
@@ -54,8 +68,8 @@ function baseDeps(over = {}) {
|
|
|
54
68
|
async function wait(ms) {
|
|
55
69
|
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
56
70
|
}
|
|
57
|
-
const SOFT_STALE_AGE_MS =
|
|
58
|
-
const HARD_STALE_AGE_MS =
|
|
71
|
+
const SOFT_STALE_AGE_MS = 90_000;
|
|
72
|
+
const HARD_STALE_AGE_MS = 180_000;
|
|
59
73
|
const PROVIDER_DELAY_PAST_TIMEOUT_MS = 500;
|
|
60
74
|
describe('ExchangeRateReaderService.getRate - identity and cross-pair derivation', () => {
|
|
61
75
|
it('returns the identity quote for the same currency on both sides without touching the table', async () => {
|
|
@@ -104,18 +118,16 @@ describe('ExchangeRateReaderService.getRate - age bands', () => {
|
|
|
104
118
|
});
|
|
105
119
|
it('soft-stale: returns the cached value immediately and refreshes in the background', async () => {
|
|
106
120
|
await seedQuote('EUR', 'USD', '1.100000000000000000', { ageMs: SOFT_STALE_AGE_MS });
|
|
107
|
-
const fiatProvider =
|
|
108
|
-
const reader = new ExchangeRateReaderService(baseDeps({ fiatProvider }));
|
|
109
|
-
|
|
121
|
+
const { provider: fiatProvider, release } = gatedProvider('1.500000000000000000');
|
|
122
|
+
const reader = new ExchangeRateReaderService(baseDeps({ fiatProvider, providerTimeoutMs: 10_000 }));
|
|
123
|
+
// The provider is held for the whole call, so a reader that awaited the refresh would
|
|
124
|
+
// never return here: returning at all proves the refresh stayed in the background.
|
|
110
125
|
const quote = await reader.getRate('EUR', 'USD');
|
|
111
|
-
const elapsed = Date.now() - start;
|
|
112
126
|
expect(quote?.rate).toBe('1.100000000000000000');
|
|
113
|
-
expect(elapsed).toBeLessThan(30);
|
|
114
|
-
// Polled, not slept: the provider resolves after 30ms but the write behind it lands
|
|
115
|
-
// whenever the pool hands back a connection, which on a loaded runner is well past any
|
|
116
|
-
// fixed deadline. Same idiom as the cross-leg refresh test below.
|
|
117
|
-
await vi.waitFor(async () => expect((await getRow('EUR', 'USD'))?.rate).toBe('1.500000000000000000'));
|
|
118
127
|
expect(fiatProvider.getRate).toHaveBeenCalledTimes(1);
|
|
128
|
+
release();
|
|
129
|
+
// Polled, not slept: the write lands whenever the pool hands back a connection.
|
|
130
|
+
await vi.waitFor(async () => expect((await getRow('EUR', 'USD'))?.rate).toBe('1.500000000000000000'));
|
|
119
131
|
});
|
|
120
132
|
it('soft-stale: a background refresh timeout is completely invisible to the caller', async () => {
|
|
121
133
|
await seedQuote('EUR', 'USD', '1.100000000000000000', { ageMs: SOFT_STALE_AGE_MS });
|
|
@@ -178,8 +190,10 @@ describe('ExchangeRateReaderService.getRate - age bands', () => {
|
|
|
178
190
|
describe('ExchangeRateReaderService.getRate - single-flight', () => {
|
|
179
191
|
it('collapses concurrent hard-stale callers for the same leg into one provider call', async () => {
|
|
180
192
|
const providerAsOf = agedIso(0);
|
|
181
|
-
|
|
182
|
-
|
|
193
|
+
// Every caller reads the row before it can join the in-flight call, so the provider must
|
|
194
|
+
// outlast the slowest of three concurrent reads; 40ms did not on a loaded runner.
|
|
195
|
+
const fiatProvider = delayedProvider('1.200000000000000000', 500, providerAsOf);
|
|
196
|
+
const reader = new ExchangeRateReaderService(baseDeps({ fiatProvider, providerTimeoutMs: 5_000 }));
|
|
183
197
|
const [a, b, c] = await Promise.all([
|
|
184
198
|
reader.getRate('EUR', 'USD'),
|
|
185
199
|
reader.getRate('EUR', 'USD'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exchange-rate-reader.service.int.test.js","sourceRoot":"","sources":["../../../../src/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"exchange-rate-reader.service.int.test.js","sourceRoot":"","sources":["../../../../src/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/fx/exchange-rate/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/fx/exchange-rate/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,wBAmC8C"}
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import { DRIZZLE } from '@openora/core/server';
|
|
2
|
-
import { CRYPTO_EXCHANGE_RATE_PROVIDER, FIAT_EXCHANGE_RATE_PROVIDER, EXCHANGE_RATE_READER, PLATFORM_CONFIG, resolveDisplayCurrencies, } from '@openora/core/contracts';
|
|
2
|
+
import { CRYPTO_EXCHANGE_RATE_PROVIDER, FIAT_EXCHANGE_RATE_PROVIDER, EXCHANGE_RATE_READER, PLATFORM_CONFIG, resolveDisplayCurrencies, resolveExchangeRatePivot, } from '@openora/core/contracts';
|
|
3
3
|
import { ExchangeRateService } from './service/exchange-rate.service.js';
|
|
4
4
|
import { createExchangeRateRouter } from './router/index.js';
|
|
5
5
|
import { ExchangeRateReaderService } from './adapters/exchange-rate-reader.service.js';
|
|
6
|
-
const DEFAULT_PIVOT = 'USD';
|
|
7
6
|
const DEFAULT_FRESH_TTL_MS = 60_000;
|
|
8
7
|
const DEFAULT_HARD_MAX_AGE_MS = 15 * 60_000;
|
|
9
8
|
const DEFAULT_PROVIDER_TIMEOUT_MS = 2_000;
|
|
10
|
-
function resolvePivot(platformConfig) {
|
|
11
|
-
return (platformConfig.exchangeRate?.pivot ?? DEFAULT_PIVOT).toUpperCase();
|
|
12
|
-
}
|
|
13
9
|
export default {
|
|
14
10
|
id: 'exchange-rate',
|
|
15
11
|
register(ctx) {
|
|
@@ -18,7 +14,7 @@ export default {
|
|
|
18
14
|
const exchangeRateConfig = platformConfig.exchangeRate;
|
|
19
15
|
return new ExchangeRateReaderService({
|
|
20
16
|
drizzle: c.get(DRIZZLE),
|
|
21
|
-
pivot:
|
|
17
|
+
pivot: resolveExchangeRatePivot(exchangeRateConfig),
|
|
22
18
|
cryptoProvider: c.has(CRYPTO_EXCHANGE_RATE_PROVIDER)
|
|
23
19
|
? c.get(CRYPTO_EXCHANGE_RATE_PROVIDER)
|
|
24
20
|
: undefined,
|
|
@@ -37,7 +33,7 @@ export default {
|
|
|
37
33
|
// every cross rate is computed through it, so a quote against it is always legitimate.
|
|
38
34
|
const supported = [
|
|
39
35
|
...resolveDisplayCurrencies(platformConfig.displayCurrencies),
|
|
40
|
-
|
|
36
|
+
resolveExchangeRatePivot(platformConfig.exchangeRate),
|
|
41
37
|
];
|
|
42
38
|
return createExchangeRateRouter(new ExchangeRateService(c.get(EXCHANGE_RATE_READER), supported));
|
|
43
39
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/fx/exchange-rate/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,EAC3B,oBAAoB,EACpB,eAAe,EACf,wBAAwB,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/fx/exchange-rate/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,EAC3B,oBAAoB,EACpB,eAAe,EACf,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AAEvF,MAAM,oBAAoB,GAAG,MAAM,CAAC;AACpC,MAAM,uBAAuB,GAAG,EAAE,GAAG,MAAM,CAAC;AAC5C,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAE1C,eAAe;IACb,EAAE,EAAE,eAAe;IACnB,QAAQ,CAAC,GAAG;QACV,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAmC,EAAE,EAAE;YACxE,MAAM,cAAc,GAAG,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC9C,MAAM,kBAAkB,GAAG,cAAc,CAAC,YAAY,CAAC;YACvD,OAAO,IAAI,yBAAyB,CAAC;gBACnC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;gBACvB,KAAK,EAAE,wBAAwB,CAAC,kBAAkB,CAAC;gBACnD,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,6BAA6B,CAAC;oBAClD,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,6BAA6B,CAAC;oBACtC,CAAC,CAAC,SAAS;gBACb,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,2BAA2B,CAAC;oBAC9C,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,2BAA2B,CAAC;oBACpC,CAAC,CAAC,SAAS;gBACb,gBAAgB,EAAE,cAAc,CAAC,MAAM,EAAE,gBAAgB;gBACzD,UAAU,EAAE,kBAAkB,EAAE,UAAU,IAAI,oBAAoB;gBAClE,YAAY,EAAE,kBAAkB,EAAE,YAAY,IAAI,uBAAuB;gBACzE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,IAAI,2BAA2B;aACxF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE;YACpC,MAAM,cAAc,GAAG,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC9C,iFAAiF;YACjF,uFAAuF;YACvF,MAAM,SAAS,GAAG;gBAChB,GAAG,wBAAwB,CAAC,cAAc,CAAC,iBAAiB,CAAC;gBAC7D,wBAAwB,CAAC,cAAc,CAAC,YAAY,CAAC;aACtD,CAAC;YACF,OAAO,wBAAwB,CAC7B,IAAI,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,SAAS,CAAC,CAChE,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CAC0C,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeAll, afterAll, beforeEach } from 'vitest';
|
|
2
|
-
import { findOneOrThrow } from '@openora/core/server';
|
|
2
|
+
import { findOneOrThrow, moneyScaleBy } from '@openora/core/server';
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
4
|
import { eq, sql } from 'drizzle-orm';
|
|
5
5
|
import { DEFAULT_PAYMENT_PROVIDER, } from '@openora/core/contracts';
|
|
@@ -20,7 +20,21 @@ const MIGRATION_DEFAULT_EXCLUDE_RISK_FLAGS = [
|
|
|
20
20
|
'withdrawal_review',
|
|
21
21
|
'multi_account',
|
|
22
22
|
];
|
|
23
|
-
|
|
23
|
+
// USD per unit. One BTC at 1000 keeps a one-coin withdrawal under the 5000 large-amount
|
|
24
|
+
// heuristic, so the crypto cases below exercise the threshold rather than the heuristic.
|
|
25
|
+
const USD_PER_UNIT = { BTC: '1000', USDT: '1' };
|
|
26
|
+
function fixedRates() {
|
|
27
|
+
return mock({
|
|
28
|
+
convert: vi.fn(async (amount, from, to) => {
|
|
29
|
+
const perUnit = USD_PER_UNIT[from];
|
|
30
|
+
if (from === to) {
|
|
31
|
+
return amount;
|
|
32
|
+
}
|
|
33
|
+
return perUnit && to === 'USD' ? moneyScaleBy(amount, perUnit) : null;
|
|
34
|
+
}),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async function makeService({ autoWithdrawal, rates = fixedRates(), fiatThreshold, cryptoThreshold, excludeRiskFlags, skipConfigSeed = false, kycStatus = 'verified', directoryThrows = false, riskTags = [], } = {}) {
|
|
24
38
|
if (autoWithdrawal && !skipConfigSeed) {
|
|
25
39
|
await db.drizzle.db.insert(walletAutoWithdrawalConfig).values({
|
|
26
40
|
singletonKey: 'global',
|
|
@@ -57,6 +71,7 @@ async function makeService({ autoWithdrawal, fiatThreshold, cryptoThreshold, exc
|
|
|
57
71
|
identityReader: makeIdentityReader(),
|
|
58
72
|
directory,
|
|
59
73
|
platformConfig,
|
|
74
|
+
...(rates === 'unbound' ? {} : { rates }),
|
|
60
75
|
...(riskTags === 'unbound'
|
|
61
76
|
? {}
|
|
62
77
|
: {
|
|
@@ -110,6 +125,7 @@ describe('WalletService.withdraw auto-approval (real PG)', () => {
|
|
|
110
125
|
reviewedBy: null,
|
|
111
126
|
reviewReason: 'auto-approved',
|
|
112
127
|
providerName: DEFAULT_PAYMENT_PROVIDER,
|
|
128
|
+
autoApprovalPivotAmount: '40.000000000000000000',
|
|
113
129
|
});
|
|
114
130
|
expect(events.emit.mock.calls.map(([topic]) => topic)).toEqual([
|
|
115
131
|
'wallet.withdrawal.requested',
|
|
@@ -124,6 +140,8 @@ describe('WalletService.withdraw auto-approval (real PG)', () => {
|
|
|
124
140
|
threshold: '1000.000000000000000000',
|
|
125
141
|
thresholdSource: 'global',
|
|
126
142
|
kycStatus: 'verified',
|
|
143
|
+
pivotAmount: '40',
|
|
144
|
+
pivotCurrency: 'USD',
|
|
127
145
|
cumulativeCountUsed: 0,
|
|
128
146
|
}),
|
|
129
147
|
}));
|
|
@@ -458,6 +476,21 @@ describe('WalletService.withdraw auto-approval (real PG)', () => {
|
|
|
458
476
|
});
|
|
459
477
|
expect(result.status).toBe('completed');
|
|
460
478
|
});
|
|
479
|
+
it('auto-approves a withdrawal already in the pivot without the fx module', async () => {
|
|
480
|
+
const { svc } = await makeService({
|
|
481
|
+
autoWithdrawal: {},
|
|
482
|
+
fiatThreshold: '1000',
|
|
483
|
+
rates: 'unbound',
|
|
484
|
+
});
|
|
485
|
+
const w = await seedWallet();
|
|
486
|
+
const result = await svc.withdraw({
|
|
487
|
+
userId: w.userId,
|
|
488
|
+
amount: '40',
|
|
489
|
+
currency: 'USD',
|
|
490
|
+
...NO_CLIENT_META,
|
|
491
|
+
});
|
|
492
|
+
expect(result.status).toBe('completed');
|
|
493
|
+
});
|
|
461
494
|
it('stays pending when a configured daily count cap would be exceeded', async () => {
|
|
462
495
|
const { svc } = await makeService({
|
|
463
496
|
autoWithdrawal: { dailyCapCount: 1 },
|
|
@@ -493,6 +526,29 @@ describe('WalletService.withdraw auto-approval (real PG)', () => {
|
|
|
493
526
|
currency: 'USD',
|
|
494
527
|
status: 'completed',
|
|
495
528
|
reviewReason: 'auto-approved',
|
|
529
|
+
autoApprovalPivotAmount: '20',
|
|
530
|
+
});
|
|
531
|
+
const result = await svc.withdraw({
|
|
532
|
+
userId: w.userId,
|
|
533
|
+
amount: '40',
|
|
534
|
+
currency: 'USD',
|
|
535
|
+
...NO_CLIENT_META,
|
|
536
|
+
});
|
|
537
|
+
expect(result.status).toBe('pending');
|
|
538
|
+
});
|
|
539
|
+
it('stays pending when a trailing auto-approval has no stored pivot value to sum', async () => {
|
|
540
|
+
const { svc } = await makeService({
|
|
541
|
+
autoWithdrawal: { dailyCapAmount: '1000' },
|
|
542
|
+
fiatThreshold: '1000',
|
|
543
|
+
});
|
|
544
|
+
const w = await seedWallet();
|
|
545
|
+
await db.drizzle.db.insert(walletTransaction).values({
|
|
546
|
+
walletId: w.id,
|
|
547
|
+
type: 'withdrawal',
|
|
548
|
+
amount: '1',
|
|
549
|
+
currency: 'USD',
|
|
550
|
+
status: 'completed',
|
|
551
|
+
reviewReason: 'auto-approved',
|
|
496
552
|
});
|
|
497
553
|
const result = await svc.withdraw({
|
|
498
554
|
userId: w.userId,
|
|
@@ -552,7 +608,7 @@ describe('WalletService.withdraw auto-approval - crypto rail (real PG)', () => {
|
|
|
552
608
|
expect(result.status).toBe('pending');
|
|
553
609
|
});
|
|
554
610
|
it('auto-approves once an operator configures a positive cryptoThreshold', async () => {
|
|
555
|
-
const { svc } = await makeService({ autoWithdrawal: {}, cryptoThreshold: '
|
|
611
|
+
const { svc } = await makeService({ autoWithdrawal: {}, cryptoThreshold: '2000' });
|
|
556
612
|
const w = await seedWallet({ currency: 'BTC', balance: '10' });
|
|
557
613
|
const result = await svc.withdraw({
|
|
558
614
|
userId: w.userId,
|
|
@@ -569,7 +625,35 @@ describe('WalletService.withdraw auto-approval - crypto rail (real PG)', () => {
|
|
|
569
625
|
});
|
|
570
626
|
});
|
|
571
627
|
it('stays pending when the crypto amount exceeds cryptoThreshold', async () => {
|
|
572
|
-
const { svc } = await makeService({ autoWithdrawal: {}, cryptoThreshold: '
|
|
628
|
+
const { svc } = await makeService({ autoWithdrawal: {}, cryptoThreshold: '500' });
|
|
629
|
+
const w = await seedWallet({ currency: 'BTC', balance: '10' });
|
|
630
|
+
const result = await svc.withdraw({
|
|
631
|
+
userId: w.userId,
|
|
632
|
+
amount: '1',
|
|
633
|
+
currency: 'BTC',
|
|
634
|
+
destinationAddress: 'bc1qexample',
|
|
635
|
+
...NO_CLIENT_META,
|
|
636
|
+
});
|
|
637
|
+
expect(result.status).toBe('pending');
|
|
638
|
+
});
|
|
639
|
+
it('judges a crypto withdrawal by its pivot value, not its raw amount', async () => {
|
|
640
|
+
const { svc } = await makeService({ autoWithdrawal: {}, cryptoThreshold: '1000' });
|
|
641
|
+
const w = await seedWallet({ currency: 'BTC', balance: '10' });
|
|
642
|
+
const result = await svc.withdraw({
|
|
643
|
+
userId: w.userId,
|
|
644
|
+
amount: '2',
|
|
645
|
+
currency: 'BTC',
|
|
646
|
+
destinationAddress: 'bc1qexample',
|
|
647
|
+
...NO_CLIENT_META,
|
|
648
|
+
});
|
|
649
|
+
expect(result.status).toBe('pending');
|
|
650
|
+
});
|
|
651
|
+
it('stays pending when there is no rate to value the withdrawal in the pivot', async () => {
|
|
652
|
+
const { svc } = await makeService({
|
|
653
|
+
autoWithdrawal: {},
|
|
654
|
+
cryptoThreshold: '100000',
|
|
655
|
+
rates: 'unbound',
|
|
656
|
+
});
|
|
573
657
|
const w = await seedWallet({ currency: 'BTC', balance: '10' });
|
|
574
658
|
const result = await svc.withdraw({
|
|
575
659
|
userId: w.userId,
|
|
@@ -580,10 +664,51 @@ describe('WalletService.withdraw auto-approval - crypto rail (real PG)', () => {
|
|
|
580
664
|
});
|
|
581
665
|
expect(result.status).toBe('pending');
|
|
582
666
|
});
|
|
667
|
+
it('stays pending when the bound reader has no rate for the currency', async () => {
|
|
668
|
+
const { svc } = await makeService({
|
|
669
|
+
autoWithdrawal: {},
|
|
670
|
+
fiatThreshold: '100000',
|
|
671
|
+
cryptoThreshold: '100000',
|
|
672
|
+
});
|
|
673
|
+
const w = await seedWallet({ currency: 'ETH', balance: '10' });
|
|
674
|
+
const result = await svc.withdraw({
|
|
675
|
+
userId: w.userId,
|
|
676
|
+
amount: '1',
|
|
677
|
+
currency: 'ETH',
|
|
678
|
+
destinationAddress: '0xexample',
|
|
679
|
+
...NO_CLIENT_META,
|
|
680
|
+
});
|
|
681
|
+
expect(result.status).toBe('pending');
|
|
682
|
+
});
|
|
683
|
+
it('caps on the pivot value a past payout was approved at, not its value at the current rate', async () => {
|
|
684
|
+
const { svc } = await makeService({
|
|
685
|
+
autoWithdrawal: { dailyCapAmount: '1500' },
|
|
686
|
+
cryptoThreshold: '2000',
|
|
687
|
+
});
|
|
688
|
+
const w = await seedWallet({ currency: 'BTC', balance: '10' });
|
|
689
|
+
// Approved when BTC was 1400; at today's 1000 the same payout would leave room for 0.2 BTC.
|
|
690
|
+
await db.drizzle.db.insert(walletTransaction).values({
|
|
691
|
+
walletId: w.id,
|
|
692
|
+
type: 'withdrawal',
|
|
693
|
+
amount: '1',
|
|
694
|
+
currency: 'BTC',
|
|
695
|
+
status: 'completed',
|
|
696
|
+
reviewReason: 'auto-approved',
|
|
697
|
+
autoApprovalPivotAmount: '1400',
|
|
698
|
+
});
|
|
699
|
+
const result = await svc.withdraw({
|
|
700
|
+
userId: w.userId,
|
|
701
|
+
amount: '0.2',
|
|
702
|
+
currency: 'BTC',
|
|
703
|
+
destinationAddress: 'bc1qexample',
|
|
704
|
+
...NO_CLIENT_META,
|
|
705
|
+
});
|
|
706
|
+
expect(result.status).toBe('pending');
|
|
707
|
+
});
|
|
583
708
|
it('applies the same KYC guard as the fiat rail', async () => {
|
|
584
709
|
const { svc } = await makeService({
|
|
585
710
|
autoWithdrawal: {},
|
|
586
|
-
cryptoThreshold: '
|
|
711
|
+
cryptoThreshold: '2000',
|
|
587
712
|
kycStatus: 'rejected',
|
|
588
713
|
});
|
|
589
714
|
const w = await seedWallet({ currency: 'BTC', balance: '10' });
|
|
@@ -657,11 +782,11 @@ describe('WalletService auto-approval threshold resolution (real PG)', () => {
|
|
|
657
782
|
expect(result.status).toBe('pending');
|
|
658
783
|
});
|
|
659
784
|
it('a per-player rule overrides the crypto threshold too', async () => {
|
|
660
|
-
const { svc } = await makeService({ autoWithdrawal: {}, cryptoThreshold: '
|
|
785
|
+
const { svc } = await makeService({ autoWithdrawal: {}, cryptoThreshold: '500' });
|
|
661
786
|
const w = await seedWallet({ currency: 'BTC', balance: '10' });
|
|
662
787
|
await svc.setAutoWithdrawalRule({
|
|
663
788
|
userId: w.userId,
|
|
664
|
-
threshold: '
|
|
789
|
+
threshold: '2000',
|
|
665
790
|
reason: 'trusted',
|
|
666
791
|
createdBy: randomUUID(),
|
|
667
792
|
});
|