@reown/appkit-core-react-native 0.0.0-feat-multi-siwe-20250623183423 → 0.0.0-feat-onramp-20250626173252

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 (159) hide show
  1. package/lib/commonjs/controllers/ApiController.js +11 -11
  2. package/lib/commonjs/controllers/ApiController.js.map +1 -1
  3. package/lib/commonjs/controllers/BlockchainApiController.js +24 -102
  4. package/lib/commonjs/controllers/BlockchainApiController.js.map +1 -1
  5. package/lib/commonjs/controllers/ConnectionController.js +1 -7
  6. package/lib/commonjs/controllers/ConnectionController.js.map +1 -1
  7. package/lib/commonjs/controllers/ConnectorController.js +0 -1
  8. package/lib/commonjs/controllers/ConnectorController.js.map +1 -1
  9. package/lib/commonjs/controllers/EnsController.js +4 -4
  10. package/lib/commonjs/controllers/EnsController.js.map +1 -1
  11. package/lib/commonjs/controllers/EventsController.js +4 -4
  12. package/lib/commonjs/controllers/EventsController.js.map +1 -1
  13. package/lib/commonjs/controllers/ModalController.js.map +1 -1
  14. package/lib/commonjs/controllers/OnRampController.js +60 -20
  15. package/lib/commonjs/controllers/OnRampController.js.map +1 -1
  16. package/lib/commonjs/controllers/OptionsController.js +3 -8
  17. package/lib/commonjs/controllers/OptionsController.js.map +1 -1
  18. package/lib/commonjs/controllers/RouterController.js.map +1 -1
  19. package/lib/commonjs/controllers/SendController.js +10 -10
  20. package/lib/commonjs/controllers/SendController.js.map +1 -1
  21. package/lib/commonjs/controllers/SwapController.js +40 -51
  22. package/lib/commonjs/controllers/SwapController.js.map +1 -1
  23. package/lib/commonjs/controllers/ThemeController.js +1 -9
  24. package/lib/commonjs/controllers/ThemeController.js.map +1 -1
  25. package/lib/commonjs/controllers/TransactionsController.js +5 -5
  26. package/lib/commonjs/controllers/TransactionsController.js.map +1 -1
  27. package/lib/commonjs/index.js +3 -3
  28. package/lib/commonjs/index.js.map +1 -1
  29. package/lib/commonjs/utils/AssetUtil.js +6 -5
  30. package/lib/commonjs/utils/AssetUtil.js.map +1 -1
  31. package/lib/commonjs/utils/ConnectionUtil.js +33 -0
  32. package/lib/commonjs/utils/ConnectionUtil.js.map +1 -0
  33. package/lib/commonjs/utils/ConstantsUtil.js +7 -537
  34. package/lib/commonjs/utils/ConstantsUtil.js.map +1 -1
  35. package/lib/commonjs/utils/CoreHelperUtil.js +1 -1
  36. package/lib/commonjs/utils/CoreHelperUtil.js.map +1 -1
  37. package/lib/commonjs/utils/StorageUtil.js +33 -67
  38. package/lib/commonjs/utils/StorageUtil.js.map +1 -1
  39. package/lib/commonjs/utils/SwapApiUtil.js +10 -19
  40. package/lib/commonjs/utils/SwapApiUtil.js.map +1 -1
  41. package/lib/module/controllers/ApiController.js +11 -11
  42. package/lib/module/controllers/ApiController.js.map +1 -1
  43. package/lib/module/controllers/BlockchainApiController.js +24 -102
  44. package/lib/module/controllers/BlockchainApiController.js.map +1 -1
  45. package/lib/module/controllers/ConnectionController.js +1 -7
  46. package/lib/module/controllers/ConnectionController.js.map +1 -1
  47. package/lib/module/controllers/ConnectorController.js +0 -1
  48. package/lib/module/controllers/ConnectorController.js.map +1 -1
  49. package/lib/module/controllers/EnsController.js +2 -2
  50. package/lib/module/controllers/EnsController.js.map +1 -1
  51. package/lib/module/controllers/EventsController.js +1 -1
  52. package/lib/module/controllers/EventsController.js.map +1 -1
  53. package/lib/module/controllers/ModalController.js.map +1 -1
  54. package/lib/module/controllers/OnRampController.js +60 -20
  55. package/lib/module/controllers/OnRampController.js.map +1 -1
  56. package/lib/module/controllers/OptionsController.js +3 -8
  57. package/lib/module/controllers/OptionsController.js.map +1 -1
  58. package/lib/module/controllers/RouterController.js.map +1 -1
  59. package/lib/module/controllers/SendController.js +7 -7
  60. package/lib/module/controllers/SendController.js.map +1 -1
  61. package/lib/module/controllers/SwapController.js +40 -51
  62. package/lib/module/controllers/SwapController.js.map +1 -1
  63. package/lib/module/controllers/ThemeController.js +1 -9
  64. package/lib/module/controllers/ThemeController.js.map +1 -1
  65. package/lib/module/controllers/TransactionsController.js +3 -3
  66. package/lib/module/controllers/TransactionsController.js.map +1 -1
  67. package/lib/module/index.js +1 -1
  68. package/lib/module/index.js.map +1 -1
  69. package/lib/module/utils/AssetUtil.js +6 -5
  70. package/lib/module/utils/AssetUtil.js.map +1 -1
  71. package/lib/module/utils/ConnectionUtil.js +27 -0
  72. package/lib/module/utils/ConnectionUtil.js.map +1 -0
  73. package/lib/module/utils/ConstantsUtil.js +7 -537
  74. package/lib/module/utils/ConstantsUtil.js.map +1 -1
  75. package/lib/module/utils/CoreHelperUtil.js +1 -1
  76. package/lib/module/utils/CoreHelperUtil.js.map +1 -1
  77. package/lib/module/utils/StorageUtil.js +33 -67
  78. package/lib/module/utils/StorageUtil.js.map +1 -1
  79. package/lib/module/utils/SwapApiUtil.js +10 -19
  80. package/lib/module/utils/SwapApiUtil.js.map +1 -1
  81. package/lib/typescript/controllers/AccountController.d.ts +2 -2
  82. package/lib/typescript/controllers/AccountController.d.ts.map +1 -1
  83. package/lib/typescript/controllers/ApiController.d.ts +1 -1
  84. package/lib/typescript/controllers/ApiController.d.ts.map +1 -1
  85. package/lib/typescript/controllers/BlockchainApiController.d.ts +3 -15
  86. package/lib/typescript/controllers/BlockchainApiController.d.ts.map +1 -1
  87. package/lib/typescript/controllers/ConnectionController.d.ts +0 -2
  88. package/lib/typescript/controllers/ConnectionController.d.ts.map +1 -1
  89. package/lib/typescript/controllers/ConnectorController.d.ts.map +1 -1
  90. package/lib/typescript/controllers/ModalController.d.ts +1 -1
  91. package/lib/typescript/controllers/ModalController.d.ts.map +1 -1
  92. package/lib/typescript/controllers/NetworkController.d.ts +1 -1
  93. package/lib/typescript/controllers/NetworkController.d.ts.map +1 -1
  94. package/lib/typescript/controllers/OnRampController.d.ts +3 -1
  95. package/lib/typescript/controllers/OnRampController.d.ts.map +1 -1
  96. package/lib/typescript/controllers/OptionsController.d.ts +2 -5
  97. package/lib/typescript/controllers/OptionsController.d.ts.map +1 -1
  98. package/lib/typescript/controllers/PublicStateController.d.ts +1 -1
  99. package/lib/typescript/controllers/PublicStateController.d.ts.map +1 -1
  100. package/lib/typescript/controllers/RouterController.d.ts +1 -2
  101. package/lib/typescript/controllers/RouterController.d.ts.map +1 -1
  102. package/lib/typescript/controllers/SwapController.d.ts +1 -1
  103. package/lib/typescript/controllers/SwapController.d.ts.map +1 -1
  104. package/lib/typescript/controllers/ThemeController.d.ts +1 -1
  105. package/lib/typescript/controllers/ThemeController.d.ts.map +1 -1
  106. package/lib/typescript/index.d.ts +1 -1
  107. package/lib/typescript/index.d.ts.map +1 -1
  108. package/lib/typescript/utils/AssetUtil.d.ts +2 -2
  109. package/lib/typescript/utils/AssetUtil.d.ts.map +1 -1
  110. package/lib/typescript/utils/ConnectionUtil.d.ts +4 -0
  111. package/lib/typescript/utils/ConnectionUtil.d.ts.map +1 -0
  112. package/lib/typescript/utils/ConstantsUtil.d.ts +1 -421
  113. package/lib/typescript/utils/ConstantsUtil.d.ts.map +1 -1
  114. package/lib/typescript/utils/CoreHelperUtil.d.ts +2 -2
  115. package/lib/typescript/utils/CoreHelperUtil.d.ts.map +1 -1
  116. package/lib/typescript/utils/FetchUtil.d.ts +1 -1
  117. package/lib/typescript/utils/FetchUtil.d.ts.map +1 -1
  118. package/lib/typescript/utils/NetworkUtil.d.ts +1 -1
  119. package/lib/typescript/utils/NetworkUtil.d.ts.map +1 -1
  120. package/lib/typescript/utils/StorageUtil.d.ts +4 -14
  121. package/lib/typescript/utils/StorageUtil.d.ts.map +1 -1
  122. package/lib/typescript/utils/SwapApiUtil.d.ts.map +1 -1
  123. package/lib/typescript/utils/TypeUtil.d.ts +32 -5
  124. package/lib/typescript/utils/TypeUtil.d.ts.map +1 -1
  125. package/package.json +4 -4
  126. package/src/controllers/AccountController.ts +2 -2
  127. package/src/controllers/ApiController.ts +7 -12
  128. package/src/controllers/BlockchainApiController.ts +27 -135
  129. package/src/controllers/ConnectionController.ts +2 -10
  130. package/src/controllers/ConnectorController.ts +0 -1
  131. package/src/controllers/EnsController.ts +2 -2
  132. package/src/controllers/EventsController.ts +1 -1
  133. package/src/controllers/ModalController.ts +1 -2
  134. package/src/controllers/NetworkController.ts +1 -1
  135. package/src/controllers/OnRampController.ts +91 -32
  136. package/src/controllers/OptionsController.ts +13 -14
  137. package/src/controllers/PublicStateController.ts +1 -1
  138. package/src/controllers/RouterController.ts +1 -2
  139. package/src/controllers/SendController.ts +7 -7
  140. package/src/controllers/SwapController.ts +48 -58
  141. package/src/controllers/ThemeController.ts +2 -11
  142. package/src/controllers/TransactionsController.ts +3 -3
  143. package/src/index.ts +1 -5
  144. package/src/utils/AssetUtil.ts +7 -5
  145. package/src/utils/ConnectionUtil.ts +27 -0
  146. package/src/utils/ConstantsUtil.ts +7 -542
  147. package/src/utils/CoreHelperUtil.ts +4 -9
  148. package/src/utils/FetchUtil.ts +1 -1
  149. package/src/utils/NetworkUtil.ts +1 -1
  150. package/src/utils/StorageUtil.ts +39 -82
  151. package/src/utils/SwapApiUtil.ts +10 -22
  152. package/src/utils/TypeUtil.ts +39 -8
  153. package/lib/commonjs/controllers/ConnectionsController.js +0 -215
  154. package/lib/commonjs/controllers/ConnectionsController.js.map +0 -1
  155. package/lib/module/controllers/ConnectionsController.js +0 -210
  156. package/lib/module/controllers/ConnectionsController.js.map +0 -1
  157. package/lib/typescript/controllers/ConnectionsController.d.ts +0 -44
  158. package/lib/typescript/controllers/ConnectionsController.d.ts.map +0 -1
  159. package/src/controllers/ConnectionsController.ts +0 -305
@@ -9,7 +9,8 @@ import type {
9
9
  OnRampCryptoCurrency,
10
10
  OnRampServiceProvider,
11
11
  OnRampError,
12
- OnRampErrorTypeValues
12
+ OnRampErrorTypeValues,
13
+ OnRampCountryDefaults
13
14
  } from '../utils/TypeUtil';
14
15
 
15
16
  import { CoreHelperUtil } from '../utils/CoreHelperUtil';
@@ -32,23 +33,23 @@ const mapErrorMessage = (errorCode: string): OnRampError => {
32
33
  const errorMap: Record<string, { type: OnRampErrorTypeValues; message: string }> = {
33
34
  [OnRampErrorType.AMOUNT_TOO_LOW]: {
34
35
  type: OnRampErrorType.AMOUNT_TOO_LOW,
35
- message: 'Amount is too low'
36
+ message: 'The amount is too low'
36
37
  },
37
38
  [OnRampErrorType.AMOUNT_TOO_HIGH]: {
38
39
  type: OnRampErrorType.AMOUNT_TOO_HIGH,
39
- message: 'Amount is too high'
40
+ message: 'The amount is too high'
40
41
  },
41
42
  [OnRampErrorType.INVALID_AMOUNT]: {
42
43
  type: OnRampErrorType.INVALID_AMOUNT,
43
- message: 'Please adjust amount'
44
+ message: 'Enter a valid amount'
44
45
  },
45
46
  [OnRampErrorType.INCOMPATIBLE_REQUEST]: {
46
47
  type: OnRampErrorType.INCOMPATIBLE_REQUEST,
47
- message: 'Try different amount or payment method'
48
+ message: 'Enter a valid amount'
48
49
  },
49
50
  [OnRampErrorType.BAD_REQUEST]: {
50
51
  type: OnRampErrorType.BAD_REQUEST,
51
- message: 'Try different amount or payment method'
52
+ message: 'Enter a valid amount'
52
53
  }
53
54
  };
54
55
 
@@ -63,6 +64,7 @@ const mapErrorMessage = (errorCode: string): OnRampError => {
63
64
  // -- Types --------------------------------------------- //
64
65
  export interface OnRampControllerState {
65
66
  countries: OnRampCountry[];
67
+ countriesDefaults?: OnRampCountryDefaults[];
66
68
  selectedCountry?: OnRampCountry;
67
69
  serviceProviders: OnRampServiceProvider[];
68
70
  selectedServiceProvider?: OnRampServiceProvider;
@@ -114,9 +116,8 @@ export const OnRampController = {
114
116
 
115
117
  if (updateCurrency) {
116
118
  const currencyCode =
117
- ConstantsUtil.COUNTRY_CURRENCIES[
118
- country.countryCode as keyof typeof ConstantsUtil.COUNTRY_CURRENCIES
119
- ] || 'USD';
119
+ state.countriesDefaults?.find(d => d.countryCode === country.countryCode)
120
+ ?.defaultCurrencyCode || 'USD';
120
121
 
121
122
  const currency = state.paymentCurrencies?.find(c => c.currencyCode === currencyCode);
122
123
 
@@ -126,6 +127,7 @@ export const OnRampController = {
126
127
  }
127
128
 
128
129
  await Promise.all([this.fetchPaymentMethods(), this.fetchCryptoCurrencies()]);
130
+ this.clearQuotes();
129
131
 
130
132
  state.loading = false;
131
133
 
@@ -134,8 +136,6 @@ export const OnRampController = {
134
136
 
135
137
  setSelectedPaymentMethod(paymentMethod: OnRampPaymentMethod) {
136
138
  state.selectedPaymentMethod = paymentMethod;
137
-
138
- this.clearQuotes();
139
139
  },
140
140
 
141
141
  setPurchaseCurrency(currency: OnRampCryptoCurrency) {
@@ -184,7 +184,7 @@ export const OnRampController = {
184
184
  selectedCurrency = state.purchaseCurrencies?.find(c => c.currencyCode === defaultCurrency);
185
185
  }
186
186
 
187
- state.purchaseCurrency = selectedCurrency || state.purchaseCurrencies?.[0] || undefined;
187
+ state.purchaseCurrency = selectedCurrency ?? state.purchaseCurrencies?.[0] ?? undefined;
188
188
  },
189
189
 
190
190
  getServiceProviderImage(serviceProviderName?: string) {
@@ -231,6 +231,27 @@ export const OnRampController = {
231
231
  }
232
232
  },
233
233
 
234
+ async fetchCountriesDefaults() {
235
+ try {
236
+ let countriesDefaults = await StorageUtil.getOnRampCountriesDefaults();
237
+
238
+ if (!countriesDefaults.length) {
239
+ countriesDefaults = (await BlockchainApiController.fetchOnRampCountriesDefaults()) ?? [];
240
+
241
+ if (countriesDefaults.length) {
242
+ StorageUtil.setOnRampCountriesDefaults(countriesDefaults);
243
+ }
244
+ }
245
+
246
+ state.countriesDefaults = countriesDefaults;
247
+ } catch (error) {
248
+ state.error = {
249
+ type: OnRampErrorType.FAILED_TO_LOAD_COUNTRIES,
250
+ message: 'Failed to load countries defaults'
251
+ };
252
+ }
253
+ },
254
+
234
255
  async fetchServiceProviders() {
235
256
  try {
236
257
  let serviceProviders = await StorageUtil.getOnRampServiceProviders();
@@ -259,10 +280,8 @@ export const OnRampController = {
259
280
  });
260
281
 
261
282
  const defaultCountryPaymentMethods =
262
- ConstantsUtil.COUNTRY_DEFAULT_PAYMENT_METHOD[
263
- state.selectedCountry
264
- ?.countryCode as keyof typeof ConstantsUtil.COUNTRY_DEFAULT_PAYMENT_METHOD
265
- ];
283
+ state.countriesDefaults?.find(d => d.countryCode === state.selectedCountry?.countryCode)
284
+ ?.defaultPaymentMethods || [];
266
285
 
267
286
  state.paymentMethods =
268
287
  paymentMethods?.sort((a, b) => {
@@ -276,9 +295,7 @@ export const OnRampController = {
276
295
  return aIndex - bIndex;
277
296
  }) || [];
278
297
 
279
- state.selectedPaymentMethod = paymentMethods?.[0] || undefined;
280
-
281
- this.clearQuotes();
298
+ state.selectedPaymentMethod = state.paymentMethods[0];
282
299
  } catch (error) {
283
300
  state.error = {
284
301
  type: OnRampErrorType.FAILED_TO_LOAD_METHODS,
@@ -336,9 +353,8 @@ export const OnRampController = {
336
353
 
337
354
  if (countryCode) {
338
355
  currencyCode =
339
- ConstantsUtil.COUNTRY_CURRENCIES[
340
- countryCode as keyof typeof ConstantsUtil.COUNTRY_CURRENCIES
341
- ];
356
+ state.countriesDefaults?.find(d => d.countryCode === countryCode)?.defaultCurrencyCode ||
357
+ 'USD';
342
358
  }
343
359
 
344
360
  const preferredCurrency = await StorageUtil.getOnRampPreferredFiatCurrency();
@@ -387,25 +403,24 @@ export const OnRampController = {
387
403
  }
388
404
 
389
405
  state.quotesLoading = true;
406
+ state.selectedQuote = undefined;
407
+ state.selectedServiceProvider = undefined;
390
408
  state.error = undefined;
391
409
 
392
410
  this.abortGetQuotes(false);
393
411
  quotesAbortController = new AbortController();
412
+ const currentSignal = quotesAbortController.signal;
394
413
 
395
414
  try {
396
415
  const body = {
397
416
  countryCode: state.selectedCountry?.countryCode!,
398
- paymentMethodType: state.selectedPaymentMethod?.paymentMethod!,
399
417
  destinationCurrencyCode: state.purchaseCurrency?.currencyCode!,
400
418
  sourceAmount: state.paymentAmount,
401
419
  sourceCurrencyCode: state.paymentCurrency?.currencyCode!,
402
420
  walletAddress: AccountController.state.address!
403
421
  };
404
422
 
405
- const response = await BlockchainApiController.getOnRampQuotes(
406
- body,
407
- quotesAbortController.signal
408
- );
423
+ const response = await BlockchainApiController.getOnRampQuotes(body, currentSignal);
409
424
 
410
425
  if (!response || !response.length) {
411
426
  throw new Error('No quotes available');
@@ -414,9 +429,48 @@ export const OnRampController = {
414
429
  const quotes = response.sort((a, b) => b.customerScore - a.customerScore);
415
430
 
416
431
  state.quotes = quotes;
417
- state.selectedQuote = quotes[0];
432
+
433
+ //Replace payment method if it's not in the quotes
434
+ const isValidPaymentMethod =
435
+ state.selectedPaymentMethod &&
436
+ quotes.some(
437
+ quote => quote.paymentMethodType === state.selectedPaymentMethod?.paymentMethod
438
+ );
439
+
440
+ if (!isValidPaymentMethod) {
441
+ const countryMethods =
442
+ state.countriesDefaults?.find(d => d.countryCode === state.selectedCountry?.countryCode)
443
+ ?.defaultPaymentMethods || [];
444
+
445
+ const availableQuoteMethods = new Set(quotes.map(q => q.paymentMethodType));
446
+
447
+ let newPaymentMethodType: string | undefined;
448
+ for (const dpm of countryMethods) {
449
+ if (availableQuoteMethods.has(dpm)) {
450
+ newPaymentMethodType = dpm;
451
+ break;
452
+ }
453
+ }
454
+
455
+ if (newPaymentMethodType) {
456
+ state.selectedPaymentMethod =
457
+ state.paymentMethods.find(m => m.paymentMethod === newPaymentMethodType) ||
458
+ state.paymentMethods.find(
459
+ method => method.paymentMethod === quotes[0]?.paymentMethodType
460
+ );
461
+ } else {
462
+ state.selectedPaymentMethod = state.paymentMethods.find(
463
+ method => method.paymentMethod === quotes[0]?.paymentMethodType
464
+ );
465
+ }
466
+ }
467
+
468
+ state.selectedQuote = quotes.find(
469
+ quote => quote.paymentMethodType === state.selectedPaymentMethod?.paymentMethod
470
+ );
471
+
418
472
  state.selectedServiceProvider = state.serviceProviders.find(
419
- sp => sp.serviceProvider === quotes[0]?.serviceProvider
473
+ sp => sp.serviceProvider === state.selectedQuote?.serviceProvider
420
474
  );
421
475
  } catch (error: any) {
422
476
  if (error.name === 'AbortError') {
@@ -435,7 +489,9 @@ export const OnRampController = {
435
489
  this.clearQuotes();
436
490
  state.error = mapErrorMessage(error?.code || 'UNKNOWN_ERROR');
437
491
  } finally {
438
- state.quotesLoading = false;
492
+ if (!currentSignal.aborted) {
493
+ state.quotesLoading = false;
494
+ }
439
495
  }
440
496
  },
441
497
 
@@ -492,7 +548,7 @@ export const OnRampController = {
492
548
  throw new Error('Invalid quote');
493
549
  }
494
550
 
495
- const widget = await BlockchainApiController.getOnRampWidget({
551
+ const body = {
496
552
  countryCode: quote.countryCode,
497
553
  destinationCurrencyCode: quote.destinationCurrencyCode,
498
554
  paymentMethodType: quote.paymentMethodType,
@@ -501,7 +557,9 @@ export const OnRampController = {
501
557
  sourceCurrencyCode: quote.sourceCurrencyCode,
502
558
  walletAddress: AccountController.state.address!,
503
559
  redirectUrl: metadata?.redirect?.universal ?? metadata?.redirect?.native
504
- });
560
+ };
561
+
562
+ const widget = await BlockchainApiController.getOnRampWidget(body);
505
563
 
506
564
  if (!widget || !widget.widgetUrl) {
507
565
  throw new Error('Invalid widget response');
@@ -555,6 +613,7 @@ export const OnRampController = {
555
613
  await this.fetchServiceProviders();
556
614
 
557
615
  await Promise.all([
616
+ this.fetchCountriesDefaults(),
558
617
  this.fetchPaymentMethods(),
559
618
  this.fetchFiatLimits(),
560
619
  this.fetchCryptoCurrencies(),
@@ -1,7 +1,13 @@
1
1
  import { proxy, ref } from 'valtio';
2
- import type { Tokens, Storage, Metadata } from '@reown/appkit-common-react-native';
3
- import type { CustomWallet, Features, ProjectId, SdkType, SdkVersion } from '../utils/TypeUtil';
4
-
2
+ import type {
3
+ CustomWallet,
4
+ Features,
5
+ Metadata,
6
+ ProjectId,
7
+ SdkType,
8
+ SdkVersion,
9
+ Tokens
10
+ } from '../utils/TypeUtil';
5
11
  import { ConstantsUtil } from '../utils/ConstantsUtil';
6
12
 
7
13
  // -- Types --------------------------------------------- //
@@ -11,8 +17,7 @@ export interface ClipboardClient {
11
17
 
12
18
  export interface OptionsControllerState {
13
19
  projectId: ProjectId;
14
- clipboardClient?: ClipboardClient;
15
- storage?: Storage;
20
+ _clipboardClient?: ClipboardClient;
16
21
  includeWalletIds?: string[];
17
22
  excludeWalletIds?: string[];
18
23
  featuredWalletIds?: string[];
@@ -42,7 +47,7 @@ export const OptionsController = {
42
47
  state,
43
48
 
44
49
  setClipboardClient(client: ClipboardClient) {
45
- state.clipboardClient = ref(client);
50
+ state._clipboardClient = ref(client);
46
51
  },
47
52
 
48
53
  setProjectId(projectId: OptionsControllerState['projectId']) {
@@ -97,18 +102,12 @@ export const OptionsController = {
97
102
  state.isOnRampEnabled = isOnRampEnabled;
98
103
  },
99
104
 
100
- setStorage(storage?: OptionsControllerState['storage']) {
101
- if (storage) {
102
- state.storage = ref(storage);
103
- }
104
- },
105
-
106
105
  isClipboardAvailable() {
107
- return !!state.clipboardClient;
106
+ return !!state._clipboardClient;
108
107
  },
109
108
 
110
109
  copyToClipboard(value: string) {
111
- const client = state.clipboardClient;
110
+ const client = state._clipboardClient;
112
111
  if (client) {
113
112
  client?.setString(value);
114
113
  }
@@ -1,6 +1,6 @@
1
1
  import { proxy, subscribe as sub } from 'valtio';
2
2
  import { subscribeKey as subKey } from 'valtio/utils';
3
- import type { CaipNetworkId } from '@reown/appkit-common-react-native';
3
+ import type { CaipNetworkId } from '../utils/TypeUtil.js';
4
4
 
5
5
  // -- Types --------------------------------------------- //
6
6
  export interface PublicStateControllerState {
@@ -1,8 +1,7 @@
1
1
  import { proxy } from 'valtio';
2
- import type { CaipNetwork } from '@reown/appkit-common-react-native';
3
-
4
2
  import type {
5
3
  WcWallet,
4
+ CaipNetwork,
6
5
  Connector,
7
6
  SwapInputTarget,
8
7
  OnRampTransactionResult
@@ -1,13 +1,13 @@
1
- import { subscribeKey as subKey } from 'valtio/vanilla/utils';
2
- import { proxy, ref, subscribe as sub } from 'valtio/vanilla';
1
+ import { subscribeKey as subKey } from 'valtio/utils';
2
+ import { proxy, ref, subscribe as sub } from 'valtio';
3
3
  import { ContractUtil, type Balance } from '@reown/appkit-common-react-native';
4
4
  import { AccountController } from './AccountController';
5
5
  import { ConnectionController } from './ConnectionController';
6
6
  import { SnackController } from './SnackController';
7
7
  import { CoreHelperUtil } from '../utils/CoreHelperUtil';
8
8
  import { EventsController } from './EventsController';
9
+ import { NetworkController } from './NetworkController';
9
10
  import { RouterController } from './RouterController';
10
- import { ConnectionsController } from './ConnectionsController';
11
11
 
12
12
  // -- Types --------------------------------------------- //
13
13
  export interface TxParams {
@@ -100,7 +100,7 @@ export const SendController = {
100
100
  isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount',
101
101
  token: this.state.token.address,
102
102
  amount: this.state.sendTokenAmount,
103
- network: ConnectionsController.state.activeNetwork?.caipNetworkId || ''
103
+ network: NetworkController.state.caipNetwork?.id || ''
104
104
  }
105
105
  });
106
106
  this.sendERC20Token({
@@ -123,7 +123,7 @@ export const SendController = {
123
123
  isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount',
124
124
  token: this.state.token?.symbol,
125
125
  amount: this.state.sendTokenAmount,
126
- network: ConnectionsController.state.activeNetwork?.caipNetworkId || ''
126
+ network: NetworkController.state.caipNetwork?.id || ''
127
127
  }
128
128
  });
129
129
  this.sendNativeToken({
@@ -165,7 +165,7 @@ export const SendController = {
165
165
  isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount',
166
166
  token: this.state.token?.symbol || '',
167
167
  amount: params.sendTokenAmount,
168
- network: ConnectionsController.state.activeNetwork?.caipNetworkId || ''
168
+ network: NetworkController.state.caipNetwork?.id || ''
169
169
  }
170
170
  });
171
171
  this.resetSend();
@@ -178,7 +178,7 @@ export const SendController = {
178
178
  isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount',
179
179
  token: this.state.token?.symbol || '',
180
180
  amount: params.sendTokenAmount,
181
- network: ConnectionsController.state.activeNetwork?.caipNetworkId || ''
181
+ network: NetworkController.state.caipNetwork?.id || ''
182
182
  }
183
183
  });
184
184
  SnackController.showError('Something went wrong');
@@ -1,9 +1,10 @@
1
1
  import { subscribeKey as subKey } from 'valtio/utils';
2
2
  import { proxy, subscribe as sub } from 'valtio';
3
- import { NumberUtil, type CaipAddress } from '@reown/appkit-common-react-native';
3
+ import { NumberUtil } from '@reown/appkit-common-react-native';
4
4
 
5
5
  import { ConstantsUtil } from '../utils/ConstantsUtil';
6
6
  import { SwapApiUtil } from '../utils/SwapApiUtil';
7
+ import { NetworkController } from './NetworkController';
7
8
  import { BlockchainApiController } from './BlockchainApiController';
8
9
  import { OptionsController } from './OptionsController';
9
10
  import { SwapCalculationUtil } from '../utils/SwapCalculationUtil';
@@ -13,9 +14,9 @@ import type { SwapInputTarget, SwapTokenWithBalance } from '../utils/TypeUtil';
13
14
  import { ConnectorController } from './ConnectorController';
14
15
  import { AccountController } from './AccountController';
15
16
  import { CoreHelperUtil } from '../utils/CoreHelperUtil';
17
+ import { ConnectionController } from './ConnectionController';
16
18
  import { TransactionsController } from './TransactionsController';
17
19
  import { EventsController } from './EventsController';
18
- import { ConnectionsController } from './ConnectionsController';
19
20
 
20
21
  // -- Constants ---------------------------------------- //
21
22
  export const INITIAL_GAS_LIMIT = 150000;
@@ -157,15 +158,9 @@ export const SwapController = {
157
158
  },
158
159
 
159
160
  getParams() {
160
- const { activeAddress, activeNamespace, activeNetwork } = ConnectionsController.state;
161
- const address = CoreHelperUtil.getPlainAddress(activeAddress);
162
-
163
- if (!activeNamespace || !activeNetwork) {
164
- throw new Error('No active namespace or network found to swap the tokens from.');
165
- }
166
-
167
- const networkAddress: CaipAddress = `${activeNetwork.caipNetworkId}:${ConstantsUtil.NATIVE_TOKEN_ADDRESS[activeNamespace]}`;
168
-
161
+ const caipAddress = AccountController.state.caipAddress;
162
+ const address = CoreHelperUtil.getPlainAddress(caipAddress);
163
+ const networkAddress = NetworkController.getActiveNetworkTokenAddress();
169
164
  const type = ConnectorController.state.connectedConnector;
170
165
 
171
166
  if (!address) {
@@ -183,7 +178,7 @@ export const SwapController = {
183
178
  return {
184
179
  networkAddress,
185
180
  fromAddress: address,
186
- fromCaipAddress: activeAddress,
181
+ fromCaipAddress: caipAddress,
187
182
  sourceTokenAddress: state.sourceToken?.address,
188
183
  toTokenAddress: state.toToken?.address,
189
184
  toTokenAmount: state.toTokenAmount,
@@ -194,7 +189,7 @@ export const SwapController = {
194
189
  invalidSourceToken,
195
190
  invalidSourceTokenAmount,
196
191
  availableToSwap:
197
- activeAddress && !invalidToToken && !invalidSourceToken && !invalidSourceTokenAmount,
192
+ caipAddress && !invalidToToken && !invalidSourceToken && !invalidSourceTokenAmount,
198
193
  isAuthConnector: type === 'AUTH'
199
194
  };
200
195
  },
@@ -287,6 +282,7 @@ export const SwapController = {
287
282
 
288
283
  async getMyTokensWithBalance(forceUpdate?: string) {
289
284
  const balances = await SwapApiUtil.getMyTokensWithBalance(forceUpdate);
285
+
290
286
  if (!balances) {
291
287
  return;
292
288
  }
@@ -405,7 +401,7 @@ export const SwapController = {
405
401
 
406
402
  setBalances(balances: SwapTokenWithBalance[]) {
407
403
  const { networkAddress } = this.getParams();
408
- const caipNetwork = ConnectionsController.state.activeNetwork;
404
+ const caipNetwork = NetworkController.state.caipNetwork;
409
405
 
410
406
  if (!caipNetwork) {
411
407
  return;
@@ -417,9 +413,7 @@ export const SwapController = {
417
413
  state.tokensPriceMap[token.address] = token.price || 0;
418
414
  });
419
415
 
420
- state.myTokensWithBalance = balances.filter(
421
- token => token.address?.startsWith(caipNetwork.caipNetworkId)
422
- );
416
+ state.myTokensWithBalance = balances.filter(token => token.address?.startsWith(caipNetwork.id));
423
417
 
424
418
  state.networkBalanceInUSD = networkToken
425
419
  ? NumberUtil.multiply(networkToken.quantity.numeric, networkToken.price).toString()
@@ -470,12 +464,12 @@ export const SwapController = {
470
464
 
471
465
  // -- Swap ---------------------------------------------- //
472
466
  async swapTokens() {
473
- const address = ConnectionsController.state.activeAddress;
467
+ const address = AccountController.state.address as `${string}:${string}:${string}`;
474
468
  const sourceToken = state.sourceToken;
475
469
  const toToken = state.toToken;
476
470
  const haveSourceTokenAmount = NumberUtil.bigNumber(state.sourceTokenAmount).isGreaterThan(0);
477
471
 
478
- if (!toToken || !sourceToken || state.loadingPrices || !haveSourceTokenAmount || !address) {
472
+ if (!toToken || !sourceToken || state.loadingPrices || !haveSourceTokenAmount) {
479
473
  return;
480
474
  }
481
475
 
@@ -485,44 +479,39 @@ export const SwapController = {
485
479
  .multipliedBy(10 ** sourceToken.decimals)
486
480
  .integerValue();
487
481
 
488
- try {
489
- const quoteResponse = await BlockchainApiController.fetchSwapQuote({
490
- userAddress: address,
491
- projectId: OptionsController.state.projectId,
492
- from: sourceToken.address,
493
- to: toToken.address,
494
- gasPrice: state.gasFee,
495
- amount: amountDecimal.toString()
496
- });
482
+ const quoteResponse = await BlockchainApiController.fetchSwapQuote({
483
+ userAddress: address,
484
+ projectId: OptionsController.state.projectId,
485
+ from: sourceToken.address,
486
+ to: toToken.address,
487
+ gasPrice: state.gasFee,
488
+ amount: amountDecimal.toString()
489
+ });
497
490
 
498
- state.loadingQuote = false;
491
+ state.loadingQuote = false;
499
492
 
500
- const quoteToAmount = quoteResponse?.quotes?.[0]?.toAmount;
493
+ const quoteToAmount = quoteResponse?.quotes?.[0]?.toAmount;
501
494
 
502
- if (!quoteToAmount) {
503
- return;
504
- }
495
+ if (!quoteToAmount) {
496
+ return;
497
+ }
505
498
 
506
- const toTokenAmount = NumberUtil.bigNumber(quoteToAmount)
507
- .dividedBy(10 ** toToken.decimals)
508
- .toString();
499
+ const toTokenAmount = NumberUtil.bigNumber(quoteToAmount)
500
+ .dividedBy(10 ** toToken.decimals)
501
+ .toString();
509
502
 
510
- this.setToTokenAmount(toTokenAmount);
503
+ this.setToTokenAmount(toTokenAmount);
511
504
 
512
- const isInsufficientToken = this.hasInsufficientToken(
513
- state.sourceTokenAmount,
514
- sourceToken.address
515
- );
505
+ const isInsufficientToken = this.hasInsufficientToken(
506
+ state.sourceTokenAmount,
507
+ sourceToken.address
508
+ );
516
509
 
517
- if (isInsufficientToken) {
518
- state.inputError = 'Insufficient balance';
519
- } else {
520
- state.inputError = undefined;
521
- this.setTransactionDetails();
522
- }
523
- } catch (error) {
524
- SnackController.showError('Failed to get swap quote');
525
- state.loadingQuote = false;
510
+ if (isInsufficientToken) {
511
+ state.inputError = 'Insufficient balance';
512
+ } else {
513
+ state.inputError = undefined;
514
+ this.setTransactionDetails();
526
515
  }
527
516
  },
528
517
 
@@ -591,7 +580,7 @@ export const SwapController = {
591
580
  if (!response) {
592
581
  throw new Error('createAllowanceTransaction - No response from generateApproveCalldata');
593
582
  }
594
- const gasLimit = await ConnectionsController.estimateGas({
583
+ const gasLimit = await ConnectionController.estimateGas({
595
584
  address: fromAddress as `0x${string}`,
596
585
  to: CoreHelperUtil.getPlainAddress(response.tx.to) as `0x${string}`,
597
586
  data: response.tx.data
@@ -644,7 +633,7 @@ export const SwapController = {
644
633
  return undefined;
645
634
  }
646
635
 
647
- const amount = ConnectionsController.parseUnits(
636
+ const amount = ConnectionController.parseUnits(
648
637
  sourceTokenAmount,
649
638
  sourceToken.decimals
650
639
  )?.toString();
@@ -712,13 +701,13 @@ export const SwapController = {
712
701
  }
713
702
 
714
703
  try {
715
- await ConnectionsController.sendTransaction({
704
+ await ConnectionController.sendTransaction({
716
705
  address: fromAddress as `0x${string}`,
717
706
  to: data.to as `0x${string}`,
718
707
  data: data.data as `0x${string}`,
719
708
  value: BigInt(data.value),
720
709
  gasPrice: BigInt(data.gasPrice),
721
- chainNamespace: ConnectionsController.state.activeNamespace
710
+ chainNamespace: 'eip155'
722
711
  });
723
712
 
724
713
  await this.swapTokens();
@@ -737,6 +726,7 @@ export const SwapController = {
737
726
  if (!data) {
738
727
  return undefined;
739
728
  }
729
+
740
730
  const { fromAddress, toTokenAmount, isAuthConnector } = this.getParams();
741
731
 
742
732
  state.loadingTransaction = true;
@@ -763,14 +753,14 @@ export const SwapController = {
763
753
 
764
754
  try {
765
755
  const forceUpdateAddresses = [state.sourceToken?.address, state.toToken?.address].join(',');
766
- const transactionHash = await ConnectionsController.sendTransaction({
756
+ const transactionHash = await ConnectionController.sendTransaction({
767
757
  address: fromAddress as `0x${string}`,
768
758
  to: data.to as `0x${string}`,
769
759
  data: data.data as `0x${string}`,
770
760
  gas: data.gas,
771
761
  gasPrice: BigInt(data.gasPrice),
772
762
  value: data.value,
773
- chainNamespace: ConnectionsController.state.activeNamespace
763
+ chainNamespace: 'eip155'
774
764
  });
775
765
 
776
766
  state.loadingTransaction = false;
@@ -779,7 +769,7 @@ export const SwapController = {
779
769
  type: 'track',
780
770
  event: 'SWAP_SUCCESS',
781
771
  properties: {
782
- network: ConnectionsController.state.activeNetwork?.caipNetworkId || '',
772
+ network: NetworkController.state.caipNetwork?.id || '',
783
773
  swapFromToken: this.state.sourceToken?.symbol || '',
784
774
  swapToToken: this.state.toToken?.symbol || '',
785
775
  swapFromAmount: this.state.sourceTokenAmount || '',
@@ -811,7 +801,7 @@ export const SwapController = {
811
801
  event: 'SWAP_ERROR',
812
802
  properties: {
813
803
  message: error?.shortMessage ?? error?.message ?? 'Unknown',
814
- network: ConnectionsController.state.activeNetwork?.caipNetworkId || '',
804
+ network: NetworkController.state.caipNetwork?.id || '',
815
805
  swapFromToken: this.state.sourceToken?.symbol || '',
816
806
  swapToToken: this.state.toToken?.symbol || '',
817
807
  swapFromAmount: this.state.sourceTokenAmount || '',
@@ -1,11 +1,10 @@
1
- import { Appearance } from 'react-native';
2
1
  import { proxy, subscribe as sub } from 'valtio';
3
2
  import type { ThemeMode, ThemeVariables } from '@reown/appkit-common-react-native';
4
3
 
5
4
  // -- Types --------------------------------------------- //
6
5
  export interface ThemeControllerState {
7
6
  themeMode?: ThemeMode;
8
- themeVariables?: ThemeVariables;
7
+ themeVariables: ThemeVariables;
9
8
  }
10
9
 
11
10
  // -- State --------------------------------------------- //
@@ -23,18 +22,10 @@ export const ThemeController = {
23
22
  },
24
23
 
25
24
  setThemeMode(themeMode: ThemeControllerState['themeMode']) {
26
- if (!themeMode) {
27
- state.themeMode = Appearance.getColorScheme() as ThemeMode;
28
- } else {
29
- state.themeMode = themeMode;
30
- }
25
+ state.themeMode = themeMode;
31
26
  },
32
27
 
33
28
  setThemeVariables(themeVariables: ThemeControllerState['themeVariables']) {
34
- if (!themeVariables) {
35
- state.themeVariables = {};
36
- }
37
-
38
29
  state.themeVariables = { ...state.themeVariables, ...themeVariables };
39
30
  }
40
31
  };