@dynamic-labs/sdk-react-core 4.79.2 → 4.81.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.
Files changed (101) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/package.cjs +2 -2
  3. package/package.js +2 -2
  4. package/package.json +13 -13
  5. package/src/lib/Main.cjs +2 -2
  6. package/src/lib/Main.js +2 -2
  7. package/src/lib/client/extension/deprecated/mfa/verifyTotpMfaDevice/verifyTotpMfaDevice.d.ts +1 -1
  8. package/src/lib/components/LogoutButton/LogoutButton.cjs +2 -2
  9. package/src/lib/components/LogoutButton/LogoutButton.js +2 -2
  10. package/src/lib/components/SendBalanceForm/SendBalanceForm.cjs +63 -3
  11. package/src/lib/components/SendBalanceForm/SendBalanceForm.js +63 -3
  12. package/src/lib/components/SendBalanceForm/TransactionModeSegmentedControl/TransactionModeSegmentedControl.cjs +40 -0
  13. package/src/lib/components/SendBalanceForm/TransactionModeSegmentedControl/TransactionModeSegmentedControl.d.ts +16 -0
  14. package/src/lib/components/SendBalanceForm/TransactionModeSegmentedControl/TransactionModeSegmentedControl.js +36 -0
  15. package/src/lib/components/SendBalanceForm/TransactionModeSegmentedControl/icons.cjs +17 -0
  16. package/src/lib/components/SendBalanceForm/TransactionModeSegmentedControl/icons.d.ts +8 -0
  17. package/src/lib/components/SendBalanceForm/TransactionModeSegmentedControl/icons.js +12 -0
  18. package/src/lib/components/SendBalanceForm/TransactionModeSegmentedControl/index.d.ts +1 -0
  19. package/src/lib/context/DynamicContext/DynamicContext.cjs +6 -4
  20. package/src/lib/context/DynamicContext/DynamicContext.js +6 -4
  21. package/src/lib/context/DynamicContext/hooks/useHandleLogout/index.d.ts +1 -0
  22. package/src/lib/context/DynamicContext/hooks/useHandleLogout/types.d.ts +9 -0
  23. package/src/lib/context/DynamicContext/hooks/useHandleLogout/useHandleLogout.cjs +25 -12
  24. package/src/lib/context/DynamicContext/hooks/useHandleLogout/useHandleLogout.d.ts +5 -3
  25. package/src/lib/context/DynamicContext/hooks/useHandleLogout/useHandleLogout.js +24 -11
  26. package/src/lib/context/DynamicContext/hooks/useRemoveWallet/useRemoveWallet.cjs +3 -3
  27. package/src/lib/context/DynamicContext/hooks/useRemoveWallet/useRemoveWallet.d.ts +3 -2
  28. package/src/lib/context/DynamicContext/hooks/useRemoveWallet/useRemoveWallet.js +3 -3
  29. package/src/lib/context/DynamicContext/types/IDynamicContext.d.ts +2 -0
  30. package/src/lib/context/DynamicContext/types/IInternalDynamicContext.d.ts +8 -1
  31. package/src/lib/events/auth.d.ts +2 -1
  32. package/src/lib/styles/index.shadow.cjs +1 -1
  33. package/src/lib/styles/index.shadow.js +1 -1
  34. package/src/lib/utils/hooks/useAleoShieldedBalances/index.d.ts +1 -0
  35. package/src/lib/utils/hooks/useAleoShieldedBalances/useAleoShieldedBalances.cjs +372 -0
  36. package/src/lib/utils/hooks/useAleoShieldedBalances/useAleoShieldedBalances.d.ts +24 -0
  37. package/src/lib/utils/hooks/useAleoShieldedBalances/useAleoShieldedBalances.js +368 -0
  38. package/src/lib/utils/hooks/useDeleteUserAccount/useDeleteUserAccount.cjs +2 -2
  39. package/src/lib/utils/hooks/useDeleteUserAccount/useDeleteUserAccount.js +2 -2
  40. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.cjs +1 -0
  41. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.d.ts +1 -0
  42. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.js +1 -0
  43. package/src/lib/utils/hooks/useEmbeddedWalletSessionKeys/useEmbeddedWalletSessionKeys.cjs +1 -1
  44. package/src/lib/utils/hooks/useEmbeddedWalletSessionKeys/useEmbeddedWalletSessionKeys.js +1 -1
  45. package/src/lib/utils/hooks/useUserAuth/useUserAuth.cjs +3 -3
  46. package/src/lib/utils/hooks/useUserAuth/useUserAuth.js +3 -3
  47. package/src/lib/utils/hooks/useValidateSession/handleStoreAndEnvironmentMismatch/handleStoreAndEnvironmentMismatch.cjs +1 -1
  48. package/src/lib/utils/hooks/useValidateSession/handleStoreAndEnvironmentMismatch/handleStoreAndEnvironmentMismatch.d.ts +2 -1
  49. package/src/lib/utils/hooks/useValidateSession/handleStoreAndEnvironmentMismatch/handleStoreAndEnvironmentMismatch.js +1 -1
  50. package/src/lib/utils/hooks/useValidateSession/handleWalletInfoOutOfSync/handleWalletInfoOutOfSync.cjs +3 -1
  51. package/src/lib/utils/hooks/useValidateSession/handleWalletInfoOutOfSync/handleWalletInfoOutOfSync.d.ts +2 -2
  52. package/src/lib/utils/hooks/useValidateSession/handleWalletInfoOutOfSync/handleWalletInfoOutOfSync.js +3 -1
  53. package/src/lib/utils/hooks/useValidateSession/useValidateSession.cjs +3 -3
  54. package/src/lib/utils/hooks/useValidateSession/useValidateSession.d.ts +3 -3
  55. package/src/lib/utils/hooks/useValidateSession/useValidateSession.js +3 -3
  56. package/src/lib/utils/hooks/useWalletEventListeners/useWalletEventListeners.cjs +2 -2
  57. package/src/lib/utils/hooks/useWalletEventListeners/useWalletEventListeners.d.ts +3 -2
  58. package/src/lib/utils/hooks/useWalletEventListeners/useWalletEventListeners.js +2 -2
  59. package/src/lib/views/BackupUnsuccessfulView/BackupUnsuccessfulView.cjs +5 -5
  60. package/src/lib/views/BackupUnsuccessfulView/BackupUnsuccessfulView.js +5 -5
  61. package/src/lib/views/CollectUserDataView/CollectUserDataView.cjs +2 -2
  62. package/src/lib/views/CollectUserDataView/CollectUserDataView.js +2 -2
  63. package/src/lib/views/CollectUserDataViewNoWallet/CollectUserDataViewNoWallet.cjs +2 -2
  64. package/src/lib/views/CollectUserDataViewNoWallet/CollectUserDataViewNoWallet.js +2 -2
  65. package/src/lib/views/DeviceRegistrationView/DeviceRegistrationView.cjs +2 -2
  66. package/src/lib/views/DeviceRegistrationView/DeviceRegistrationView.js +2 -2
  67. package/src/lib/views/EmailVerification/EmailVerification.cjs +2 -2
  68. package/src/lib/views/EmailVerification/EmailVerification.js +2 -2
  69. package/src/lib/views/EmbeddedDeleteView/EmbeddedDeleteView.cjs +2 -2
  70. package/src/lib/views/EmbeddedDeleteView/EmbeddedDeleteView.js +2 -2
  71. package/src/lib/views/MfaChooseDeviceView/MfaChooseDeviceView.cjs +7 -7
  72. package/src/lib/views/MfaChooseDeviceView/MfaChooseDeviceView.js +7 -7
  73. package/src/lib/views/MfaSecureDeviceView/MfaSecureDeviceView.cjs +7 -7
  74. package/src/lib/views/MfaSecureDeviceView/MfaSecureDeviceView.js +7 -7
  75. package/src/lib/views/MfaVerificationView/MfaVerificationView.cjs +5 -5
  76. package/src/lib/views/MfaVerificationView/MfaVerificationView.js +5 -5
  77. package/src/lib/views/Passkey/PasskeyIntroView/PasskeyIntroView.cjs +2 -2
  78. package/src/lib/views/Passkey/PasskeyIntroView/PasskeyIntroView.js +2 -2
  79. package/src/lib/views/SendBalanceView/SendBalanceView.cjs +53 -0
  80. package/src/lib/views/SendBalanceView/SendBalanceView.js +53 -0
  81. package/src/lib/views/SmsVerification/SmsVerification.cjs +2 -2
  82. package/src/lib/views/SmsVerification/SmsVerification.js +2 -2
  83. package/src/lib/views/WalletDelegation/WalletDelegationView/WalletDelegationView.cjs +2 -2
  84. package/src/lib/views/WalletDelegation/WalletDelegationView/WalletDelegationView.js +2 -2
  85. package/src/lib/views/WalletLockedView/WalletLockedView.cjs +2 -2
  86. package/src/lib/views/WalletLockedView/WalletLockedView.js +2 -2
  87. package/src/lib/views/WalletUsedView/WalletUsedView.cjs +2 -2
  88. package/src/lib/views/WalletUsedView/WalletUsedView.js +2 -2
  89. package/src/lib/widgets/DynamicWidget/components/ActiveWalletBalance/ActiveWalletBalance.cjs +191 -11
  90. package/src/lib/widgets/DynamicWidget/components/ActiveWalletBalance/ActiveWalletBalance.js +191 -11
  91. package/src/lib/widgets/DynamicWidget/components/ActiveWalletBalance/TokenBalanceItem/TokenBalanceItem.cjs +5 -2
  92. package/src/lib/widgets/DynamicWidget/components/ActiveWalletBalance/TokenBalanceItem/TokenBalanceItem.d.ts +10 -1
  93. package/src/lib/widgets/DynamicWidget/components/ActiveWalletBalance/TokenBalanceItem/TokenBalanceItem.js +5 -2
  94. package/src/lib/widgets/DynamicWidget/components/ActiveWalletBalance/TokenBalanceItem/index.d.ts +1 -0
  95. package/src/lib/widgets/DynamicWidget/components/ActiveWalletBalance/TokenBalanceList/TokenBalanceList.cjs +2 -2
  96. package/src/lib/widgets/DynamicWidget/components/ActiveWalletBalance/TokenBalanceList/TokenBalanceList.d.ts +3 -1
  97. package/src/lib/widgets/DynamicWidget/components/ActiveWalletBalance/TokenBalanceList/TokenBalanceList.js +2 -2
  98. package/src/lib/widgets/DynamicWidget/components/SingleWalletButtons/SingleWalletButtons.cjs +2 -2
  99. package/src/lib/widgets/DynamicWidget/components/SingleWalletButtons/SingleWalletButtons.js +2 -2
  100. package/src/lib/widgets/DynamicWidget/views/SettingsView/SettingsView.cjs +2 -2
  101. package/src/lib/widgets/DynamicWidget/views/SettingsView/SettingsView.js +2 -2
@@ -0,0 +1 @@
1
+ export { useAleoShieldedBalances } from './useAleoShieldedBalances';
@@ -0,0 +1,372 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var _tslib = require('../../../../../_virtual/_tslib.cjs');
7
+ var React = require('react');
8
+ var sdkApiCore = require('@dynamic-labs/sdk-api-core');
9
+ require('../../../context/DynamicContext/DynamicContext.cjs');
10
+ require('../../../store/state/loadingAndLifecycle/loadingAndLifecycle.cjs');
11
+ require('@dynamic-labs/iconic');
12
+ require('@dynamic-labs/wallet-connector-core');
13
+ require('react/jsx-runtime');
14
+ require('../../../context/ViewContext/ViewContext.cjs');
15
+ require('../../../shared/logger.cjs');
16
+ require('@dynamic-labs/wallet-book');
17
+ require('@dynamic-labs/utils');
18
+ require('../../constants/colors.cjs');
19
+ require('../../constants/values.cjs');
20
+ require('../../../shared/consts/index.cjs');
21
+ require('../../../events/dynamicEvents.cjs');
22
+ require('../../../context/CaptchaContext/CaptchaContext.cjs');
23
+ require('../../../context/ErrorContext/ErrorContext.cjs');
24
+ require('@dynamic-labs/multi-wallet');
25
+ require('react-international-phone');
26
+ require('../../../store/state/nonce/nonce.cjs');
27
+ require('@dynamic-labs-sdk/client/core');
28
+ require('eventemitter3');
29
+ require('@dynamic-labs-sdk/client');
30
+ require('../../../config/ApiEndpoint.cjs');
31
+ require('@dynamic-labs/locale');
32
+ require('../../../store/state/dynamicContextProps/dynamicContextProps.cjs');
33
+ require('../../../store/state/primaryWalletId/primaryWalletId.cjs');
34
+ require('../../../store/state/connectedWalletsInfo/connectedWalletsInfo.cjs');
35
+ require('../../functions/getWaasAddressTypeLabel/getWaasAddressTypeLabel.cjs');
36
+ require('../../../context/AccessDeniedContext/AccessDeniedContext.cjs');
37
+ require('../../../context/AccountExistsContext/AccountExistsContext.cjs');
38
+ require('../../../context/UserWalletsContext/UserWalletsContext.cjs');
39
+ require('../../../store/state/authMode/authMode.cjs');
40
+ require('../../../context/VerificationContext/VerificationContext.cjs');
41
+ require('react-dom');
42
+ require('../../functions/compareChains/compareChains.cjs');
43
+ require('../../../views/Passkey/utils/findPrimaryEmbeddedChain/findPrimaryEmbeddedChain.cjs');
44
+ require('../../../context/ThemeContext/ThemeContext.cjs');
45
+ require('../useUserUpdateRequest/useUpdateUser/userFieldsSchema.cjs');
46
+ require('bs58');
47
+ require('@dynamic-labs/types');
48
+ require('../../../context/SocialRedirectContext/SocialRedirectContext.cjs');
49
+ require('../../../context/LoadingContext/LoadingContext.cjs');
50
+ require('../../../context/WalletContext/WalletContext.cjs');
51
+ require('../useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/constants.cjs');
52
+ require('yup');
53
+ require('../../../context/MockContext/MockContext.cjs');
54
+ require('../../../views/CollectUserDataView/useFields.cjs');
55
+ require('../../../context/FieldsStateContext/FieldsStateContext.cjs');
56
+ require('../../../context/UserFieldEditorContext/UserFieldEditorContext.cjs');
57
+ require('@dynamic-labs/rpc-providers');
58
+ require('../../../store/state/walletOptions/walletOptions.cjs');
59
+ require('react-i18next');
60
+ require('../../../components/Accordion/components/AccordionItem/AccordionItem.cjs');
61
+ require('../../../components/Alert/Alert.cjs');
62
+ require('../../../components/ShadowDOM/ShadowDOM.cjs');
63
+ require('../../../components/IconButton/IconButton.cjs');
64
+ require('../../../components/InlineWidget/InlineWidget.cjs');
65
+ require('../../../components/Input/Input.cjs');
66
+ require('../../../components/IsBrowser/IsBrowser.cjs');
67
+ require('../../../components/MenuList/Dropdown/Dropdown.cjs');
68
+ require('../../../components/OverlayCard/OverlayCard.cjs');
69
+ require('../../../components/Transition/ZoomTransition/ZoomTransition.cjs');
70
+ require('../../../components/Transition/SlideInUpTransition/SlideInUpTransition.cjs');
71
+ require('../../../components/Transition/OpacityTransition/OpacityTransition.cjs');
72
+ require('../../../components/PasskeyCreatedSuccessBanner/PasskeyCreatedSuccessBanner.cjs');
73
+ require('../../../components/Popper/Popper/Popper.cjs');
74
+ require('../../../components/Popper/PopperContext/PopperContext.cjs');
75
+ require('react-focus-lock');
76
+ require('qrcode');
77
+ require('formik');
78
+ require('../useSubdomainCheck/useSubdomainCheck.cjs');
79
+ require('../../../context/WalletGroupContext/WalletGroupContext.cjs');
80
+ require('../../../widgets/DynamicWidget/context/DynamicWidgetContext.cjs');
81
+ require('../useGetMfaToken/useGetMfaToken.cjs');
82
+ require('../useWalletBackup/useWalletBackup.cjs');
83
+ require('../useWalletBackup/types.cjs');
84
+ require('../useWalletBackup/cloudProviders.cjs');
85
+ require('../../../context/IpConfigurationContext/IpConfigurationContext.cjs');
86
+ require('../../../context/ConnectWithOtpContext/ConnectWithOtpContext.cjs');
87
+ require('../../../widgets/DynamicBridgeWidget/views/WalletsView/components/SecondaryWallets/SecondaryWallets.cjs');
88
+ require('@hcaptcha/react-hcaptcha');
89
+ require('../../../widgets/DynamicWidget/helpers/convertExchangeKeyAndProviderEnum.cjs');
90
+ require('../../../views/ExchangeWhitelistWarning/ExchangeWhitelistWarning.cjs');
91
+ require('../../../context/ErrorContext/hooks/useErrorText/useErrorText.cjs');
92
+ require('../../../context/FooterAnimationContext/index.cjs');
93
+ require('../../../views/MfaChooseDeviceView/useGetMfaOptions/useGetMfaOptions.cjs');
94
+ require('../../../context/PasskeyContext/PasskeyContext.cjs');
95
+ require('../../../context/OnrampContext/OnrampContext.cjs');
96
+ require('../../../store/state/sendBalances.cjs');
97
+ require('../../../store/state/connectorsInitializing/connectorsInitializing.cjs');
98
+ require('../../../components/OverlayCardBase/OverlayCardTarget/OverlayCardTarget.cjs');
99
+ require('../../../widgets/DynamicWidget/components/DynamicWidgetHeader/DynamicWidgetHeader.cjs');
100
+ require('../../../views/TransactionConfirmationView/TransactionConfirmationView.cjs');
101
+ require('../../../widgets/DynamicWidget/components/PasskeyCard/PasskeyCard.cjs');
102
+ require('../../../widgets/DynamicWidget/views/CryptoComOnramp/CryptoComOnramp.cjs');
103
+ require('../../../../index.cjs');
104
+ require('../../../widgets/DynamicWidget/views/ManagePasskeysMfaWidgetView/ManagePasskeysMfaWidgetView.cjs');
105
+ require('../../../widgets/DynamicWidget/views/ManageTotpMfaWidgetView/ManageTotpMfaWidgetView.cjs');
106
+ require('../../../widgets/DynamicWidget/views/ReceiveWalletFunds/ReceiveWalletFunds.cjs');
107
+ require('../../../store/state/tokenBalances.cjs');
108
+ require('../../../store/state/multichainBalances.cjs');
109
+ require('@dynamic-labs/store');
110
+ require('../../../shared/utils/functions/getInitialUrl/getInitialUrl.cjs');
111
+ var useInternalDynamicContext = require('../../../context/DynamicContext/useDynamicContext/useInternalDynamicContext/useInternalDynamicContext.cjs');
112
+
113
+ const MICROCREDITS_PER_CREDIT = 1000000;
114
+ const ALEO_CREDITS_LOGO = 'https://app.dynamic.xyz/assets/networks/aleo.svg';
115
+ // Generic dark "?" token icon — matches redcoast's `DEFAULT_TOKEN_LOGO_URI`
116
+ // used by the multichain endpoint when an unshielded token has no curated
117
+ // logo. Reusing it here keeps the Shielded tab visually consistent with
118
+ // the Unshielded tab for the same token.
119
+ const UNKNOWN_TOKEN_LOGO = 'https://app.dynamic.xyz/assets/tokens/unknown.svg';
120
+ const TOKEN_REGISTRY_PROGRAM = 'token_registry.aleo';
121
+ const TOKEN_REGISTRY_RECORD = 'Token';
122
+ // Non-credits tokens deliberately omit `logoURI` — Aleo doesn't have a
123
+ // curated icon list yet, so leaving it undefined surfaces the widget's
124
+ // generic placeholder (`?` skeleton) consistent with the unshielded feed.
125
+ const KNOWN_SHIELDED_TOKENS = [
126
+ {
127
+ contractAddress: 'usad_stablecoin.aleo',
128
+ decimals: 6,
129
+ name: 'USAD',
130
+ programName: 'usad_stablecoin.aleo',
131
+ recordName: 'Token',
132
+ symbol: 'USAD',
133
+ },
134
+ {
135
+ contractAddress: 'test_usad_stablecoin.aleo',
136
+ decimals: 6,
137
+ name: 'USAD',
138
+ programName: 'test_usad_stablecoin.aleo',
139
+ recordName: 'Token',
140
+ symbol: 'USAD',
141
+ },
142
+ {
143
+ contractAddress: 'usdcx_stablecoin.aleo',
144
+ decimals: 6,
145
+ name: 'USDCx',
146
+ programName: 'usdcx_stablecoin.aleo',
147
+ recordName: 'Token',
148
+ symbol: 'USDCx',
149
+ },
150
+ {
151
+ contractAddress: 'test_usdcx_stablecoin.aleo',
152
+ decimals: 6,
153
+ name: 'USDCx',
154
+ programName: 'test_usdcx_stablecoin.aleo',
155
+ recordName: 'Token',
156
+ symbol: 'USDCx',
157
+ },
158
+ // ARC-21 (Hyperlane warp routes) — mainnet only. Token IDs match the
159
+ // values pinned in `packages/aleo/src/utils/aleoSendableTokens` and the
160
+ // redcoast `aleoArc21Tokens` registry. Decimals match each token's
161
+ // `token_info` metadata on-chain.
162
+ {
163
+ contractAddress: 'hyp_warp_token_sol.aleo',
164
+ decimals: 9,
165
+ name: 'Wrapped SOL',
166
+ programName: TOKEN_REGISTRY_PROGRAM,
167
+ recordName: TOKEN_REGISTRY_RECORD,
168
+ symbol: 'wSOL',
169
+ tokenId: '2045969100091121326225168054634646230244820821909676777152465722877810201564field',
170
+ },
171
+ {
172
+ contractAddress: 'hyp_warp_token_eth.aleo',
173
+ decimals: 18,
174
+ name: 'Wrapped ETH',
175
+ programName: TOKEN_REGISTRY_PROGRAM,
176
+ recordName: TOKEN_REGISTRY_RECORD,
177
+ symbol: 'wETH',
178
+ tokenId: '8189585964265444162798552221009403350643900573290534096996249214099143169251field',
179
+ },
180
+ {
181
+ contractAddress: 'hyp_warp_token_wbtc.aleo',
182
+ decimals: 8,
183
+ name: 'Wrapped BTC',
184
+ programName: TOKEN_REGISTRY_PROGRAM,
185
+ recordName: TOKEN_REGISTRY_RECORD,
186
+ symbol: 'wBTC',
187
+ tokenId: '3491859903473482085250871387962132231204352466326026409883548131580582527809field',
188
+ },
189
+ {
190
+ contractAddress: 'hyp_warp_token_usdt.aleo',
191
+ decimals: 6,
192
+ name: 'Tether USD',
193
+ programName: TOKEN_REGISTRY_PROGRAM,
194
+ recordName: TOKEN_REGISTRY_RECORD,
195
+ symbol: 'USDT',
196
+ tokenId: '7881654794448182580124231856035865816599796419758925654292946277940935117913field',
197
+ },
198
+ {
199
+ contractAddress: 'hyp_warp_token_usdc.aleo',
200
+ decimals: 6,
201
+ name: 'USD Coin',
202
+ programName: TOKEN_REGISTRY_PROGRAM,
203
+ recordName: TOKEN_REGISTRY_RECORD,
204
+ symbol: 'USDC',
205
+ tokenId: '4697275201844475848710842677807162058146139844643350200269139278887318953049field',
206
+ },
207
+ ];
208
+ /**
209
+ * Match a record to a shielded-token spec. Stablecoins match on
210
+ * (program, record); ARC-21 entries additionally require the spec's
211
+ * `tokenId` to appear inside `record_plaintext` (since every ARC-21 token
212
+ * shares `token_registry.aleo / Token`).
213
+ */
214
+ const findTokenSpec = (record) => {
215
+ for (const spec of KNOWN_SHIELDED_TOKENS) {
216
+ if (record.program_name !== spec.programName)
217
+ continue;
218
+ if (record.record_name !== spec.recordName)
219
+ continue;
220
+ if (spec.tokenId) {
221
+ if (typeof record.record_plaintext !== 'string' ||
222
+ !record.record_plaintext.includes(`token_id: ${spec.tokenId}`)) {
223
+ continue;
224
+ }
225
+ }
226
+ return spec;
227
+ }
228
+ return undefined;
229
+ };
230
+ /**
231
+ * Hook that returns the active wallet's shielded (private) Aleo token
232
+ * balances as a `TokenBalance[]` so the widget can render them through the
233
+ * same TokenBalanceList path it uses for unshielded balances.
234
+ *
235
+ * - Records come from the iframe via `connector.listOwnedRecords()` (the
236
+ * Provable RecordScanner; view key never leaves the iframe).
237
+ * - Aggregates `credits.aleo/credits` (sum `microcredits` → ALEO) plus any
238
+ * tier-3 stablecoin Token records (sum `amount` per program → USAD/USDCx).
239
+ * ARC-21 multi-token grouped-by-`token_id` is Phase 2B.
240
+ *
241
+ * Returns an empty list when:
242
+ * - The wallet isn't Aleo
243
+ * - The connector doesn't expose `listOwnedRecords` (e.g. external Aleo wallet)
244
+ * - The user owns no records that match a known program/record pair
245
+ */
246
+ const useAleoShieldedBalances = () => {
247
+ const { primaryWallet, network } = useInternalDynamicContext.useInternalDynamicContext();
248
+ const [tokenBalances, setTokenBalances] = React.useState([]);
249
+ const [isLoading, setIsLoading] = React.useState(false);
250
+ const [error, setError] = React.useState();
251
+ const connector = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector;
252
+ const isAleo = (connector === null || connector === void 0 ? void 0 : connector.connectedChain) === sdkApiCore.ChainEnum.Aleo;
253
+ const supportsShielded = isAleo &&
254
+ typeof (connector === null || connector === void 0 ? void 0 : connector.listOwnedRecords) === 'function';
255
+ // Mirror the live connector into a ref so `fetchShielded` can read it
256
+ // without depending on the (often unstable) object reference. Some test
257
+ // setups mock context with a factory that returns a fresh `primaryWallet`
258
+ // every render — depending on that ref directly turned this into an
259
+ // infinite render loop.
260
+ const connectorRef = React.useRef(connector);
261
+ connectorRef.current = connector;
262
+ const connectorKey = connector === null || connector === void 0 ? void 0 : connector.key;
263
+ const networkKey = network !== undefined && network !== null ? String(network) : undefined;
264
+ const fetchShielded = React.useCallback(() => _tslib.__awaiter(void 0, void 0, void 0, function* () {
265
+ var _a, _b, _c;
266
+ const liveConnector = connectorRef.current;
267
+ if (!supportsShielded || !liveConnector) {
268
+ setTokenBalances((prev) => (prev.length === 0 ? prev : []));
269
+ return;
270
+ }
271
+ setIsLoading(true);
272
+ setError(undefined);
273
+ try {
274
+ const result = yield liveConnector.listOwnedRecords();
275
+ const records = (_a = result === null || result === void 0 ? void 0 : result.records) !== null && _a !== void 0 ? _a : [];
276
+ const networkIdNumeric = Number(networkKey);
277
+ const safeNetworkId = Number.isFinite(networkIdNumeric)
278
+ ? networkIdNumeric
279
+ : undefined;
280
+ const balances = [];
281
+ // Tier 1: native credits — sum microcredits across credits.aleo records.
282
+ const creditsRecords = records.filter((r) => (r === null || r === void 0 ? void 0 : r.program_name) === 'credits.aleo' &&
283
+ (r === null || r === void 0 ? void 0 : r.record_name) === 'credits' &&
284
+ typeof (r === null || r === void 0 ? void 0 : r.microcredits) === 'string');
285
+ if (creditsRecords.length > 0) {
286
+ const totalMicrocredits = creditsRecords.reduce((sum, r) => sum + BigInt(r.microcredits), BigInt(0));
287
+ // BigInt → number for the TokenBalance shape. Aleo balances stay well
288
+ // below Number.MAX_SAFE_INTEGER for a single wallet (max u64 supply is
289
+ // 1.5B credits = 1.5e15 microcredits; Number can hold up to ~9e15).
290
+ const rawBalance = Number(totalMicrocredits);
291
+ balances.push({
292
+ address: '0x0',
293
+ balance: rawBalance / MICROCREDITS_PER_CREDIT,
294
+ decimals: 6,
295
+ isNative: true,
296
+ logoURI: ALEO_CREDITS_LOGO,
297
+ name: 'Aleo Credits',
298
+ networkId: safeNetworkId,
299
+ rawBalance,
300
+ symbol: 'ALEO',
301
+ });
302
+ }
303
+ // Tier 3 + ARC-21: Token records. Each record matches at most one
304
+ // spec (stablecoin programs disambiguate by program; ARC-21 records
305
+ // share `token_registry.aleo / Token` and disambiguate by tokenId
306
+ // inside the plaintext). Sum the `amount` field per spec.
307
+ const sumsByContract = new Map();
308
+ const specsByContract = new Map();
309
+ for (const r of records) {
310
+ const spec = findTokenSpec(r);
311
+ if (!spec || typeof r.amount !== 'string')
312
+ continue;
313
+ try {
314
+ const prev = (_b = sumsByContract.get(spec.contractAddress)) !== null && _b !== void 0 ? _b : BigInt(0);
315
+ sumsByContract.set(spec.contractAddress, prev + BigInt(r.amount));
316
+ specsByContract.set(spec.contractAddress, spec);
317
+ }
318
+ catch (_d) {
319
+ /* ignore — malformed amount string */
320
+ }
321
+ }
322
+ for (const [contractAddress, total] of sumsByContract.entries()) {
323
+ const spec = specsByContract.get(contractAddress);
324
+ if (!spec)
325
+ continue;
326
+ const rawBalance = Number(total);
327
+ balances.push({
328
+ address: spec.contractAddress,
329
+ balance: rawBalance / Math.pow(10, spec.decimals),
330
+ decimals: spec.decimals,
331
+ // Use redcoast's `DEFAULT_TOKEN_LOGO_URI` for stablecoins + ARC-21
332
+ // so they render the same dark "?" icon the Unshielded tab shows
333
+ // for these tokens (the multichain endpoint applies that fallback
334
+ // itself; we mirror it here for visual parity).
335
+ logoURI: (_c = spec.logoURI) !== null && _c !== void 0 ? _c : UNKNOWN_TOKEN_LOGO,
336
+ name: spec.name,
337
+ networkId: safeNetworkId,
338
+ rawBalance,
339
+ symbol: spec.symbol,
340
+ });
341
+ }
342
+ setTokenBalances(balances);
343
+ }
344
+ catch (err) {
345
+ const msg = err instanceof Error ? err.message : String(err);
346
+ setError(msg);
347
+ setTokenBalances((prev) => (prev.length === 0 ? prev : []));
348
+ }
349
+ finally {
350
+ setIsLoading(false);
351
+ }
352
+ }), [connectorKey, networkKey, supportsShielded]);
353
+ React.useEffect(() => {
354
+ if (!supportsShielded) {
355
+ setTokenBalances((prev) => (prev.length === 0 ? prev : []));
356
+ return;
357
+ }
358
+ fetchShielded().catch(() => {
359
+ // fetchShielded already records the error in component state;
360
+ // the .catch keeps the fire-and-forget shape lint-clean.
361
+ });
362
+ }, [supportsShielded, fetchShielded]);
363
+ return {
364
+ error,
365
+ isLoading,
366
+ refetch: fetchShielded,
367
+ supportsShielded,
368
+ tokenBalances,
369
+ };
370
+ };
371
+
372
+ exports.useAleoShieldedBalances = useAleoShieldedBalances;
@@ -0,0 +1,24 @@
1
+ import { TokenBalance } from '@dynamic-labs/sdk-api-core';
2
+ /**
3
+ * Hook that returns the active wallet's shielded (private) Aleo token
4
+ * balances as a `TokenBalance[]` so the widget can render them through the
5
+ * same TokenBalanceList path it uses for unshielded balances.
6
+ *
7
+ * - Records come from the iframe via `connector.listOwnedRecords()` (the
8
+ * Provable RecordScanner; view key never leaves the iframe).
9
+ * - Aggregates `credits.aleo/credits` (sum `microcredits` → ALEO) plus any
10
+ * tier-3 stablecoin Token records (sum `amount` per program → USAD/USDCx).
11
+ * ARC-21 multi-token grouped-by-`token_id` is Phase 2B.
12
+ *
13
+ * Returns an empty list when:
14
+ * - The wallet isn't Aleo
15
+ * - The connector doesn't expose `listOwnedRecords` (e.g. external Aleo wallet)
16
+ * - The user owns no records that match a known program/record pair
17
+ */
18
+ export declare const useAleoShieldedBalances: () => {
19
+ tokenBalances: TokenBalance[];
20
+ isLoading: boolean;
21
+ error: string | undefined;
22
+ refetch: () => Promise<void>;
23
+ supportsShielded: boolean;
24
+ };