@reown/appkit-core-react-native 0.0.0-feat-multi-social-20250715153550 → 0.0.0-feat-onramp-20250718191948

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 (194) hide show
  1. package/lib/commonjs/controllers/AccountController.js +17 -20
  2. package/lib/commonjs/controllers/AccountController.js.map +1 -1
  3. package/lib/commonjs/controllers/ApiController.js +15 -17
  4. package/lib/commonjs/controllers/ApiController.js.map +1 -1
  5. package/lib/commonjs/controllers/BlockchainApiController.js +28 -110
  6. package/lib/commonjs/controllers/BlockchainApiController.js.map +1 -1
  7. package/lib/commonjs/controllers/ConnectionController.js +11 -8
  8. package/lib/commonjs/controllers/ConnectionController.js.map +1 -1
  9. package/lib/commonjs/controllers/ConnectorController.js +49 -0
  10. package/lib/commonjs/controllers/ConnectorController.js.map +1 -0
  11. package/lib/commonjs/controllers/EnsController.js +4 -4
  12. package/lib/commonjs/controllers/EnsController.js.map +1 -1
  13. package/lib/commonjs/controllers/EventsController.js +4 -4
  14. package/lib/commonjs/controllers/EventsController.js.map +1 -1
  15. package/lib/commonjs/controllers/ModalController.js +2 -2
  16. package/lib/commonjs/controllers/ModalController.js.map +1 -1
  17. package/lib/commonjs/controllers/OnRampController.js +62 -21
  18. package/lib/commonjs/controllers/OnRampController.js.map +1 -1
  19. package/lib/commonjs/controllers/OptionsController.js +3 -8
  20. package/lib/commonjs/controllers/OptionsController.js.map +1 -1
  21. package/lib/commonjs/controllers/RouterController.js +22 -1
  22. package/lib/commonjs/controllers/RouterController.js.map +1 -1
  23. package/lib/commonjs/controllers/SendController.js +33 -34
  24. package/lib/commonjs/controllers/SendController.js.map +1 -1
  25. package/lib/commonjs/controllers/SnackController.js +5 -29
  26. package/lib/commonjs/controllers/SnackController.js.map +1 -1
  27. package/lib/commonjs/controllers/SwapController.js +148 -136
  28. package/lib/commonjs/controllers/SwapController.js.map +1 -1
  29. package/lib/commonjs/controllers/ThemeController.js +1 -9
  30. package/lib/commonjs/controllers/ThemeController.js.map +1 -1
  31. package/lib/commonjs/controllers/TransactionsController.js +21 -25
  32. package/lib/commonjs/controllers/TransactionsController.js.map +1 -1
  33. package/lib/commonjs/controllers/WebviewController.js +52 -0
  34. package/lib/commonjs/controllers/WebviewController.js.map +1 -0
  35. package/lib/commonjs/index.js +24 -3
  36. package/lib/commonjs/index.js.map +1 -1
  37. package/lib/commonjs/utils/AssetUtil.js +12 -8
  38. package/lib/commonjs/utils/AssetUtil.js.map +1 -1
  39. package/lib/commonjs/utils/ConnectionUtil.js +33 -0
  40. package/lib/commonjs/utils/ConnectionUtil.js.map +1 -0
  41. package/lib/commonjs/utils/ConstantsUtil.js +8 -537
  42. package/lib/commonjs/utils/ConstantsUtil.js.map +1 -1
  43. package/lib/commonjs/utils/CoreHelperUtil.js +4 -4
  44. package/lib/commonjs/utils/CoreHelperUtil.js.map +1 -1
  45. package/lib/commonjs/utils/FetchUtil.js +28 -9
  46. package/lib/commonjs/utils/FetchUtil.js.map +1 -1
  47. package/lib/commonjs/utils/NetworkUtil.js +46 -0
  48. package/lib/commonjs/utils/NetworkUtil.js.map +1 -0
  49. package/lib/commonjs/utils/StorageUtil.js +42 -51
  50. package/lib/commonjs/utils/StorageUtil.js.map +1 -1
  51. package/lib/commonjs/utils/SwapApiUtil.js +21 -15
  52. package/lib/commonjs/utils/SwapApiUtil.js.map +1 -1
  53. package/lib/module/controllers/AccountController.js +17 -20
  54. package/lib/module/controllers/AccountController.js.map +1 -1
  55. package/lib/module/controllers/ApiController.js +15 -16
  56. package/lib/module/controllers/ApiController.js.map +1 -1
  57. package/lib/module/controllers/BlockchainApiController.js +28 -110
  58. package/lib/module/controllers/BlockchainApiController.js.map +1 -1
  59. package/lib/module/controllers/ConnectionController.js +11 -8
  60. package/lib/module/controllers/ConnectionController.js.map +1 -1
  61. package/lib/module/controllers/ConnectorController.js +44 -0
  62. package/lib/module/controllers/ConnectorController.js.map +1 -0
  63. package/lib/module/controllers/EnsController.js +2 -2
  64. package/lib/module/controllers/EnsController.js.map +1 -1
  65. package/lib/module/controllers/EventsController.js +1 -1
  66. package/lib/module/controllers/EventsController.js.map +1 -1
  67. package/lib/module/controllers/ModalController.js +2 -2
  68. package/lib/module/controllers/ModalController.js.map +1 -1
  69. package/lib/module/controllers/OnRampController.js +62 -21
  70. package/lib/module/controllers/OnRampController.js.map +1 -1
  71. package/lib/module/controllers/OptionsController.js +3 -8
  72. package/lib/module/controllers/OptionsController.js.map +1 -1
  73. package/lib/module/controllers/RouterController.js +22 -1
  74. package/lib/module/controllers/RouterController.js.map +1 -1
  75. package/lib/module/controllers/SendController.js +30 -31
  76. package/lib/module/controllers/SendController.js.map +1 -1
  77. package/lib/module/controllers/SnackController.js +5 -29
  78. package/lib/module/controllers/SnackController.js.map +1 -1
  79. package/lib/module/controllers/SwapController.js +148 -136
  80. package/lib/module/controllers/SwapController.js.map +1 -1
  81. package/lib/module/controllers/ThemeController.js +1 -9
  82. package/lib/module/controllers/ThemeController.js.map +1 -1
  83. package/lib/module/controllers/TransactionsController.js +19 -23
  84. package/lib/module/controllers/TransactionsController.js.map +1 -1
  85. package/lib/module/controllers/WebviewController.js +47 -0
  86. package/lib/module/controllers/WebviewController.js.map +1 -0
  87. package/lib/module/index.js +4 -1
  88. package/lib/module/index.js.map +1 -1
  89. package/lib/module/utils/AssetUtil.js +12 -8
  90. package/lib/module/utils/AssetUtil.js.map +1 -1
  91. package/lib/module/utils/ConnectionUtil.js +27 -0
  92. package/lib/module/utils/ConnectionUtil.js.map +1 -0
  93. package/lib/module/utils/ConstantsUtil.js +8 -537
  94. package/lib/module/utils/ConstantsUtil.js.map +1 -1
  95. package/lib/module/utils/CoreHelperUtil.js +4 -4
  96. package/lib/module/utils/CoreHelperUtil.js.map +1 -1
  97. package/lib/module/utils/FetchUtil.js +28 -9
  98. package/lib/module/utils/FetchUtil.js.map +1 -1
  99. package/lib/module/utils/NetworkUtil.js +40 -0
  100. package/lib/module/utils/NetworkUtil.js.map +1 -0
  101. package/lib/module/utils/StorageUtil.js +42 -51
  102. package/lib/module/utils/StorageUtil.js.map +1 -1
  103. package/lib/module/utils/SwapApiUtil.js +21 -15
  104. package/lib/module/utils/SwapApiUtil.js.map +1 -1
  105. package/lib/typescript/controllers/AccountController.d.ts +4 -4
  106. package/lib/typescript/controllers/AccountController.d.ts.map +1 -1
  107. package/lib/typescript/controllers/ApiController.d.ts +1 -1
  108. package/lib/typescript/controllers/ApiController.d.ts.map +1 -1
  109. package/lib/typescript/controllers/BlockchainApiController.d.ts +4 -16
  110. package/lib/typescript/controllers/BlockchainApiController.d.ts.map +1 -1
  111. package/lib/typescript/controllers/ConnectionController.d.ts +11 -3
  112. package/lib/typescript/controllers/ConnectionController.d.ts.map +1 -1
  113. package/lib/typescript/controllers/ConnectorController.d.ts +18 -0
  114. package/lib/typescript/controllers/ConnectorController.d.ts.map +1 -0
  115. package/lib/typescript/controllers/ModalController.d.ts +1 -1
  116. package/lib/typescript/controllers/ModalController.d.ts.map +1 -1
  117. package/lib/typescript/controllers/NetworkController.d.ts +1 -1
  118. package/lib/typescript/controllers/NetworkController.d.ts.map +1 -1
  119. package/lib/typescript/controllers/OnRampController.d.ts +3 -1
  120. package/lib/typescript/controllers/OnRampController.d.ts.map +1 -1
  121. package/lib/typescript/controllers/OptionsController.d.ts +2 -5
  122. package/lib/typescript/controllers/OptionsController.d.ts.map +1 -1
  123. package/lib/typescript/controllers/PublicStateController.d.ts +1 -1
  124. package/lib/typescript/controllers/PublicStateController.d.ts.map +1 -1
  125. package/lib/typescript/controllers/RouterController.d.ts +16 -4
  126. package/lib/typescript/controllers/RouterController.d.ts.map +1 -1
  127. package/lib/typescript/controllers/SendController.d.ts.map +1 -1
  128. package/lib/typescript/controllers/SnackController.d.ts +3 -3
  129. package/lib/typescript/controllers/SnackController.d.ts.map +1 -1
  130. package/lib/typescript/controllers/SwapController.d.ts +9 -9
  131. package/lib/typescript/controllers/SwapController.d.ts.map +1 -1
  132. package/lib/typescript/controllers/ThemeController.d.ts +1 -1
  133. package/lib/typescript/controllers/ThemeController.d.ts.map +1 -1
  134. package/lib/typescript/controllers/TransactionsController.d.ts +3 -3
  135. package/lib/typescript/controllers/TransactionsController.d.ts.map +1 -1
  136. package/lib/typescript/controllers/WebviewController.d.ts +21 -0
  137. package/lib/typescript/controllers/WebviewController.d.ts.map +1 -0
  138. package/lib/typescript/index.d.ts +4 -1
  139. package/lib/typescript/index.d.ts.map +1 -1
  140. package/lib/typescript/utils/AssetUtil.d.ts +3 -3
  141. package/lib/typescript/utils/AssetUtil.d.ts.map +1 -1
  142. package/lib/typescript/utils/ConnectionUtil.d.ts +4 -0
  143. package/lib/typescript/utils/ConnectionUtil.d.ts.map +1 -0
  144. package/lib/typescript/utils/ConstantsUtil.d.ts +1 -421
  145. package/lib/typescript/utils/ConstantsUtil.d.ts.map +1 -1
  146. package/lib/typescript/utils/CoreHelperUtil.d.ts +3 -3
  147. package/lib/typescript/utils/CoreHelperUtil.d.ts.map +1 -1
  148. package/lib/typescript/utils/FetchUtil.d.ts +1 -1
  149. package/lib/typescript/utils/FetchUtil.d.ts.map +1 -1
  150. package/lib/typescript/utils/NetworkUtil.d.ts +8 -0
  151. package/lib/typescript/utils/NetworkUtil.d.ts.map +1 -0
  152. package/lib/typescript/utils/StorageUtil.d.ts +7 -14
  153. package/lib/typescript/utils/StorageUtil.d.ts.map +1 -1
  154. package/lib/typescript/utils/SwapApiUtil.d.ts +3 -3
  155. package/lib/typescript/utils/SwapApiUtil.d.ts.map +1 -1
  156. package/lib/typescript/utils/TypeUtil.d.ts +173 -24
  157. package/lib/typescript/utils/TypeUtil.d.ts.map +1 -1
  158. package/package.json +4 -4
  159. package/src/controllers/AccountController.ts +27 -23
  160. package/src/controllers/ApiController.ts +9 -15
  161. package/src/controllers/BlockchainApiController.ts +31 -145
  162. package/src/controllers/ConnectionController.ts +24 -12
  163. package/src/controllers/ConnectorController.ts +63 -0
  164. package/src/controllers/EnsController.ts +2 -2
  165. package/src/controllers/EventsController.ts +1 -1
  166. package/src/controllers/ModalController.ts +3 -4
  167. package/src/controllers/NetworkController.ts +1 -1
  168. package/src/controllers/OnRampController.ts +93 -33
  169. package/src/controllers/OptionsController.ts +13 -14
  170. package/src/controllers/PublicStateController.ts +1 -1
  171. package/src/controllers/RouterController.ts +54 -5
  172. package/src/controllers/SendController.ts +30 -39
  173. package/src/controllers/SnackController.ts +5 -31
  174. package/src/controllers/SwapController.ts +178 -155
  175. package/src/controllers/ThemeController.ts +2 -11
  176. package/src/controllers/TransactionsController.ts +20 -26
  177. package/src/controllers/WebviewController.ts +63 -0
  178. package/src/index.ts +6 -3
  179. package/src/utils/AssetUtil.ts +14 -8
  180. package/src/utils/ConnectionUtil.ts +27 -0
  181. package/src/utils/ConstantsUtil.ts +8 -542
  182. package/src/utils/CoreHelperUtil.ts +7 -15
  183. package/src/utils/FetchUtil.ts +31 -10
  184. package/src/utils/NetworkUtil.ts +33 -0
  185. package/src/utils/StorageUtil.ts +48 -60
  186. package/src/utils/SwapApiUtil.ts +38 -27
  187. package/src/utils/TypeUtil.ts +173 -26
  188. package/lib/commonjs/controllers/ConnectionsController.js +0 -383
  189. package/lib/commonjs/controllers/ConnectionsController.js.map +0 -1
  190. package/lib/module/controllers/ConnectionsController.js +0 -378
  191. package/lib/module/controllers/ConnectionsController.js.map +0 -1
  192. package/lib/typescript/controllers/ConnectionsController.d.ts +0 -52
  193. package/lib/typescript/controllers/ConnectionsController.d.ts.map +0 -1
  194. package/src/controllers/ConnectionsController.ts +0 -503
@@ -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,25 @@ 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
- walletAddress: AccountController.state.address!
420
+ walletAddress: AccountController.state.address!,
421
+ excludeProviders: ['BINANCECONNECT', 'COINBASEPAY']
403
422
  };
404
423
 
405
- const response = await BlockchainApiController.getOnRampQuotes(
406
- body,
407
- quotesAbortController.signal
408
- );
424
+ const response = await BlockchainApiController.getOnRampQuotes(body, currentSignal);
409
425
 
410
426
  if (!response || !response.length) {
411
427
  throw new Error('No quotes available');
@@ -414,9 +430,48 @@ export const OnRampController = {
414
430
  const quotes = response.sort((a, b) => b.customerScore - a.customerScore);
415
431
 
416
432
  state.quotes = quotes;
417
- state.selectedQuote = quotes[0];
433
+
434
+ //Replace payment method if it's not in the quotes
435
+ const isValidPaymentMethod =
436
+ state.selectedPaymentMethod &&
437
+ quotes.some(
438
+ quote => quote.paymentMethodType === state.selectedPaymentMethod?.paymentMethod
439
+ );
440
+
441
+ if (!isValidPaymentMethod) {
442
+ const countryMethods =
443
+ state.countriesDefaults?.find(d => d.countryCode === state.selectedCountry?.countryCode)
444
+ ?.defaultPaymentMethods || [];
445
+
446
+ const availableQuoteMethods = new Set(quotes.map(q => q.paymentMethodType));
447
+
448
+ let newPaymentMethodType: string | undefined;
449
+ for (const dpm of countryMethods) {
450
+ if (availableQuoteMethods.has(dpm)) {
451
+ newPaymentMethodType = dpm;
452
+ break;
453
+ }
454
+ }
455
+
456
+ if (newPaymentMethodType) {
457
+ state.selectedPaymentMethod =
458
+ state.paymentMethods.find(m => m.paymentMethod === newPaymentMethodType) ||
459
+ state.paymentMethods.find(
460
+ method => method.paymentMethod === quotes[0]?.paymentMethodType
461
+ );
462
+ } else {
463
+ state.selectedPaymentMethod = state.paymentMethods.find(
464
+ method => method.paymentMethod === quotes[0]?.paymentMethodType
465
+ );
466
+ }
467
+ }
468
+
469
+ state.selectedQuote = quotes.find(
470
+ quote => quote.paymentMethodType === state.selectedPaymentMethod?.paymentMethod
471
+ );
472
+
418
473
  state.selectedServiceProvider = state.serviceProviders.find(
419
- sp => sp.serviceProvider === quotes[0]?.serviceProvider
474
+ sp => sp.serviceProvider === state.selectedQuote?.serviceProvider
420
475
  );
421
476
  } catch (error: any) {
422
477
  if (error.name === 'AbortError') {
@@ -435,7 +490,9 @@ export const OnRampController = {
435
490
  this.clearQuotes();
436
491
  state.error = mapErrorMessage(error?.code || 'UNKNOWN_ERROR');
437
492
  } finally {
438
- state.quotesLoading = false;
493
+ if (!currentSignal.aborted) {
494
+ state.quotesLoading = false;
495
+ }
439
496
  }
440
497
  },
441
498
 
@@ -492,7 +549,7 @@ export const OnRampController = {
492
549
  throw new Error('Invalid quote');
493
550
  }
494
551
 
495
- const widget = await BlockchainApiController.getOnRampWidget({
552
+ const body = {
496
553
  countryCode: quote.countryCode,
497
554
  destinationCurrencyCode: quote.destinationCurrencyCode,
498
555
  paymentMethodType: quote.paymentMethodType,
@@ -501,7 +558,9 @@ export const OnRampController = {
501
558
  sourceCurrencyCode: quote.sourceCurrencyCode,
502
559
  walletAddress: AccountController.state.address!,
503
560
  redirectUrl: metadata?.redirect?.universal ?? metadata?.redirect?.native
504
- });
561
+ };
562
+
563
+ const widget = await BlockchainApiController.getOnRampWidget(body);
505
564
 
506
565
  if (!widget || !widget.widgetUrl) {
507
566
  throw new Error('Invalid widget response');
@@ -555,6 +614,7 @@ export const OnRampController = {
555
614
  await this.fetchServiceProviders();
556
615
 
557
616
  await Promise.all([
617
+ this.fetchCountriesDefaults(),
558
618
  this.fetchPaymentMethods(),
559
619
  this.fetchFiatLimits(),
560
620
  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,9 +1,22 @@
1
1
  import { proxy } from 'valtio';
2
- import type { CaipNetwork, SocialProvider } from '@reown/appkit-common-react-native';
3
-
4
- import type { WcWallet, OnRampTransactionResult } from '../utils/TypeUtil';
2
+ import type {
3
+ WcWallet,
4
+ CaipNetwork,
5
+ Connector,
6
+ SwapInputTarget,
7
+ OnRampTransactionResult
8
+ } from '../utils/TypeUtil';
5
9
 
6
10
  // -- Types --------------------------------------------- //
11
+ type TransactionAction = {
12
+ goBack: boolean;
13
+ view: RouterControllerState['view'] | null;
14
+ close?: boolean;
15
+ replace?: boolean;
16
+ onSuccess?: () => void;
17
+ onCancel?: () => void;
18
+ };
19
+
7
20
  export interface RouterControllerState {
8
21
  view:
9
22
  | 'Account'
@@ -14,7 +27,11 @@ export interface RouterControllerState {
14
27
  | 'ConnectingExternal'
15
28
  | 'ConnectingSiwe'
16
29
  | 'ConnectingSocial'
30
+ | 'ConnectingFarcaster'
17
31
  | 'ConnectingWalletConnect'
32
+ | 'Create'
33
+ | 'EmailVerifyDevice'
34
+ | 'EmailVerifyOtp'
18
35
  | 'GetWallet'
19
36
  | 'Networks'
20
37
  | 'OnRamp'
@@ -24,10 +41,15 @@ export interface RouterControllerState {
24
41
  | 'OnRampTransaction'
25
42
  | 'SwitchNetwork'
26
43
  | 'Swap'
44
+ | 'SwapSelectToken'
27
45
  | 'SwapPreview'
28
46
  | 'Transactions'
29
47
  | 'UnsupportedChain'
48
+ | 'UpdateEmailPrimaryOtp'
49
+ | 'UpdateEmailSecondaryOtp'
50
+ | 'UpdateEmailWallet'
30
51
  | 'UpgradeEmailWallet'
52
+ | 'UpgradeToSmartAccount'
31
53
  | 'WalletCompatibleNetworks'
32
54
  | 'WalletReceive'
33
55
  | 'WalletSend'
@@ -37,19 +59,22 @@ export interface RouterControllerState {
37
59
  | 'WhatIsAWallet';
38
60
  history: RouterControllerState['view'][];
39
61
  data?: {
62
+ connector?: Connector;
40
63
  wallet?: WcWallet;
41
64
  network?: CaipNetwork;
42
65
  email?: string;
43
66
  newEmail?: string;
67
+ swapTarget?: SwapInputTarget;
44
68
  onrampResult?: OnRampTransactionResult;
45
- socialProvider?: SocialProvider;
46
69
  };
70
+ transactionStack: TransactionAction[];
47
71
  }
48
72
 
49
73
  // -- State --------------------------------------------- //
50
74
  const state = proxy<RouterControllerState>({
51
75
  view: 'Connect',
52
- history: ['Connect']
76
+ history: ['Connect'],
77
+ transactionStack: []
53
78
  });
54
79
 
55
80
  // -- Controller ---------------------------------------- //
@@ -64,6 +89,30 @@ export const RouterController = {
64
89
  }
65
90
  },
66
91
 
92
+ pushTransactionStack(action: TransactionAction) {
93
+ state.transactionStack = [...state.transactionStack, action];
94
+ },
95
+
96
+ popTransactionStack(cancel?: boolean) {
97
+ const action = state.transactionStack.pop();
98
+
99
+ if (!action) {
100
+ return;
101
+ }
102
+
103
+ if (cancel) {
104
+ this.goBack();
105
+ action?.onCancel?.();
106
+ } else {
107
+ if (action.goBack) {
108
+ this.goBack();
109
+ } else if (action.view) {
110
+ this.reset(action.view);
111
+ }
112
+ action?.onSuccess?.();
113
+ }
114
+ },
115
+
67
116
  reset(view: RouterControllerState['view'], data?: RouterControllerState['data']) {
68
117
  state.view = view;
69
118
  state.history = [view];
@@ -1,12 +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
+ import { ConnectionController } from './ConnectionController';
5
6
  import { SnackController } from './SnackController';
6
7
  import { CoreHelperUtil } from '../utils/CoreHelperUtil';
7
8
  import { EventsController } from './EventsController';
9
+ import { NetworkController } from './NetworkController';
8
10
  import { RouterController } from './RouterController';
9
- import { ConnectionsController } from './ConnectionsController';
10
11
 
11
12
  // -- Types --------------------------------------------- //
12
13
  export interface TxParams {
@@ -96,33 +97,33 @@ export const SendController = {
96
97
  type: 'track',
97
98
  event: 'SEND_INITIATED',
98
99
  properties: {
99
- isSmartAccount: ConnectionsController.state.accountType === 'smartAccount',
100
+ isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount',
100
101
  token: this.state.token.address,
101
102
  amount: this.state.sendTokenAmount,
102
- network: ConnectionsController.state.activeNetwork?.caipNetworkId || ''
103
+ network: NetworkController.state.caipNetwork?.id || ''
103
104
  }
104
105
  });
105
106
  this.sendERC20Token({
106
107
  receiverAddress: this.state.receiverAddress,
107
108
  tokenAddress: this.state.token.address,
108
109
  sendTokenAmount: this.state.sendTokenAmount,
109
- decimals: this.state.token.quantity?.decimals || '0'
110
+ decimals: this.state.token.quantity.decimals
110
111
  });
111
112
  } else if (
112
113
  this.state.receiverAddress &&
113
114
  this.state.sendTokenAmount &&
114
115
  this.state.gasPrice &&
115
- this.state.token?.quantity?.decimals
116
+ this.state.token?.quantity.decimals
116
117
  ) {
117
118
  state.loading = true;
118
119
  EventsController.sendEvent({
119
120
  type: 'track',
120
121
  event: 'SEND_INITIATED',
121
122
  properties: {
122
- isSmartAccount: ConnectionsController.state.accountType === 'smartAccount',
123
+ isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount',
123
124
  token: this.state.token?.symbol,
124
125
  amount: this.state.sendTokenAmount,
125
- network: ConnectionsController.state.activeNetwork?.caipNetworkId || ''
126
+ network: NetworkController.state.caipNetwork?.id || ''
126
127
  }
127
128
  });
128
129
  this.sendNativeToken({
@@ -135,24 +136,21 @@ export const SendController = {
135
136
  },
136
137
 
137
138
  async sendNativeToken(params: TxParams) {
138
- const isAuth = !!ConnectionsController.state.connection?.properties?.provider;
139
+ RouterController.pushTransactionStack({
140
+ view: 'Account',
141
+ goBack: false
142
+ });
139
143
 
140
144
  const to = params.receiverAddress as `0x${string}`;
141
- const address = CoreHelperUtil.getPlainAddress(
142
- ConnectionsController.state.activeAddress
143
- ) as `0x${string}`;
144
- if (!address) {
145
- throw new Error('Invalid address');
146
- }
147
-
148
- const value = ConnectionsController.parseUnits(
145
+ const address = AccountController.state.address as `0x${string}`;
146
+ const value = ConnectionController.parseUnits(
149
147
  params.sendTokenAmount.toString(),
150
148
  Number(params.decimals)
151
149
  );
152
150
  const data = '0x';
153
151
 
154
152
  try {
155
- await ConnectionsController.sendTransaction({
153
+ await ConnectionController.sendTransaction({
156
154
  to,
157
155
  address,
158
156
  data,
@@ -164,13 +162,12 @@ export const SendController = {
164
162
  type: 'track',
165
163
  event: 'SEND_SUCCESS',
166
164
  properties: {
167
- isSmartAccount: ConnectionsController.state.accountType === 'smartAccount',
165
+ isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount',
168
166
  token: this.state.token?.symbol || '',
169
167
  amount: params.sendTokenAmount,
170
- network: ConnectionsController.state.activeNetwork?.caipNetworkId || ''
168
+ network: NetworkController.state.caipNetwork?.id || ''
171
169
  }
172
170
  });
173
- RouterController.reset(isAuth ? 'Account' : 'AccountDefault');
174
171
  this.resetSend();
175
172
  } catch (error) {
176
173
  state.loading = false;
@@ -178,10 +175,10 @@ export const SendController = {
178
175
  type: 'track',
179
176
  event: 'SEND_ERROR',
180
177
  properties: {
181
- isSmartAccount: ConnectionsController.state.accountType === 'smartAccount',
178
+ isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount',
182
179
  token: this.state.token?.symbol || '',
183
180
  amount: params.sendTokenAmount,
184
- network: ConnectionsController.state.activeNetwork?.caipNetworkId || ''
181
+ network: NetworkController.state.caipNetwork?.id || ''
185
182
  }
186
183
  });
187
184
  SnackController.showError('Something went wrong');
@@ -189,16 +186,19 @@ export const SendController = {
189
186
  },
190
187
 
191
188
  async sendERC20Token(params: ContractWriteParams) {
192
- const isAuth = !!ConnectionsController.state.connection?.properties?.provider;
189
+ RouterController.pushTransactionStack({
190
+ view: 'Account',
191
+ goBack: false
192
+ });
193
193
 
194
- const amount = ConnectionsController.parseUnits(
194
+ const amount = ConnectionController.parseUnits(
195
195
  params.sendTokenAmount.toString(),
196
196
  Number(params.decimals)
197
197
  );
198
198
 
199
199
  try {
200
200
  if (
201
- ConnectionsController.state.activeAddress &&
201
+ AccountController.state.address &&
202
202
  params.sendTokenAmount &&
203
203
  params.receiverAddress &&
204
204
  params.tokenAddress
@@ -206,23 +206,14 @@ export const SendController = {
206
206
  const tokenAddress = CoreHelperUtil.getPlainAddress(
207
207
  params.tokenAddress as `${string}:${string}:${string}`
208
208
  ) as `0x${string}`;
209
-
210
- const fromAddress = CoreHelperUtil.getPlainAddress(
211
- ConnectionsController.state.activeAddress
212
- ) as `0x${string}`;
213
- if (!fromAddress) {
214
- throw new Error('Invalid address');
215
- }
216
-
217
- await ConnectionsController.writeContract({
218
- fromAddress,
209
+ await ConnectionController.writeContract({
210
+ fromAddress: AccountController.state.address as `0x${string}`,
219
211
  tokenAddress,
220
212
  receiverAddress: params.receiverAddress as `0x${string}`,
221
213
  tokenAmount: amount,
222
214
  method: 'transfer',
223
215
  abi: ContractUtil.getERC20Abi(tokenAddress)
224
216
  });
225
- RouterController.reset(isAuth ? 'Account' : 'AccountDefault');
226
217
  SnackController.showSuccess('Transaction started');
227
218
  this.resetSend();
228
219
  }
@@ -22,52 +22,26 @@ const state = proxy<SnackControllerState>({
22
22
  long: false
23
23
  });
24
24
 
25
- // -- Private Variables --------------------------------- //
26
- let hideTimeout: NodeJS.Timeout | null = null;
27
-
28
- // -- Private Functions --------------------------------- //
29
- const clearHideTimeout = () => {
30
- if (hideTimeout) {
31
- clearTimeout(hideTimeout);
32
- hideTimeout = null;
33
- }
34
- };
35
-
36
- const scheduleAutoHide = (long: boolean) => {
37
- clearHideTimeout();
38
-
39
- const duration = long ? 15000 : 2200;
40
- hideTimeout = setTimeout(() => {
41
- SnackController.hide();
42
- }, duration);
43
- };
44
-
45
25
  // -- Controller ---------------------------------------- //
46
26
  export const SnackController = {
47
27
  state,
48
28
 
49
- showSuccess(message: SnackControllerState['message'], long = false) {
29
+ showSuccess(message: SnackControllerState['message']) {
50
30
  state.message = message;
51
31
  state.variant = 'success';
52
32
  state.open = true;
53
- state.long = long;
54
- scheduleAutoHide(long);
55
33
  },
56
34
 
57
- showError(message: SnackControllerState['message'], long = false) {
35
+ showError(message: SnackControllerState['message']) {
58
36
  state.message = message;
59
37
  state.variant = 'error';
60
38
  state.open = true;
61
- state.long = long;
62
- scheduleAutoHide(long);
63
39
  },
64
40
 
65
- showLoading(message: SnackControllerState['message'], long = false) {
41
+ showLoading(message: SnackControllerState['message']) {
66
42
  state.message = message;
67
43
  state.variant = 'loading';
68
44
  state.open = true;
69
- state.long = long;
70
- scheduleAutoHide(long);
71
45
  },
72
46
 
73
47
  showInternalError(error: Message) {
@@ -78,7 +52,6 @@ export const SnackController = {
78
52
  state.variant = 'error';
79
53
  state.open = true;
80
54
  state.long = true;
81
- scheduleAutoHide(true);
82
55
  }
83
56
 
84
57
  if (error.longMessage) {
@@ -88,8 +61,9 @@ export const SnackController = {
88
61
  },
89
62
 
90
63
  hide() {
91
- clearHideTimeout();
92
64
  state.open = false;
93
65
  state.long = false;
66
+ state.message = '';
67
+ state.variant = 'success';
94
68
  }
95
69
  };