@dynamic-labs/sdk-react-core 4.96.4 → 4.97.0
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/CHANGELOG.md +12 -0
- package/package.cjs +1 -1
- package/package.js +1 -1
- package/package.json +12 -12
- package/src/lib/context/DynamicContext/DynamicContext.cjs +2 -0
- package/src/lib/context/DynamicContext/DynamicContext.js +2 -0
- package/src/lib/context/ErrorContext/hooks/useErrorText/useErrorText.cjs +1 -0
- package/src/lib/context/ErrorContext/hooks/useErrorText/useErrorText.js +2 -1
- package/src/lib/data/api/transactions/index.d.ts +1 -0
- package/src/lib/data/api/transactions/screenTransaction.cjs +107 -0
- package/src/lib/data/api/transactions/screenTransaction.d.ts +12 -0
- package/src/lib/data/api/transactions/screenTransaction.js +101 -0
- package/src/lib/utils/functions/updatePrimaryWalletId/updatePrimaryWalletId.cjs +1 -1
- package/src/lib/utils/functions/updatePrimaryWalletId/updatePrimaryWalletId.js +1 -1
- package/src/lib/utils/hooks/useCreateWalletConnectorOptions/useCreateWalletConnectorOptions.d.ts +2 -1
- package/src/lib/utils/hooks/useMfa/useMfa.cjs +1 -1
- package/src/lib/utils/hooks/useMfa/useMfa.js +1 -1
- package/src/lib/views/MergeUserAccountsWithSameEmailView/MergeUserAccountsWithSameEmailView.cjs +1 -1
- package/src/lib/views/MergeUserAccountsWithSameEmailView/MergeUserAccountsWithSameEmailView.js +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
|
|
2
|
+
## [4.97.0](https://github.com/dynamic-labs/dynamic-auth/compare/v4.96.4...v4.97.0) (2026-08-27)
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
* **screening:** connected-wallet transaction screening [v4 backport] (DYNT-1663) ([#12284](https://github.com/dynamic-labs/dynamic-auth/issues/12284)) ([294adba](https://github.com/dynamic-labs/dynamic-auth/commit/294adba7dba8f321f3b1e8413f73545701e51252)), closes [#12160](https://github.com/dynamic-labs/dynamic-auth/issues/12160) [#12167](https://github.com/dynamic-labs/dynamic-auth/issues/12167) [#12168](https://github.com/dynamic-labs/dynamic-auth/issues/12168) [#12169](https://github.com/dynamic-labs/dynamic-auth/issues/12169) [#12172](https://github.com/dynamic-labs/dynamic-auth/issues/12172)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Bug Fixes
|
|
11
|
+
|
|
12
|
+
* **screening:** wire connected-wallet screening into the Send Balance UI (DYNT-1663) ([#12289](https://github.com/dynamic-labs/dynamic-auth/issues/12289)) ([1587cd8](https://github.com/dynamic-labs/dynamic-auth/commit/1587cd833370e18fa383f942521500e4c1576390))
|
|
13
|
+
|
|
2
14
|
### [4.96.4](https://github.com/dynamic-labs/dynamic-auth/compare/v4.96.3...v4.96.4) (2026-08-26)
|
|
3
15
|
|
|
4
16
|
|
package/package.cjs
CHANGED
package/package.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-labs/sdk-react-core",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.97.0",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"@dynamic-labs/sdk-api-core": "0.12.0",
|
|
6
6
|
"@dynamic-labs-sdk/client": "1.27.1",
|
|
@@ -18,17 +18,17 @@
|
|
|
18
18
|
"react-i18next": "13.5.0",
|
|
19
19
|
"react-international-phone": "4.5.0",
|
|
20
20
|
"yup": "0.32.11",
|
|
21
|
-
"@dynamic-labs/assert-package-version": "4.
|
|
22
|
-
"@dynamic-labs/iconic": "4.
|
|
23
|
-
"@dynamic-labs/locale": "4.
|
|
24
|
-
"@dynamic-labs/logger": "4.
|
|
25
|
-
"@dynamic-labs/multi-wallet": "4.
|
|
26
|
-
"@dynamic-labs/rpc-providers": "4.
|
|
27
|
-
"@dynamic-labs/store": "4.
|
|
28
|
-
"@dynamic-labs/types": "4.
|
|
29
|
-
"@dynamic-labs/utils": "4.
|
|
30
|
-
"@dynamic-labs/wallet-book": "4.
|
|
31
|
-
"@dynamic-labs/wallet-connector-core": "4.
|
|
21
|
+
"@dynamic-labs/assert-package-version": "4.97.0",
|
|
22
|
+
"@dynamic-labs/iconic": "4.97.0",
|
|
23
|
+
"@dynamic-labs/locale": "4.97.0",
|
|
24
|
+
"@dynamic-labs/logger": "4.97.0",
|
|
25
|
+
"@dynamic-labs/multi-wallet": "4.97.0",
|
|
26
|
+
"@dynamic-labs/rpc-providers": "4.97.0",
|
|
27
|
+
"@dynamic-labs/store": "4.97.0",
|
|
28
|
+
"@dynamic-labs/types": "4.97.0",
|
|
29
|
+
"@dynamic-labs/utils": "4.97.0",
|
|
30
|
+
"@dynamic-labs/wallet-book": "4.97.0",
|
|
31
|
+
"@dynamic-labs/wallet-connector-core": "4.97.0",
|
|
32
32
|
"eventemitter3": "5.0.1"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
@@ -34,6 +34,7 @@ var nonce = require('../../store/state/nonce/nonce.cjs');
|
|
|
34
34
|
require('@dynamic-labs-wallet/browser-wallet-client');
|
|
35
35
|
var ApiEndpoint = require('../../config/ApiEndpoint.cjs');
|
|
36
36
|
var settings = require('../../data/api/settings/settings.cjs');
|
|
37
|
+
var screenTransaction = require('../../data/api/transactions/screenTransaction.cjs');
|
|
37
38
|
var dynamicContextProps = require('../../store/state/dynamicContextProps/dynamicContextProps.cjs');
|
|
38
39
|
var primaryWalletId = require('../../store/state/primaryWalletId/primaryWalletId.cjs');
|
|
39
40
|
var connectedWalletsInfo = require('../../store/state/connectedWalletsInfo/connectedWalletsInfo.cjs');
|
|
@@ -301,6 +302,7 @@ const InnerDynamicContextProvider = (props) => {
|
|
|
301
302
|
mobileExperience,
|
|
302
303
|
networkConfigurations: serverNetworkConfigurations,
|
|
303
304
|
projectSettings,
|
|
305
|
+
transactionScreening: screenTransaction.transactionScreeningService,
|
|
304
306
|
useMetamaskSdk,
|
|
305
307
|
walletBook: walletBook$1,
|
|
306
308
|
walletConnectPreferredChains,
|
|
@@ -30,6 +30,7 @@ import { useFetchNonce, useNonce } from '../../store/state/nonce/nonce.js';
|
|
|
30
30
|
import '@dynamic-labs-wallet/browser-wallet-client';
|
|
31
31
|
import ApiEndpoint from '../../config/ApiEndpoint.js';
|
|
32
32
|
import { sendDynamicProps } from '../../data/api/settings/settings.js';
|
|
33
|
+
import { transactionScreeningService } from '../../data/api/transactions/screenTransaction.js';
|
|
33
34
|
import { useSyncDynamicContextProps } from '../../store/state/dynamicContextProps/dynamicContextProps.js';
|
|
34
35
|
import { usePrimaryWalletId } from '../../store/state/primaryWalletId/primaryWalletId.js';
|
|
35
36
|
import { resetConnectedWalletsInfo } from '../../store/state/connectedWalletsInfo/connectedWalletsInfo.js';
|
|
@@ -297,6 +298,7 @@ const InnerDynamicContextProvider = (props) => {
|
|
|
297
298
|
mobileExperience,
|
|
298
299
|
networkConfigurations: serverNetworkConfigurations,
|
|
299
300
|
projectSettings,
|
|
301
|
+
transactionScreening: transactionScreeningService,
|
|
300
302
|
useMetamaskSdk,
|
|
301
303
|
walletBook,
|
|
302
304
|
walletConnectPreferredChains,
|
|
@@ -23,6 +23,7 @@ const mapErrorCodeToTranslation = {
|
|
|
23
23
|
[utils.ErrorCode.CREDENTIAL_NOT_ENABLED_FOR_SIGN_IN]: 'dyn_error.credential_not_enabled_for_sign_in',
|
|
24
24
|
[utils.ErrorCode.SEI_NOT_ENABLED_IN_KEPLR_WALLET]: 'dyn_error.sei_not_enabled_in_keplr_wallet',
|
|
25
25
|
[utils.RATE_LIMIT_ERROR_CODE]: 'dyn_error.rate_limit_error',
|
|
26
|
+
[utils.TRANSACTION_SCREENING_BLOCKED_ERROR_CODE]: 'dyn_error.transaction_screening_blocked',
|
|
26
27
|
};
|
|
27
28
|
/** A hook that listens to the error context and returns a translated value */
|
|
28
29
|
const useErrorText = () => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
import { useMemo } from 'react';
|
|
3
3
|
import { useTranslation } from 'react-i18next';
|
|
4
|
-
import { ErrorCode, RATE_LIMIT_ERROR_CODE } from '@dynamic-labs/utils';
|
|
4
|
+
import { ErrorCode, RATE_LIMIT_ERROR_CODE, TRANSACTION_SCREENING_BLOCKED_ERROR_CODE } from '@dynamic-labs/utils';
|
|
5
5
|
import { useErrorContext } from '../../ErrorContext.js';
|
|
6
6
|
|
|
7
7
|
const mapErrorCodeToTranslation = {
|
|
@@ -19,6 +19,7 @@ const mapErrorCodeToTranslation = {
|
|
|
19
19
|
[ErrorCode.CREDENTIAL_NOT_ENABLED_FOR_SIGN_IN]: 'dyn_error.credential_not_enabled_for_sign_in',
|
|
20
20
|
[ErrorCode.SEI_NOT_ENABLED_IN_KEPLR_WALLET]: 'dyn_error.sei_not_enabled_in_keplr_wallet',
|
|
21
21
|
[RATE_LIMIT_ERROR_CODE]: 'dyn_error.rate_limit_error',
|
|
22
|
+
[TRANSACTION_SCREENING_BLOCKED_ERROR_CODE]: 'dyn_error.transaction_screening_blocked',
|
|
22
23
|
};
|
|
23
24
|
/** A hook that listens to the error context and returns a translated value */
|
|
24
25
|
const useErrorText = () => {
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
+
|
|
6
|
+
var _tslib = require('../../../../../_virtual/_tslib.cjs');
|
|
7
|
+
var sdkApiCore = require('@dynamic-labs/sdk-api-core');
|
|
8
|
+
var utils = require('@dynamic-labs/utils');
|
|
9
|
+
var api = require('../api.cjs');
|
|
10
|
+
require('@dynamic-labs/iconic');
|
|
11
|
+
require('@dynamic-labs/wallet-connector-core');
|
|
12
|
+
require('react');
|
|
13
|
+
require('react/jsx-runtime');
|
|
14
|
+
require('../../../context/ViewContext/ViewContext.cjs');
|
|
15
|
+
var logger = require('../../../shared/logger.cjs');
|
|
16
|
+
require('@dynamic-labs/wallet-book');
|
|
17
|
+
require('../../../utils/constants/colors.cjs');
|
|
18
|
+
require('../../../utils/constants/values.cjs');
|
|
19
|
+
require('../../../shared/consts/index.cjs');
|
|
20
|
+
var dynamicContextProps = require('../../../store/state/dynamicContextProps/dynamicContextProps.cjs');
|
|
21
|
+
require('@dynamic-labs-sdk/client/core');
|
|
22
|
+
require('eventemitter3');
|
|
23
|
+
require('@dynamic-labs-sdk/client');
|
|
24
|
+
require('../../../config/ApiEndpoint.cjs');
|
|
25
|
+
require('@dynamic-labs/multi-wallet');
|
|
26
|
+
require('react-international-phone');
|
|
27
|
+
require('../../../store/state/nonce/nonce.cjs');
|
|
28
|
+
require('@dynamic-labs-wallet/browser-wallet-client');
|
|
29
|
+
require('@dynamic-labs/locale');
|
|
30
|
+
require('../../../store/state/primaryWalletId/primaryWalletId.cjs');
|
|
31
|
+
require('../../../store/state/connectedWalletsInfo/connectedWalletsInfo.cjs');
|
|
32
|
+
require('../../../utils/functions/getWaasAddressTypeLabel/getWaasAddressTypeLabel.cjs');
|
|
33
|
+
require('../../../events/dynamicEvents.cjs');
|
|
34
|
+
var getProjectSettings = require('../../../client/extension/projectSettings/getProjectSettings/getProjectSettings.cjs');
|
|
35
|
+
|
|
36
|
+
// The SDK-internal chain union (shared across connector packages) is decoupled
|
|
37
|
+
// from the wire-level enum; this is the one place that needs to know both.
|
|
38
|
+
// Resolved per call rather than as a module-scope map, as is the block decision
|
|
39
|
+
// at the bottom of this file: reading an enum member at module scope resolves it
|
|
40
|
+
// the moment anything in this barrel's import graph loads, which takes down every
|
|
41
|
+
// spec that partially mocks sdk-api-core before a single test can run.
|
|
42
|
+
const chainEnumFor = (chain) => {
|
|
43
|
+
const chainEnumByScreeningChain = {
|
|
44
|
+
BTC: sdkApiCore.ChainEnum.Btc,
|
|
45
|
+
EVM: sdkApiCore.ChainEnum.Evm,
|
|
46
|
+
SOL: sdkApiCore.ChainEnum.Sol,
|
|
47
|
+
};
|
|
48
|
+
return chainEnumByScreeningChain[chain];
|
|
49
|
+
};
|
|
50
|
+
// A human is waiting on this call: it sits between "send" and the wallet
|
|
51
|
+
// prompt, so an unbounded fetch would stall the prompt indefinitely on a
|
|
52
|
+
// redcoast outage. Matches the enclave hook's 2000 ms wall-clock bound
|
|
53
|
+
// (SANCTIONS_SCREENING_TIMEOUT_MS) so both screening paths degrade alike.
|
|
54
|
+
const SCREENING_TIMEOUT_MS = 2000;
|
|
55
|
+
const isScreeningEnabled = () => {
|
|
56
|
+
var _a, _b, _c;
|
|
57
|
+
return Boolean((_c = (_b = (_a = getProjectSettings.getProjectSettings()) === null || _a === void 0 ? void 0 : _a.sdk) === null || _b === void 0 ? void 0 : _b.featureFlags) === null || _c === void 0 ? void 0 : _c.enableExternalWalletOnTransactionSanctions);
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Screens a connected-wallet transaction against the environment's sanctions
|
|
61
|
+
* providers before the wallet is prompted. Best-effort by construction:
|
|
62
|
+
* resolves on allow and on any screening failure (fail-open — signing must
|
|
63
|
+
* never hard-fail on a screening outage), and throws
|
|
64
|
+
* TransactionScreeningBlockedError only on an explicit block decision. A
|
|
65
|
+
* screen that outlives SCREENING_TIMEOUT_MS is one of those failures.
|
|
66
|
+
*/
|
|
67
|
+
const screenTransaction = (args) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
68
|
+
let abortTimer;
|
|
69
|
+
let response;
|
|
70
|
+
try {
|
|
71
|
+
// Reading settings can itself throw (e.g. the client store isn't
|
|
72
|
+
// initialized yet), which must fail open like everything else here.
|
|
73
|
+
if (!isScreeningEnabled())
|
|
74
|
+
return;
|
|
75
|
+
// The signal cancels the in-flight request so a hung endpoint can't tie up
|
|
76
|
+
// the browser's connections to the API; the race is what actually bounds the
|
|
77
|
+
// wait, since a host-supplied FetchService implementation need not honour it.
|
|
78
|
+
const abortController = new AbortController();
|
|
79
|
+
abortTimer = setTimeout(() => abortController.abort(), SCREENING_TIMEOUT_MS);
|
|
80
|
+
response = yield utils.promiseWithTimeout(api.sdkApi().screenTransaction({
|
|
81
|
+
environmentId: dynamicContextProps.getEnvironmentId(),
|
|
82
|
+
screenTransactionRequest: Object.assign(Object.assign({}, args), { chain: chainEnumFor(args.chain) }),
|
|
83
|
+
}, { signal: abortController.signal }), SCREENING_TIMEOUT_MS, { timeoutMessage: 'screenTransaction timed out' });
|
|
84
|
+
}
|
|
85
|
+
catch (_a) {
|
|
86
|
+
// Not the raw error: it can carry internal details (endpoint paths,
|
|
87
|
+
// server-side messages) that shouldn't cross the logger's broadcast
|
|
88
|
+
// boundary to whatever a host app has subscribed to its log events.
|
|
89
|
+
logger.logger.warn('screenTransaction error', {
|
|
90
|
+
message: 'Transaction screening failed',
|
|
91
|
+
});
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
clearTimeout(abortTimer);
|
|
96
|
+
}
|
|
97
|
+
if ((response === null || response === void 0 ? void 0 : response.decision) === sdkApiCore.ScreenTransactionResponseDecisionEnum.Block) {
|
|
98
|
+
throw new utils.TransactionScreeningBlockedError(response.blockedAddresses);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
const transactionScreeningService = {
|
|
102
|
+
screenTransaction,
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
exports.SCREENING_TIMEOUT_MS = SCREENING_TIMEOUT_MS;
|
|
106
|
+
exports.screenTransaction = screenTransaction;
|
|
107
|
+
exports.transactionScreeningService = transactionScreeningService;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ScreenTransactionArgs, TransactionScreeningService } from '@dynamic-labs/types';
|
|
2
|
+
export declare const SCREENING_TIMEOUT_MS = 2000;
|
|
3
|
+
/**
|
|
4
|
+
* Screens a connected-wallet transaction against the environment's sanctions
|
|
5
|
+
* providers before the wallet is prompted. Best-effort by construction:
|
|
6
|
+
* resolves on allow and on any screening failure (fail-open — signing must
|
|
7
|
+
* never hard-fail on a screening outage), and throws
|
|
8
|
+
* TransactionScreeningBlockedError only on an explicit block decision. A
|
|
9
|
+
* screen that outlives SCREENING_TIMEOUT_MS is one of those failures.
|
|
10
|
+
*/
|
|
11
|
+
export declare const screenTransaction: (args: ScreenTransactionArgs) => Promise<void>;
|
|
12
|
+
export declare const transactionScreeningService: TransactionScreeningService;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
import { __awaiter } from '../../../../../_virtual/_tslib.js';
|
|
3
|
+
import { ScreenTransactionResponseDecisionEnum, ChainEnum } from '@dynamic-labs/sdk-api-core';
|
|
4
|
+
import { promiseWithTimeout, TransactionScreeningBlockedError } from '@dynamic-labs/utils';
|
|
5
|
+
import { sdkApi } from '../api.js';
|
|
6
|
+
import '@dynamic-labs/iconic';
|
|
7
|
+
import '@dynamic-labs/wallet-connector-core';
|
|
8
|
+
import 'react';
|
|
9
|
+
import 'react/jsx-runtime';
|
|
10
|
+
import '../../../context/ViewContext/ViewContext.js';
|
|
11
|
+
import { logger } from '../../../shared/logger.js';
|
|
12
|
+
import '@dynamic-labs/wallet-book';
|
|
13
|
+
import '../../../utils/constants/colors.js';
|
|
14
|
+
import '../../../utils/constants/values.js';
|
|
15
|
+
import '../../../shared/consts/index.js';
|
|
16
|
+
import { getEnvironmentId } from '../../../store/state/dynamicContextProps/dynamicContextProps.js';
|
|
17
|
+
import '@dynamic-labs-sdk/client/core';
|
|
18
|
+
import 'eventemitter3';
|
|
19
|
+
import '@dynamic-labs-sdk/client';
|
|
20
|
+
import '../../../config/ApiEndpoint.js';
|
|
21
|
+
import '@dynamic-labs/multi-wallet';
|
|
22
|
+
import 'react-international-phone';
|
|
23
|
+
import '../../../store/state/nonce/nonce.js';
|
|
24
|
+
import '@dynamic-labs-wallet/browser-wallet-client';
|
|
25
|
+
import '@dynamic-labs/locale';
|
|
26
|
+
import '../../../store/state/primaryWalletId/primaryWalletId.js';
|
|
27
|
+
import '../../../store/state/connectedWalletsInfo/connectedWalletsInfo.js';
|
|
28
|
+
import '../../../utils/functions/getWaasAddressTypeLabel/getWaasAddressTypeLabel.js';
|
|
29
|
+
import '../../../events/dynamicEvents.js';
|
|
30
|
+
import { getProjectSettings } from '../../../client/extension/projectSettings/getProjectSettings/getProjectSettings.js';
|
|
31
|
+
|
|
32
|
+
// The SDK-internal chain union (shared across connector packages) is decoupled
|
|
33
|
+
// from the wire-level enum; this is the one place that needs to know both.
|
|
34
|
+
// Resolved per call rather than as a module-scope map, as is the block decision
|
|
35
|
+
// at the bottom of this file: reading an enum member at module scope resolves it
|
|
36
|
+
// the moment anything in this barrel's import graph loads, which takes down every
|
|
37
|
+
// spec that partially mocks sdk-api-core before a single test can run.
|
|
38
|
+
const chainEnumFor = (chain) => {
|
|
39
|
+
const chainEnumByScreeningChain = {
|
|
40
|
+
BTC: ChainEnum.Btc,
|
|
41
|
+
EVM: ChainEnum.Evm,
|
|
42
|
+
SOL: ChainEnum.Sol,
|
|
43
|
+
};
|
|
44
|
+
return chainEnumByScreeningChain[chain];
|
|
45
|
+
};
|
|
46
|
+
// A human is waiting on this call: it sits between "send" and the wallet
|
|
47
|
+
// prompt, so an unbounded fetch would stall the prompt indefinitely on a
|
|
48
|
+
// redcoast outage. Matches the enclave hook's 2000 ms wall-clock bound
|
|
49
|
+
// (SANCTIONS_SCREENING_TIMEOUT_MS) so both screening paths degrade alike.
|
|
50
|
+
const SCREENING_TIMEOUT_MS = 2000;
|
|
51
|
+
const isScreeningEnabled = () => {
|
|
52
|
+
var _a, _b, _c;
|
|
53
|
+
return Boolean((_c = (_b = (_a = getProjectSettings()) === null || _a === void 0 ? void 0 : _a.sdk) === null || _b === void 0 ? void 0 : _b.featureFlags) === null || _c === void 0 ? void 0 : _c.enableExternalWalletOnTransactionSanctions);
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Screens a connected-wallet transaction against the environment's sanctions
|
|
57
|
+
* providers before the wallet is prompted. Best-effort by construction:
|
|
58
|
+
* resolves on allow and on any screening failure (fail-open — signing must
|
|
59
|
+
* never hard-fail on a screening outage), and throws
|
|
60
|
+
* TransactionScreeningBlockedError only on an explicit block decision. A
|
|
61
|
+
* screen that outlives SCREENING_TIMEOUT_MS is one of those failures.
|
|
62
|
+
*/
|
|
63
|
+
const screenTransaction = (args) => __awaiter(void 0, void 0, void 0, function* () {
|
|
64
|
+
let abortTimer;
|
|
65
|
+
let response;
|
|
66
|
+
try {
|
|
67
|
+
// Reading settings can itself throw (e.g. the client store isn't
|
|
68
|
+
// initialized yet), which must fail open like everything else here.
|
|
69
|
+
if (!isScreeningEnabled())
|
|
70
|
+
return;
|
|
71
|
+
// The signal cancels the in-flight request so a hung endpoint can't tie up
|
|
72
|
+
// the browser's connections to the API; the race is what actually bounds the
|
|
73
|
+
// wait, since a host-supplied FetchService implementation need not honour it.
|
|
74
|
+
const abortController = new AbortController();
|
|
75
|
+
abortTimer = setTimeout(() => abortController.abort(), SCREENING_TIMEOUT_MS);
|
|
76
|
+
response = yield promiseWithTimeout(sdkApi().screenTransaction({
|
|
77
|
+
environmentId: getEnvironmentId(),
|
|
78
|
+
screenTransactionRequest: Object.assign(Object.assign({}, args), { chain: chainEnumFor(args.chain) }),
|
|
79
|
+
}, { signal: abortController.signal }), SCREENING_TIMEOUT_MS, { timeoutMessage: 'screenTransaction timed out' });
|
|
80
|
+
}
|
|
81
|
+
catch (_a) {
|
|
82
|
+
// Not the raw error: it can carry internal details (endpoint paths,
|
|
83
|
+
// server-side messages) that shouldn't cross the logger's broadcast
|
|
84
|
+
// boundary to whatever a host app has subscribed to its log events.
|
|
85
|
+
logger.warn('screenTransaction error', {
|
|
86
|
+
message: 'Transaction screening failed',
|
|
87
|
+
});
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
clearTimeout(abortTimer);
|
|
92
|
+
}
|
|
93
|
+
if ((response === null || response === void 0 ? void 0 : response.decision) === ScreenTransactionResponseDecisionEnum.Block) {
|
|
94
|
+
throw new TransactionScreeningBlockedError(response.blockedAddresses);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
const transactionScreeningService = {
|
|
98
|
+
screenTransaction,
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export { SCREENING_TIMEOUT_MS, screenTransaction, transactionScreeningService };
|
|
@@ -25,8 +25,8 @@ require('react-international-phone');
|
|
|
25
25
|
require('../../../store/state/nonce/nonce.cjs');
|
|
26
26
|
require('@dynamic-labs-wallet/browser-wallet-client');
|
|
27
27
|
require('@dynamic-labs/locale');
|
|
28
|
-
var wallets = require('../../../data/api/wallets/wallets.cjs');
|
|
29
28
|
var dynamicContextProps = require('../../../store/state/dynamicContextProps/dynamicContextProps.cjs');
|
|
29
|
+
var wallets = require('../../../data/api/wallets/wallets.cjs');
|
|
30
30
|
var primaryWalletId = require('../../../store/state/primaryWalletId/primaryWalletId.cjs');
|
|
31
31
|
require('../../../store/state/connectedWalletsInfo/connectedWalletsInfo.cjs');
|
|
32
32
|
require('../getWaasAddressTypeLabel/getWaasAddressTypeLabel.cjs');
|
|
@@ -21,8 +21,8 @@ import 'react-international-phone';
|
|
|
21
21
|
import '../../../store/state/nonce/nonce.js';
|
|
22
22
|
import '@dynamic-labs-wallet/browser-wallet-client';
|
|
23
23
|
import '@dynamic-labs/locale';
|
|
24
|
-
import { storeSelectedWallet } from '../../../data/api/wallets/wallets.js';
|
|
25
24
|
import { getEnvironmentId } from '../../../store/state/dynamicContextProps/dynamicContextProps.js';
|
|
25
|
+
import { storeSelectedWallet } from '../../../data/api/wallets/wallets.js';
|
|
26
26
|
import { setPrimaryWalletId } from '../../../store/state/primaryWalletId/primaryWalletId.js';
|
|
27
27
|
import '../../../store/state/connectedWalletsInfo/connectedWalletsInfo.js';
|
|
28
28
|
import '../getWaasAddressTypeLabel/getWaasAddressTypeLabel.js';
|
package/src/lib/utils/hooks/useCreateWalletConnectorOptions/useCreateWalletConnectorOptions.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ProjectSettings } from '@dynamic-labs/sdk-api-core';
|
|
2
|
-
import { type MobileExperience, type CoinbaseWalletPreference, type NetworkConfigurationMap, type WalletUiUtils } from '@dynamic-labs/types';
|
|
2
|
+
import { type MobileExperience, type CoinbaseWalletPreference, type NetworkConfigurationMap, type TransactionScreeningService, type WalletUiUtils } from '@dynamic-labs/types';
|
|
3
3
|
import { DeepLinkVariant, InternalWalletConnector, WalletConnectorExtension, WalletConnectorsMethod } from '@dynamic-labs/wallet-connector-core';
|
|
4
4
|
import { WalletBookSchema } from '@dynamic-labs/wallet-book';
|
|
5
5
|
export type WalletConnectorProps = {
|
|
@@ -11,6 +11,7 @@ export type WalletConnectorProps = {
|
|
|
11
11
|
mobileExperience?: MobileExperience;
|
|
12
12
|
networkConfigurations: NetworkConfigurationMap | undefined;
|
|
13
13
|
projectSettings: ProjectSettings | undefined;
|
|
14
|
+
transactionScreening?: TransactionScreeningService;
|
|
14
15
|
walletBook: WalletBookSchema;
|
|
15
16
|
walletConnectPreferredChains?: `eip155:${number}`[];
|
|
16
17
|
walletConnectorsProp?: WalletConnectorsMethod[];
|
|
@@ -26,8 +26,8 @@ require('react-international-phone');
|
|
|
26
26
|
require('../../../store/state/nonce/nonce.cjs');
|
|
27
27
|
require('@dynamic-labs-wallet/browser-wallet-client');
|
|
28
28
|
require('@dynamic-labs/locale');
|
|
29
|
-
var user = require('../../../data/api/user/user.cjs');
|
|
30
29
|
var dynamicContextProps = require('../../../store/state/dynamicContextProps/dynamicContextProps.cjs');
|
|
30
|
+
var user = require('../../../data/api/user/user.cjs');
|
|
31
31
|
require('../../../store/state/primaryWalletId/primaryWalletId.cjs');
|
|
32
32
|
require('../../../store/state/connectedWalletsInfo/connectedWalletsInfo.cjs');
|
|
33
33
|
require('../../functions/getWaasAddressTypeLabel/getWaasAddressTypeLabel.cjs');
|
|
@@ -22,8 +22,8 @@ import 'react-international-phone';
|
|
|
22
22
|
import '../../../store/state/nonce/nonce.js';
|
|
23
23
|
import '@dynamic-labs-wallet/browser-wallet-client';
|
|
24
24
|
import '@dynamic-labs/locale';
|
|
25
|
-
import { refreshUserJwt } from '../../../data/api/user/user.js';
|
|
26
25
|
import { getEnvironmentId } from '../../../store/state/dynamicContextProps/dynamicContextProps.js';
|
|
26
|
+
import { refreshUserJwt } from '../../../data/api/user/user.js';
|
|
27
27
|
import '../../../store/state/primaryWalletId/primaryWalletId.js';
|
|
28
28
|
import '../../../store/state/connectedWalletsInfo/connectedWalletsInfo.js';
|
|
29
29
|
import '../../functions/getWaasAddressTypeLabel/getWaasAddressTypeLabel.js';
|
package/src/lib/views/MergeUserAccountsWithSameEmailView/MergeUserAccountsWithSameEmailView.cjs
CHANGED
|
@@ -35,8 +35,8 @@ require('eventemitter3');
|
|
|
35
35
|
require('@dynamic-labs-sdk/client');
|
|
36
36
|
require('../../config/ApiEndpoint.cjs');
|
|
37
37
|
require('@dynamic-labs/locale');
|
|
38
|
-
var user = require('../../data/api/user/user.cjs');
|
|
39
38
|
require('../../store/state/dynamicContextProps/dynamicContextProps.cjs');
|
|
39
|
+
var user = require('../../data/api/user/user.cjs');
|
|
40
40
|
require('../../store/state/primaryWalletId/primaryWalletId.cjs');
|
|
41
41
|
require('../../store/state/connectedWalletsInfo/connectedWalletsInfo.cjs');
|
|
42
42
|
require('../../utils/functions/getWaasAddressTypeLabel/getWaasAddressTypeLabel.cjs');
|
package/src/lib/views/MergeUserAccountsWithSameEmailView/MergeUserAccountsWithSameEmailView.js
CHANGED
|
@@ -31,8 +31,8 @@ import 'eventemitter3';
|
|
|
31
31
|
import '@dynamic-labs-sdk/client';
|
|
32
32
|
import '../../config/ApiEndpoint.js';
|
|
33
33
|
import '@dynamic-labs/locale';
|
|
34
|
-
import { mergeUserAccounts } from '../../data/api/user/user.js';
|
|
35
34
|
import '../../store/state/dynamicContextProps/dynamicContextProps.js';
|
|
35
|
+
import { mergeUserAccounts } from '../../data/api/user/user.js';
|
|
36
36
|
import '../../store/state/primaryWalletId/primaryWalletId.js';
|
|
37
37
|
import '../../store/state/connectedWalletsInfo/connectedWalletsInfo.js';
|
|
38
38
|
import '../../utils/functions/getWaasAddressTypeLabel/getWaasAddressTypeLabel.js';
|