@reown/appkit-core-react-native 0.0.0-feat-coinbase-20250722184953 → 0.0.0-feat-onramp-20250722205908

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 (195) 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 +16 -28
  4. package/lib/commonjs/controllers/ApiController.js.map +1 -1
  5. package/lib/commonjs/controllers/BlockchainApiController.js +74 -204
  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 +7 -6
  16. package/lib/commonjs/controllers/ModalController.js.map +1 -1
  17. package/lib/commonjs/controllers/OnRampController.js +69 -22
  18. package/lib/commonjs/controllers/OnRampController.js.map +1 -1
  19. package/lib/commonjs/controllers/OptionsController.js +3 -11
  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 +101 -101
  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 +150 -151
  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 +15 -3
  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 +9 -538
  42. package/lib/commonjs/utils/ConstantsUtil.js.map +1 -1
  43. package/lib/commonjs/utils/CoreHelperUtil.js +6 -12
  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 +16 -27
  56. package/lib/module/controllers/ApiController.js.map +1 -1
  57. package/lib/module/controllers/BlockchainApiController.js +73 -203
  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 +7 -6
  68. package/lib/module/controllers/ModalController.js.map +1 -1
  69. package/lib/module/controllers/OnRampController.js +70 -23
  70. package/lib/module/controllers/OnRampController.js.map +1 -1
  71. package/lib/module/controllers/OptionsController.js +3 -11
  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 +98 -98
  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 +150 -151
  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 +15 -3
  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 +9 -538
  94. package/lib/module/utils/ConstantsUtil.js.map +1 -1
  95. package/lib/module/utils/CoreHelperUtil.js +6 -12
  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 +2 -3
  108. package/lib/typescript/controllers/ApiController.d.ts.map +1 -1
  109. package/lib/typescript/controllers/BlockchainApiController.d.ts +15 -29
  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 -7
  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 +7 -5
  128. package/lib/typescript/controllers/SendController.d.ts.map +1 -1
  129. package/lib/typescript/controllers/SnackController.d.ts +3 -3
  130. package/lib/typescript/controllers/SnackController.d.ts.map +1 -1
  131. package/lib/typescript/controllers/SwapController.d.ts +11 -12
  132. package/lib/typescript/controllers/SwapController.d.ts.map +1 -1
  133. package/lib/typescript/controllers/ThemeController.d.ts +1 -1
  134. package/lib/typescript/controllers/ThemeController.d.ts.map +1 -1
  135. package/lib/typescript/controllers/TransactionsController.d.ts +3 -3
  136. package/lib/typescript/controllers/TransactionsController.d.ts.map +1 -1
  137. package/lib/typescript/controllers/WebviewController.d.ts +21 -0
  138. package/lib/typescript/controllers/WebviewController.d.ts.map +1 -0
  139. package/lib/typescript/index.d.ts +4 -1
  140. package/lib/typescript/index.d.ts.map +1 -1
  141. package/lib/typescript/utils/AssetUtil.d.ts +3 -2
  142. package/lib/typescript/utils/AssetUtil.d.ts.map +1 -1
  143. package/lib/typescript/utils/ConnectionUtil.d.ts +4 -0
  144. package/lib/typescript/utils/ConnectionUtil.d.ts.map +1 -0
  145. package/lib/typescript/utils/ConstantsUtil.d.ts +3 -422
  146. package/lib/typescript/utils/ConstantsUtil.d.ts.map +1 -1
  147. package/lib/typescript/utils/CoreHelperUtil.d.ts +4 -5
  148. package/lib/typescript/utils/CoreHelperUtil.d.ts.map +1 -1
  149. package/lib/typescript/utils/FetchUtil.d.ts +1 -1
  150. package/lib/typescript/utils/FetchUtil.d.ts.map +1 -1
  151. package/lib/typescript/utils/NetworkUtil.d.ts +8 -0
  152. package/lib/typescript/utils/NetworkUtil.d.ts.map +1 -0
  153. package/lib/typescript/utils/StorageUtil.d.ts +7 -14
  154. package/lib/typescript/utils/StorageUtil.d.ts.map +1 -1
  155. package/lib/typescript/utils/SwapApiUtil.d.ts +3 -3
  156. package/lib/typescript/utils/SwapApiUtil.d.ts.map +1 -1
  157. package/lib/typescript/utils/TypeUtil.d.ts +191 -42
  158. package/lib/typescript/utils/TypeUtil.d.ts.map +1 -1
  159. package/package.json +4 -4
  160. package/src/controllers/AccountController.ts +27 -23
  161. package/src/controllers/ApiController.ts +10 -29
  162. package/src/controllers/BlockchainApiController.ts +65 -179
  163. package/src/controllers/ConnectionController.ts +24 -12
  164. package/src/controllers/ConnectorController.ts +63 -0
  165. package/src/controllers/EnsController.ts +2 -2
  166. package/src/controllers/EventsController.ts +1 -1
  167. package/src/controllers/ModalController.ts +8 -8
  168. package/src/controllers/NetworkController.ts +1 -1
  169. package/src/controllers/OnRampController.ts +99 -35
  170. package/src/controllers/OptionsController.ts +13 -19
  171. package/src/controllers/PublicStateController.ts +1 -1
  172. package/src/controllers/RouterController.ts +54 -5
  173. package/src/controllers/SendController.ts +113 -124
  174. package/src/controllers/SnackController.ts +5 -31
  175. package/src/controllers/SwapController.ts +181 -174
  176. package/src/controllers/ThemeController.ts +2 -11
  177. package/src/controllers/TransactionsController.ts +20 -26
  178. package/src/controllers/WebviewController.ts +63 -0
  179. package/src/index.ts +6 -3
  180. package/src/utils/AssetUtil.ts +20 -4
  181. package/src/utils/ConnectionUtil.ts +27 -0
  182. package/src/utils/ConstantsUtil.ts +9 -544
  183. package/src/utils/CoreHelperUtil.ts +9 -34
  184. package/src/utils/FetchUtil.ts +31 -10
  185. package/src/utils/NetworkUtil.ts +33 -0
  186. package/src/utils/StorageUtil.ts +48 -60
  187. package/src/utils/SwapApiUtil.ts +38 -27
  188. package/src/utils/TypeUtil.ts +193 -43
  189. package/lib/commonjs/controllers/ConnectionsController.js +0 -387
  190. package/lib/commonjs/controllers/ConnectionsController.js.map +0 -1
  191. package/lib/module/controllers/ConnectionsController.js +0 -382
  192. package/lib/module/controllers/ConnectionsController.js.map +0 -1
  193. package/lib/typescript/controllers/ConnectionsController.d.ts +0 -53
  194. package/lib/typescript/controllers/ConnectionsController.d.ts.map +0 -1
  195. package/src/controllers/ConnectionsController.ts +0 -509
@@ -1,23 +1,22 @@
1
1
  import { subscribeKey as subKey } from 'valtio/utils';
2
2
  import { proxy, subscribe as sub } from 'valtio';
3
- import {
4
- NumberUtil,
5
- type CaipAddress,
6
- type CaipNetworkId
7
- } from '@reown/appkit-common-react-native';
3
+ import { NumberUtil } from '@reown/appkit-common-react-native';
8
4
 
9
5
  import { ConstantsUtil } from '../utils/ConstantsUtil';
10
6
  import { SwapApiUtil } from '../utils/SwapApiUtil';
7
+ import { NetworkController } from './NetworkController';
11
8
  import { BlockchainApiController } from './BlockchainApiController';
12
9
  import { OptionsController } from './OptionsController';
13
10
  import { SwapCalculationUtil } from '../utils/SwapCalculationUtil';
14
11
  import { SnackController } from './SnackController';
15
12
  import { RouterController } from './RouterController';
16
13
  import type { SwapInputTarget, SwapTokenWithBalance } from '../utils/TypeUtil';
14
+ import { ConnectorController } from './ConnectorController';
15
+ import { AccountController } from './AccountController';
17
16
  import { CoreHelperUtil } from '../utils/CoreHelperUtil';
17
+ import { ConnectionController } from './ConnectionController';
18
18
  import { TransactionsController } from './TransactionsController';
19
19
  import { EventsController } from './EventsController';
20
- import { ConnectionsController } from './ConnectionsController';
21
20
 
22
21
  // -- Constants ---------------------------------------- //
23
22
  export const INITIAL_GAS_LIMIT = 150000;
@@ -45,7 +44,8 @@ class TransactionError extends Error {
45
44
 
46
45
  export interface SwapControllerState {
47
46
  // Loading states
48
- loadingTokens: boolean;
47
+ initializing: boolean;
48
+ initialized: boolean;
49
49
  loadingPrices: boolean;
50
50
  loadingQuote?: boolean;
51
51
  loadingApprovalTransaction?: boolean;
@@ -68,6 +68,7 @@ export interface SwapControllerState {
68
68
  toTokenAmount: string;
69
69
  toTokenPriceInUSD: number;
70
70
  networkPrice: string;
71
+ networkBalanceInUSD: string;
71
72
  networkTokenSymbol: string;
72
73
  inputError: string | undefined;
73
74
 
@@ -95,7 +96,8 @@ type StateKey = keyof SwapControllerState;
95
96
  // -- State --------------------------------------------- //
96
97
  const initialState: SwapControllerState = {
97
98
  // Loading states
98
- loadingTokens: false,
99
+ initializing: false,
100
+ initialized: false,
99
101
  loadingPrices: false,
100
102
  loadingQuote: false,
101
103
  loadingApprovalTransaction: false,
@@ -118,6 +120,7 @@ const initialState: SwapControllerState = {
118
120
  toTokenAmount: '',
119
121
  toTokenPriceInUSD: 0,
120
122
  networkPrice: '0',
123
+ networkBalanceInUSD: '0',
121
124
  networkTokenSymbol: '',
122
125
  inputError: undefined,
123
126
 
@@ -155,15 +158,10 @@ export const SwapController = {
155
158
  },
156
159
 
157
160
  getParams() {
158
- const { activeAddress, activeNamespace, activeNetwork, connection } =
159
- ConnectionsController.state;
160
- const address = CoreHelperUtil.getPlainAddress(activeAddress);
161
-
162
- if (!activeNamespace || !activeNetwork) {
163
- throw new Error('No active namespace or network found to swap the tokens from.');
164
- }
165
-
166
- const networkAddress: CaipAddress = `${activeNetwork.caipNetworkId}:${ConstantsUtil.NATIVE_TOKEN_ADDRESS[activeNamespace]}`;
161
+ const caipAddress = AccountController.state.caipAddress;
162
+ const address = CoreHelperUtil.getPlainAddress(caipAddress);
163
+ const networkAddress = NetworkController.getActiveNetworkTokenAddress();
164
+ const type = ConnectorController.state.connectedConnector;
167
165
 
168
166
  if (!address) {
169
167
  throw new Error('No address found to swap the tokens from.');
@@ -179,9 +177,8 @@ export const SwapController = {
179
177
 
180
178
  return {
181
179
  networkAddress,
182
- network: activeNetwork,
183
180
  fromAddress: address,
184
- fromCaipAddress: activeAddress,
181
+ fromCaipAddress: caipAddress,
185
182
  sourceTokenAddress: state.sourceToken?.address,
186
183
  toTokenAddress: state.toToken?.address,
187
184
  toTokenAmount: state.toTokenAmount,
@@ -192,13 +189,13 @@ export const SwapController = {
192
189
  invalidSourceToken,
193
190
  invalidSourceTokenAmount,
194
191
  availableToSwap:
195
- activeAddress && !invalidToToken && !invalidSourceToken && !invalidSourceTokenAmount,
196
- isAuthConnector: !!connection?.properties?.provider
192
+ caipAddress && !invalidToToken && !invalidSourceToken && !invalidSourceTokenAmount,
193
+ isAuthConnector: type === 'AUTH'
197
194
  };
198
195
  },
199
196
 
200
197
  switchTokens() {
201
- if (state.loadingTokens) {
198
+ if (state.initializing || !state.initialized) {
202
199
  return;
203
200
  }
204
201
 
@@ -223,36 +220,41 @@ export const SwapController = {
223
220
  this.swapTokens();
224
221
  },
225
222
 
223
+ resetState() {
224
+ state.myTokensWithBalance = initialState.myTokensWithBalance;
225
+ state.tokensPriceMap = initialState.tokensPriceMap;
226
+ state.initialized = initialState.initialized;
227
+ state.sourceToken = initialState.sourceToken;
228
+ state.sourceTokenAmount = initialState.sourceTokenAmount;
229
+ state.sourceTokenPriceInUSD = initialState.sourceTokenPriceInUSD;
230
+ state.toToken = initialState.toToken;
231
+ state.toTokenAmount = initialState.toTokenAmount;
232
+ state.toTokenPriceInUSD = initialState.toTokenPriceInUSD;
233
+ state.networkPrice = initialState.networkPrice;
234
+ state.networkTokenSymbol = initialState.networkTokenSymbol;
235
+ state.networkBalanceInUSD = initialState.networkBalanceInUSD;
236
+ state.inputError = initialState.inputError;
237
+ },
238
+
226
239
  async fetchTokens() {
227
- try {
228
- const { networkAddress } = this.getParams();
240
+ const { networkAddress } = this.getParams();
229
241
 
230
- state.loadingTokens = true;
231
- await this.getTokenList();
232
- await this.getNetworkTokenPrice();
233
- await this.getMyTokensWithBalance();
242
+ await this.getTokenList();
243
+ await this.getNetworkTokenPrice();
244
+ await this.getMyTokensWithBalance();
234
245
 
235
- const networkToken = state.tokens?.find(token => token.address === networkAddress);
246
+ const networkToken = state.tokens?.find(token => token.address === networkAddress);
236
247
 
237
- if (networkToken) {
238
- state.networkTokenSymbol = networkToken.symbol;
239
- }
248
+ if (networkToken) {
249
+ state.networkTokenSymbol = networkToken.symbol;
250
+ }
240
251
 
241
- // Set default source token if not set
242
- if (!state.sourceToken && state.myTokensWithBalance?.length) {
243
- const sourceToken =
244
- state.myTokensWithBalance?.find(token => token.address.startsWith(networkAddress)) ||
245
- state.myTokensWithBalance?.[0];
252
+ const sourceToken =
253
+ state.myTokensWithBalance?.find(token => token.address.startsWith(networkAddress)) ||
254
+ state.myTokensWithBalance?.[0];
246
255
 
247
- this.setSourceToken(sourceToken);
248
- this.setSourceTokenAmount('1');
249
- }
250
- } catch (error) {
251
- SnackController.showError('Failed to initialize swap');
252
- RouterController.goBack();
253
- } finally {
254
- state.loadingTokens = false;
255
- }
256
+ this.setSourceToken(sourceToken);
257
+ this.setSourceTokenAmount('1');
256
258
  },
257
259
 
258
260
  async getTokenList() {
@@ -278,23 +280,21 @@ export const SwapController = {
278
280
  }, {});
279
281
  },
280
282
 
281
- async getMyTokensWithBalance(forceUpdate?: CaipAddress[]) {
282
- await ConnectionsController.fetchBalance(forceUpdate);
283
- const swapBalances = SwapApiUtil.mapBalancesToSwapTokens(ConnectionsController.state.balances);
284
- if (!swapBalances) {
283
+ async getMyTokensWithBalance(forceUpdate?: string) {
284
+ const balances = await SwapApiUtil.getMyTokensWithBalance(forceUpdate);
285
+
286
+ if (!balances) {
285
287
  return;
286
288
  }
287
289
 
288
290
  await this.getInitialGasPrice();
289
- this.setBalances(swapBalances);
291
+ this.setBalances(balances);
290
292
  },
291
293
 
292
- getFilteredPopularTokens(balances?: SwapTokenWithBalance[]) {
293
- if (!balances) {
294
- return state.popularTokens;
295
- }
296
-
297
- return state.popularTokens?.filter(token => !balances.some(t => t.address === token.address));
294
+ getFilteredPopularTokens() {
295
+ return state.popularTokens?.filter(
296
+ token => !state.myTokensWithBalance?.some(t => t.address === token.address)
297
+ );
298
298
  },
299
299
 
300
300
  setSourceToken(sourceToken: SwapTokenWithBalance | undefined) {
@@ -318,10 +318,26 @@ export const SwapController = {
318
318
  }
319
319
  },
320
320
 
321
- async getAddressPrice(address: CaipAddress) {
322
- const [namespace, chain] = address.split(':');
323
- const networkId: CaipNetworkId = `${namespace}:${chain}`;
321
+ async initializeState() {
322
+ if (state.initializing) {
323
+ return;
324
+ }
324
325
 
326
+ state.initializing = true;
327
+ if (!state.initialized) {
328
+ try {
329
+ await this.fetchTokens();
330
+ state.initialized = true;
331
+ } catch (error) {
332
+ state.initialized = false;
333
+ SnackController.showError('Failed to initialize swap');
334
+ RouterController.goBack();
335
+ }
336
+ }
337
+ state.initializing = false;
338
+ },
339
+
340
+ async getAddressPrice(address: string) {
325
341
  const existPrice = state.tokensPriceMap[address];
326
342
 
327
343
  if (existPrice) {
@@ -330,8 +346,7 @@ export const SwapController = {
330
346
 
331
347
  const response = await BlockchainApiController.fetchTokenPrice({
332
348
  projectId: OptionsController.state.projectId,
333
- addresses: [address],
334
- caipNetworkId: networkId
349
+ addresses: [address]
335
350
  });
336
351
  const fungibles = response?.fungibles || [];
337
352
  const allTokens = [...(state.tokens || []), ...(state.myTokensWithBalance || [])];
@@ -346,13 +361,10 @@ export const SwapController = {
346
361
 
347
362
  async getNetworkTokenPrice() {
348
363
  const { networkAddress } = this.getParams();
349
- const [namespace, chain] = networkAddress.split(':');
350
- const networkId: CaipNetworkId = `${namespace}:${chain}`;
351
364
 
352
365
  const response = await BlockchainApiController.fetchTokenPrice({
353
366
  projectId: OptionsController.state.projectId,
354
- addresses: [networkAddress],
355
- caipNetworkId: networkId
367
+ addresses: [networkAddress]
356
368
  });
357
369
 
358
370
  const token = response?.fungibles?.[0];
@@ -388,11 +400,24 @@ export const SwapController = {
388
400
  },
389
401
 
390
402
  setBalances(balances: SwapTokenWithBalance[]) {
391
- state.myTokensWithBalance = balances;
403
+ const { networkAddress } = this.getParams();
404
+ const caipNetwork = NetworkController.state.caipNetwork;
405
+
406
+ if (!caipNetwork) {
407
+ return;
408
+ }
409
+
410
+ const networkToken = balances.find(token => token.address === networkAddress);
392
411
 
393
412
  balances.forEach(token => {
394
413
  state.tokensPriceMap[token.address] = token.price || 0;
395
414
  });
415
+
416
+ state.myTokensWithBalance = balances.filter(token => token.address?.startsWith(caipNetwork.id));
417
+
418
+ state.networkBalanceInUSD = networkToken
419
+ ? NumberUtil.multiply(networkToken.quantity.numeric, networkToken.price).toString()
420
+ : '0';
396
421
  },
397
422
 
398
423
  setToToken(toToken: SwapTokenWithBalance | undefined) {
@@ -414,7 +439,7 @@ export const SwapController = {
414
439
  : '';
415
440
  },
416
441
 
417
- async setTokenPrice(address: CaipAddress, target: SwapInputTarget) {
442
+ async setTokenPrice(address: string, target: SwapInputTarget) {
418
443
  let price = state.tokensPriceMap[address] || 0;
419
444
 
420
445
  if (!price) {
@@ -439,12 +464,12 @@ export const SwapController = {
439
464
 
440
465
  // -- Swap ---------------------------------------------- //
441
466
  async swapTokens() {
442
- const address = ConnectionsController.state.activeAddress;
467
+ const address = AccountController.state.address as `${string}:${string}:${string}`;
443
468
  const sourceToken = state.sourceToken;
444
469
  const toToken = state.toToken;
445
470
  const haveSourceTokenAmount = NumberUtil.bigNumber(state.sourceTokenAmount).isGreaterThan(0);
446
471
 
447
- if (!toToken || !sourceToken || state.loadingPrices || !haveSourceTokenAmount || !address) {
472
+ if (!toToken || !sourceToken || state.loadingPrices || !haveSourceTokenAmount) {
448
473
  return;
449
474
  }
450
475
 
@@ -454,45 +479,39 @@ export const SwapController = {
454
479
  .multipliedBy(10 ** sourceToken.decimals)
455
480
  .integerValue();
456
481
 
457
- try {
458
- const quoteResponse = await BlockchainApiController.fetchSwapQuote({
459
- userAddress: address,
460
- projectId: OptionsController.state.projectId,
461
- from: sourceToken.address,
462
- to: toToken.address,
463
- gasPrice: state.gasFee,
464
- amount: amountDecimal.toString()
465
- });
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
+ });
466
490
 
467
- const quoteToAmount = quoteResponse?.quotes?.[0]?.toAmount;
491
+ state.loadingQuote = false;
468
492
 
469
- if (!quoteToAmount) {
470
- state.loadingQuote = false;
493
+ const quoteToAmount = quoteResponse?.quotes?.[0]?.toAmount;
471
494
 
472
- return;
473
- }
495
+ if (!quoteToAmount) {
496
+ return;
497
+ }
474
498
 
475
- const toTokenAmount = NumberUtil.bigNumber(quoteToAmount)
476
- .dividedBy(10 ** toToken.decimals)
477
- .toString();
499
+ const toTokenAmount = NumberUtil.bigNumber(quoteToAmount)
500
+ .dividedBy(10 ** toToken.decimals)
501
+ .toString();
478
502
 
479
- this.setToTokenAmount(toTokenAmount);
503
+ this.setToTokenAmount(toTokenAmount);
480
504
 
481
- const isInsufficientToken = this.hasInsufficientToken(
482
- state.sourceTokenAmount,
483
- sourceToken.address
484
- );
505
+ const isInsufficientToken = this.hasInsufficientToken(
506
+ state.sourceTokenAmount,
507
+ sourceToken.address
508
+ );
485
509
 
486
- if (isInsufficientToken) {
487
- state.inputError = 'Insufficient balance';
488
- } else {
489
- state.inputError = undefined;
490
- this.setTransactionDetails();
491
- }
492
- } catch (error) {
493
- SnackController.showError('Failed to get swap quote');
494
- } finally {
495
- state.loadingQuote = false;
510
+ if (isInsufficientToken) {
511
+ state.inputError = 'Insufficient balance';
512
+ } else {
513
+ state.inputError = undefined;
514
+ this.setTransactionDetails();
496
515
  }
497
516
  },
498
517
 
@@ -561,7 +580,7 @@ export const SwapController = {
561
580
  if (!response) {
562
581
  throw new Error('createAllowanceTransaction - No response from generateApproveCalldata');
563
582
  }
564
- const gasLimit = await ConnectionsController.estimateGas({
583
+ const gasLimit = await ConnectionController.estimateGas({
565
584
  address: fromAddress as `0x${string}`,
566
585
  to: CoreHelperUtil.getPlainAddress(response.tx.to) as `0x${string}`,
567
586
  data: response.tx.data
@@ -614,7 +633,7 @@ export const SwapController = {
614
633
  return undefined;
615
634
  }
616
635
 
617
- const amount = ConnectionsController.parseUnits(
636
+ const amount = ConnectionController.parseUnits(
618
637
  sourceTokenAmount,
619
638
  sourceToken.decimals
620
639
  )?.toString();
@@ -664,32 +683,42 @@ export const SwapController = {
664
683
  },
665
684
 
666
685
  async sendTransactionForApproval(data: TransactionParams) {
667
- const { fromAddress, network } = this.getParams();
668
- state.loadingApprovalTransaction = true;
686
+ const { fromAddress, isAuthConnector } = this.getParams();
669
687
 
670
- SnackController.showLoading('Approve limit increase in your wallet');
688
+ state.loadingApprovalTransaction = true;
689
+ const approveLimitMessage = `Approve limit increase in your wallet`;
690
+
691
+ if (isAuthConnector) {
692
+ RouterController.pushTransactionStack({
693
+ view: null,
694
+ goBack: true,
695
+ onSuccess() {
696
+ SnackController.showLoading(approveLimitMessage);
697
+ }
698
+ });
699
+ } else {
700
+ SnackController.showLoading(approveLimitMessage);
701
+ }
671
702
 
672
703
  try {
673
- await ConnectionsController.sendTransaction({
704
+ await ConnectionController.sendTransaction({
674
705
  address: fromAddress as `0x${string}`,
675
706
  to: data.to as `0x${string}`,
676
707
  data: data.data as `0x${string}`,
677
708
  value: BigInt(data.value),
678
709
  gasPrice: BigInt(data.gasPrice),
679
- chainNamespace: ConnectionsController.state.activeNamespace,
680
- network
710
+ chainNamespace: 'eip155'
681
711
  });
682
712
 
683
713
  await this.swapTokens();
684
714
  await this.getTransaction();
685
715
  state.approvalTransaction = undefined;
716
+ state.loadingApprovalTransaction = false;
686
717
  } catch (err) {
687
718
  const error = err as TransactionError;
688
719
  state.transactionError = error?.shortMessage as unknown as string;
689
-
690
- SnackController.showError(error?.shortMessage ?? 'Transaction error');
691
- } finally {
692
720
  state.loadingApprovalTransaction = false;
721
+ SnackController.showError(error?.shortMessage ?? 'Transaction error');
693
722
  }
694
723
  },
695
724
 
@@ -697,53 +726,68 @@ export const SwapController = {
697
726
  if (!data) {
698
727
  return undefined;
699
728
  }
700
- const { fromAddress, isAuthConnector, network } = this.getParams();
701
729
 
702
- state.loadingTransaction = true;
730
+ const { fromAddress, toTokenAmount, isAuthConnector } = this.getParams();
703
731
 
704
- const snackbarSuccessMessage = `Swapped ${state.sourceToken?.symbol} to ${state.toToken?.symbol}`;
732
+ state.loadingTransaction = true;
705
733
 
706
- SnackController.showLoading('Confirm transaction in your wallet');
734
+ const snackbarPendingMessage = `Swapping ${state.sourceToken
735
+ ?.symbol} to ${NumberUtil.formatNumberToLocalString(toTokenAmount, 3)} ${state.toToken
736
+ ?.symbol}`;
737
+ const snackbarSuccessMessage = `Swapped ${state.sourceToken
738
+ ?.symbol} to ${NumberUtil.formatNumberToLocalString(toTokenAmount, 3)} ${state.toToken
739
+ ?.symbol}`;
740
+
741
+ if (isAuthConnector) {
742
+ RouterController.pushTransactionStack({
743
+ view: 'Account',
744
+ goBack: false,
745
+ onSuccess() {
746
+ SnackController.showLoading(snackbarPendingMessage);
747
+ SwapController.resetState();
748
+ }
749
+ });
750
+ } else {
751
+ SnackController.showLoading('Confirm transaction in your wallet');
752
+ }
707
753
 
708
754
  try {
709
- const forceUpdateAddresses = [state.sourceToken?.address, state.toToken?.address].filter(
710
- Boolean
711
- ) as CaipAddress[];
712
-
713
- const transactionHash = await ConnectionsController.sendTransaction({
755
+ const forceUpdateAddresses = [state.sourceToken?.address, state.toToken?.address].join(',');
756
+ const transactionHash = await ConnectionController.sendTransaction({
714
757
  address: fromAddress as `0x${string}`,
715
758
  to: data.to as `0x${string}`,
716
759
  data: data.data as `0x${string}`,
717
760
  gas: data.gas,
718
761
  gasPrice: BigInt(data.gasPrice),
719
762
  value: data.value,
720
- chainNamespace: ConnectionsController.state.activeNamespace,
721
- network
763
+ chainNamespace: 'eip155'
722
764
  });
723
765
 
724
766
  state.loadingTransaction = false;
725
-
726
- SnackController.showSuccess(snackbarSuccessMessage, true);
767
+ SnackController.showSuccess(snackbarSuccessMessage);
727
768
  EventsController.sendEvent({
728
769
  type: 'track',
729
770
  event: 'SWAP_SUCCESS',
730
771
  properties: {
731
- network: ConnectionsController.state.activeNetwork?.caipNetworkId || '',
772
+ network: NetworkController.state.caipNetwork?.id || '',
732
773
  swapFromToken: this.state.sourceToken?.symbol || '',
733
774
  swapToToken: this.state.toToken?.symbol || '',
734
775
  swapFromAmount: this.state.sourceTokenAmount || '',
735
776
  swapToAmount: this.state.toTokenAmount || '',
736
- isSmartAccount: ConnectionsController.state.accountType === 'smartAccount'
777
+ isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount'
737
778
  }
738
779
  });
739
- RouterController.replace(isAuthConnector ? 'Account' : 'AccountDefault');
740
- SwapController.clearTokens();
780
+ SwapController.resetState();
781
+
782
+ if (!isAuthConnector) {
783
+ RouterController.replace('AccountDefault');
784
+ }
785
+
741
786
  SwapController.getMyTokensWithBalance(forceUpdateAddresses);
787
+ AccountController.fetchTokenBalance();
742
788
 
743
789
  setTimeout(() => {
744
- if (ConnectionsController.state.activeAddress) {
745
- TransactionsController.fetchTransactions(ConnectionsController.state.activeAddress, true);
746
- }
790
+ TransactionsController.fetchTransactions(AccountController.state.address, true);
747
791
  }, 5000);
748
792
 
749
793
  return transactionHash;
@@ -757,12 +801,12 @@ export const SwapController = {
757
801
  event: 'SWAP_ERROR',
758
802
  properties: {
759
803
  message: error?.shortMessage ?? error?.message ?? 'Unknown',
760
- network: ConnectionsController.state.activeNetwork?.caipNetworkId || '',
804
+ network: NetworkController.state.caipNetwork?.id || '',
761
805
  swapFromToken: this.state.sourceToken?.symbol || '',
762
806
  swapToToken: this.state.toToken?.symbol || '',
763
807
  swapFromAmount: this.state.sourceTokenAmount || '',
764
808
  swapToAmount: this.state.toTokenAmount || '',
765
- isSmartAccount: ConnectionsController.state.accountType === 'smartAccount'
809
+ isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount'
766
810
  }
767
811
  });
768
812
 
@@ -770,45 +814,8 @@ export const SwapController = {
770
814
  }
771
815
  },
772
816
 
773
- clearTransactionLoaders() {
774
- state.loadingApprovalTransaction = false;
775
- state.loadingBuildTransaction = false;
776
- state.loadingTransaction = false;
777
- },
778
-
779
- clearTokens() {
780
- state.sourceToken = initialState.sourceToken;
781
- state.sourceTokenAmount = initialState.sourceTokenAmount;
782
- state.sourceTokenPriceInUSD = initialState.sourceTokenPriceInUSD;
783
- state.toToken = initialState.toToken;
784
- state.toTokenAmount = initialState.toTokenAmount;
785
- state.toTokenPriceInUSD = initialState.toTokenPriceInUSD;
786
- state.inputError = initialState.inputError;
787
- state.loadingApprovalTransaction = initialState.loadingApprovalTransaction;
788
- state.loadingBuildTransaction = initialState.loadingBuildTransaction;
789
- state.loadingTransaction = initialState.loadingTransaction;
790
- state.fetchError = initialState.fetchError;
791
- state.transactionError = initialState.transactionError;
792
- state.swapTransaction = initialState.swapTransaction;
793
- state.approvalTransaction = initialState.approvalTransaction;
794
- },
795
-
796
- resetState() {
797
- this.clearTokens();
798
- state.myTokensWithBalance = initialState.myTokensWithBalance;
799
- state.tokensPriceMap = initialState.tokensPriceMap;
800
- state.networkPrice = initialState.networkPrice;
801
- state.networkTokenSymbol = initialState.networkTokenSymbol;
802
- },
803
-
804
817
  // -- Checks -------------------------------------------- //
805
818
  hasInsufficientToken(sourceTokenAmount: string, sourceTokenAddress: string) {
806
- const { balances } = ConnectionsController.state;
807
- const networkToken = balances?.find(t => t.address === undefined);
808
- const networkBalanceInUSD = networkToken
809
- ? NumberUtil.multiply(networkToken.quantity?.numeric ?? '0', networkToken.price).toString()
810
- : '0';
811
-
812
819
  const isInsufficientSourceTokenForSwap = SwapCalculationUtil.isInsufficientSourceTokenForSwap(
813
820
  sourceTokenAmount,
814
821
  sourceTokenAddress,
@@ -816,12 +823,12 @@ export const SwapController = {
816
823
  );
817
824
 
818
825
  let insufficientNetworkTokenForGas = true;
819
- if (ConnectionsController.state.accountType === 'smartAccount') {
826
+ if (AccountController.state.preferredAccountType === 'smartAccount') {
820
827
  // Smart Accounts may pay gas in any ERC20 token
821
828
  insufficientNetworkTokenForGas = false;
822
829
  } else {
823
830
  insufficientNetworkTokenForGas = SwapCalculationUtil.isInsufficientNetworkTokenForGas(
824
- networkBalanceInUSD,
831
+ state.networkBalanceInUSD,
825
832
  state.gasPriceInUSD
826
833
  );
827
834
  }
@@ -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
  };