@reown/appkit-core-react-native 0.0.0-feat-onramp-20250718200617 → 0.0.0-feat-coinbase-20250722173213

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