@reown/appkit-core-react-native 2.0.0-alpha.0 → 2.0.0-alpha.2

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 (207) hide show
  1. package/lib/commonjs/controllers/ApiController.js +16 -5
  2. package/lib/commonjs/controllers/ApiController.js.map +1 -1
  3. package/lib/commonjs/controllers/AssetController.js.map +1 -1
  4. package/lib/commonjs/controllers/BlockchainApiController.js +103 -111
  5. package/lib/commonjs/controllers/BlockchainApiController.js.map +1 -1
  6. package/lib/commonjs/controllers/ConnectionController.js +1 -10
  7. package/lib/commonjs/controllers/ConnectionController.js.map +1 -1
  8. package/lib/commonjs/controllers/ConnectionsController.js +313 -52
  9. package/lib/commonjs/controllers/ConnectionsController.js.map +1 -1
  10. package/lib/commonjs/controllers/EnsController.js +4 -4
  11. package/lib/commonjs/controllers/EnsController.js.map +1 -1
  12. package/lib/commonjs/controllers/EventsController.js +4 -4
  13. package/lib/commonjs/controllers/EventsController.js.map +1 -1
  14. package/lib/commonjs/controllers/ModalController.js +6 -7
  15. package/lib/commonjs/controllers/ModalController.js.map +1 -1
  16. package/lib/commonjs/controllers/OnRampController.js +117 -53
  17. package/lib/commonjs/controllers/OnRampController.js.map +1 -1
  18. package/lib/commonjs/controllers/OptionsController.js +14 -0
  19. package/lib/commonjs/controllers/OptionsController.js.map +1 -1
  20. package/lib/commonjs/controllers/PublicStateController.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 +140 -147
  28. package/lib/commonjs/controllers/SwapController.js.map +1 -1
  29. package/lib/commonjs/controllers/ThemeController.js.map +1 -1
  30. package/lib/commonjs/controllers/TransactionsController.js +23 -19
  31. package/lib/commonjs/controllers/TransactionsController.js.map +1 -1
  32. package/lib/commonjs/index.js +0 -35
  33. package/lib/commonjs/index.js.map +1 -1
  34. package/lib/commonjs/package.json +1 -0
  35. package/lib/commonjs/utils/ApiUtil.js.map +1 -1
  36. package/lib/commonjs/utils/AssetUtil.js +3 -14
  37. package/lib/commonjs/utils/AssetUtil.js.map +1 -1
  38. package/lib/commonjs/utils/ConstantsUtil.js +122 -426
  39. package/lib/commonjs/utils/ConstantsUtil.js.map +1 -1
  40. package/lib/commonjs/utils/CoreHelperUtil.js +13 -8
  41. package/lib/commonjs/utils/CoreHelperUtil.js.map +1 -1
  42. package/lib/commonjs/utils/EventUtil.js.map +1 -1
  43. package/lib/commonjs/utils/FetchUtil.js +34 -10
  44. package/lib/commonjs/utils/FetchUtil.js.map +1 -1
  45. package/lib/commonjs/utils/RouterUtil.js.map +1 -1
  46. package/lib/commonjs/utils/StorageUtil.js +86 -92
  47. package/lib/commonjs/utils/StorageUtil.js.map +1 -1
  48. package/lib/commonjs/utils/SwapApiUtil.js +11 -22
  49. package/lib/commonjs/utils/SwapApiUtil.js.map +1 -1
  50. package/lib/commonjs/utils/SwapCalculationUtil.js.map +1 -1
  51. package/lib/commonjs/utils/TypeUtil.js +25 -0
  52. package/lib/commonjs/utils/TypeUtil.js.map +1 -1
  53. package/lib/module/controllers/ApiController.js +18 -6
  54. package/lib/module/controllers/ApiController.js.map +1 -1
  55. package/lib/module/controllers/AssetController.js +2 -0
  56. package/lib/module/controllers/AssetController.js.map +1 -1
  57. package/lib/module/controllers/BlockchainApiController.js +104 -110
  58. package/lib/module/controllers/BlockchainApiController.js.map +1 -1
  59. package/lib/module/controllers/ConnectionController.js +3 -10
  60. package/lib/module/controllers/ConnectionController.js.map +1 -1
  61. package/lib/module/controllers/ConnectionsController.js +314 -51
  62. package/lib/module/controllers/ConnectionsController.js.map +1 -1
  63. package/lib/module/controllers/EnsController.js +4 -2
  64. package/lib/module/controllers/EnsController.js.map +1 -1
  65. package/lib/module/controllers/EventsController.js +3 -1
  66. package/lib/module/controllers/EventsController.js.map +1 -1
  67. package/lib/module/controllers/ModalController.js +8 -7
  68. package/lib/module/controllers/ModalController.js.map +1 -1
  69. package/lib/module/controllers/OnRampController.js +118 -52
  70. package/lib/module/controllers/OnRampController.js.map +1 -1
  71. package/lib/module/controllers/OptionsController.js +16 -0
  72. package/lib/module/controllers/OptionsController.js.map +1 -1
  73. package/lib/module/controllers/PublicStateController.js +2 -0
  74. package/lib/module/controllers/PublicStateController.js.map +1 -1
  75. package/lib/module/controllers/RouterController.js +3 -22
  76. package/lib/module/controllers/RouterController.js.map +1 -1
  77. package/lib/module/controllers/SendController.js +100 -98
  78. package/lib/module/controllers/SendController.js.map +1 -1
  79. package/lib/module/controllers/SnackController.js +31 -5
  80. package/lib/module/controllers/SnackController.js.map +1 -1
  81. package/lib/module/controllers/SwapController.js +142 -147
  82. package/lib/module/controllers/SwapController.js.map +1 -1
  83. package/lib/module/controllers/ThemeController.js +2 -0
  84. package/lib/module/controllers/ThemeController.js.map +1 -1
  85. package/lib/module/controllers/TransactionsController.js +23 -17
  86. package/lib/module/controllers/TransactionsController.js.map +1 -1
  87. package/lib/module/index.js +2 -5
  88. package/lib/module/index.js.map +1 -1
  89. package/lib/module/utils/ApiUtil.js +2 -0
  90. package/lib/module/utils/ApiUtil.js.map +1 -1
  91. package/lib/module/utils/AssetUtil.js +5 -14
  92. package/lib/module/utils/AssetUtil.js.map +1 -1
  93. package/lib/module/utils/ConstantsUtil.js +124 -426
  94. package/lib/module/utils/ConstantsUtil.js.map +1 -1
  95. package/lib/module/utils/CoreHelperUtil.js +14 -6
  96. package/lib/module/utils/CoreHelperUtil.js.map +1 -1
  97. package/lib/module/utils/EventUtil.js +2 -0
  98. package/lib/module/utils/EventUtil.js.map +1 -1
  99. package/lib/module/utils/FetchUtil.js +36 -10
  100. package/lib/module/utils/FetchUtil.js.map +1 -1
  101. package/lib/module/utils/RouterUtil.js +2 -0
  102. package/lib/module/utils/RouterUtil.js.map +1 -1
  103. package/lib/module/utils/StorageUtil.js +89 -91
  104. package/lib/module/utils/StorageUtil.js.map +1 -1
  105. package/lib/module/utils/SwapApiUtil.js +13 -22
  106. package/lib/module/utils/SwapApiUtil.js.map +1 -1
  107. package/lib/module/utils/SwapCalculationUtil.js +2 -0
  108. package/lib/module/utils/SwapCalculationUtil.js.map +1 -1
  109. package/lib/module/utils/TypeUtil.js +25 -1
  110. package/lib/module/utils/TypeUtil.js.map +1 -1
  111. package/lib/typescript/controllers/ApiController.d.ts +2 -1
  112. package/lib/typescript/controllers/ApiController.d.ts.map +1 -1
  113. package/lib/typescript/controllers/BlockchainApiController.d.ts +20 -13
  114. package/lib/typescript/controllers/BlockchainApiController.d.ts.map +1 -1
  115. package/lib/typescript/controllers/ConnectionController.d.ts +3 -16
  116. package/lib/typescript/controllers/ConnectionController.d.ts.map +1 -1
  117. package/lib/typescript/controllers/ConnectionsController.d.ts +26 -22
  118. package/lib/typescript/controllers/ConnectionsController.d.ts.map +1 -1
  119. package/lib/typescript/controllers/ModalController.d.ts +1 -1
  120. package/lib/typescript/controllers/ModalController.d.ts.map +1 -1
  121. package/lib/typescript/controllers/OnRampController.d.ts +3 -2
  122. package/lib/typescript/controllers/OnRampController.d.ts.map +1 -1
  123. package/lib/typescript/controllers/OptionsController.d.ts +7 -2
  124. package/lib/typescript/controllers/OptionsController.d.ts.map +1 -1
  125. package/lib/typescript/controllers/RouterController.d.ts +4 -17
  126. package/lib/typescript/controllers/RouterController.d.ts.map +1 -1
  127. package/lib/typescript/controllers/SendController.d.ts +5 -7
  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 +12 -11
  132. package/lib/typescript/controllers/SwapController.d.ts.map +1 -1
  133. package/lib/typescript/controllers/TransactionsController.d.ts +3 -3
  134. package/lib/typescript/controllers/TransactionsController.d.ts.map +1 -1
  135. package/lib/typescript/index.d.ts +0 -5
  136. package/lib/typescript/index.d.ts.map +1 -1
  137. package/lib/typescript/utils/AssetUtil.d.ts +2 -3
  138. package/lib/typescript/utils/AssetUtil.d.ts.map +1 -1
  139. package/lib/typescript/utils/ConstantsUtil.d.ts +7 -414
  140. package/lib/typescript/utils/ConstantsUtil.d.ts.map +1 -1
  141. package/lib/typescript/utils/CoreHelperUtil.d.ts +5 -4
  142. package/lib/typescript/utils/CoreHelperUtil.d.ts.map +1 -1
  143. package/lib/typescript/utils/FetchUtil.d.ts.map +1 -1
  144. package/lib/typescript/utils/StorageUtil.d.ts +11 -15
  145. package/lib/typescript/utils/StorageUtil.d.ts.map +1 -1
  146. package/lib/typescript/utils/SwapApiUtil.d.ts +3 -3
  147. package/lib/typescript/utils/SwapApiUtil.d.ts.map +1 -1
  148. package/lib/typescript/utils/TypeUtil.d.ts +54 -177
  149. package/lib/typescript/utils/TypeUtil.d.ts.map +1 -1
  150. package/package.json +9 -23
  151. package/src/controllers/ApiController.ts +17 -4
  152. package/src/controllers/BlockchainApiController.ts +74 -119
  153. package/src/controllers/ConnectionController.ts +5 -28
  154. package/src/controllers/ConnectionsController.ts +399 -92
  155. package/src/controllers/EnsController.ts +2 -2
  156. package/src/controllers/EventsController.ts +1 -1
  157. package/src/controllers/ModalController.ts +7 -9
  158. package/src/controllers/OnRampController.ts +178 -81
  159. package/src/controllers/OptionsController.ts +22 -9
  160. package/src/controllers/RouterController.ts +4 -54
  161. package/src/controllers/SendController.ts +124 -113
  162. package/src/controllers/SnackController.ts +31 -5
  163. package/src/controllers/SwapController.ts +165 -181
  164. package/src/controllers/TransactionsController.ts +24 -18
  165. package/src/index.ts +0 -15
  166. package/src/utils/AssetUtil.ts +4 -18
  167. package/src/utils/ConstantsUtil.ts +125 -428
  168. package/src/utils/CoreHelperUtil.ts +30 -8
  169. package/src/utils/FetchUtil.ts +37 -10
  170. package/src/utils/StorageUtil.ts +165 -106
  171. package/src/utils/SwapApiUtil.ts +25 -42
  172. package/src/utils/TypeUtil.ts +64 -171
  173. package/lib/commonjs/controllers/AccountController.js +0 -93
  174. package/lib/commonjs/controllers/AccountController.js.map +0 -1
  175. package/lib/commonjs/controllers/ConnectorController.js +0 -50
  176. package/lib/commonjs/controllers/ConnectorController.js.map +0 -1
  177. package/lib/commonjs/controllers/NetworkController.js +0 -90
  178. package/lib/commonjs/controllers/NetworkController.js.map +0 -1
  179. package/lib/commonjs/controllers/WebviewController.js +0 -52
  180. package/lib/commonjs/controllers/WebviewController.js.map +0 -1
  181. package/lib/commonjs/utils/NetworkUtil.js +0 -46
  182. package/lib/commonjs/utils/NetworkUtil.js.map +0 -1
  183. package/lib/module/controllers/AccountController.js +0 -88
  184. package/lib/module/controllers/AccountController.js.map +0 -1
  185. package/lib/module/controllers/ConnectorController.js +0 -45
  186. package/lib/module/controllers/ConnectorController.js.map +0 -1
  187. package/lib/module/controllers/NetworkController.js +0 -85
  188. package/lib/module/controllers/NetworkController.js.map +0 -1
  189. package/lib/module/controllers/WebviewController.js +0 -47
  190. package/lib/module/controllers/WebviewController.js.map +0 -1
  191. package/lib/module/utils/NetworkUtil.js +0 -40
  192. package/lib/module/utils/NetworkUtil.js.map +0 -1
  193. package/lib/typescript/controllers/AccountController.d.ts +0 -33
  194. package/lib/typescript/controllers/AccountController.d.ts.map +0 -1
  195. package/lib/typescript/controllers/ConnectorController.d.ts +0 -18
  196. package/lib/typescript/controllers/ConnectorController.d.ts.map +0 -1
  197. package/lib/typescript/controllers/NetworkController.d.ts +0 -34
  198. package/lib/typescript/controllers/NetworkController.d.ts.map +0 -1
  199. package/lib/typescript/controllers/WebviewController.d.ts +0 -21
  200. package/lib/typescript/controllers/WebviewController.d.ts.map +0 -1
  201. package/lib/typescript/utils/NetworkUtil.d.ts +0 -8
  202. package/lib/typescript/utils/NetworkUtil.d.ts.map +0 -1
  203. package/src/controllers/AccountController.ts +0 -128
  204. package/src/controllers/ConnectorController.ts +0 -64
  205. package/src/controllers/NetworkController.ts +0 -120
  206. package/src/controllers/WebviewController.ts +0 -63
  207. package/src/utils/NetworkUtil.ts +0 -33
@@ -1,20 +1,20 @@
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
20
  import { ConnectionsController } from './ConnectionsController';
@@ -45,8 +45,7 @@ class TransactionError extends Error {
45
45
 
46
46
  export interface SwapControllerState {
47
47
  // Loading states
48
- initializing: boolean;
49
- initialized: boolean;
48
+ loadingTokens: boolean;
50
49
  loadingPrices: boolean;
51
50
  loadingQuote?: boolean;
52
51
  loadingApprovalTransaction?: boolean;
@@ -69,7 +68,6 @@ export interface SwapControllerState {
69
68
  toTokenAmount: string;
70
69
  toTokenPriceInUSD: number;
71
70
  networkPrice: string;
72
- networkBalanceInUSD: string;
73
71
  networkTokenSymbol: string;
74
72
  inputError: string | undefined;
75
73
 
@@ -97,8 +95,7 @@ type StateKey = keyof SwapControllerState;
97
95
  // -- State --------------------------------------------- //
98
96
  const initialState: SwapControllerState = {
99
97
  // Loading states
100
- initializing: false,
101
- initialized: false,
98
+ loadingTokens: false,
102
99
  loadingPrices: false,
103
100
  loadingQuote: false,
104
101
  loadingApprovalTransaction: false,
@@ -121,7 +118,6 @@ const initialState: SwapControllerState = {
121
118
  toTokenAmount: '',
122
119
  toTokenPriceInUSD: 0,
123
120
  networkPrice: '0',
124
- networkBalanceInUSD: '0',
125
121
  networkTokenSymbol: '',
126
122
  inputError: undefined,
127
123
 
@@ -159,18 +155,15 @@ export const SwapController = {
159
155
  },
160
156
 
161
157
  getParams() {
162
- const { activeAddress, activeNamespace, activeNetwork } = ConnectionsController.state;
158
+ const { activeAddress, activeNamespace, activeNetwork, connection } =
159
+ ConnectionsController.state;
163
160
  const address = CoreHelperUtil.getPlainAddress(activeAddress);
164
161
 
165
162
  if (!activeNamespace || !activeNetwork) {
166
163
  throw new Error('No active namespace or network found to swap the tokens from.');
167
164
  }
168
165
 
169
- const networkAddress = `${activeNetwork.caipNetworkId ?? 'eip155:1'}:${
170
- ConstantsUtil.NATIVE_TOKEN_ADDRESS[activeNamespace]
171
- }`;
172
-
173
- const type = ConnectorController.state.connectedConnector;
166
+ const networkAddress: CaipAddress = `${activeNetwork.caipNetworkId}:${ConstantsUtil.NATIVE_TOKEN_ADDRESS[activeNamespace]}`;
174
167
 
175
168
  if (!address) {
176
169
  throw new Error('No address found to swap the tokens from.');
@@ -186,6 +179,7 @@ export const SwapController = {
186
179
 
187
180
  return {
188
181
  networkAddress,
182
+ network: activeNetwork,
189
183
  fromAddress: address,
190
184
  fromCaipAddress: activeAddress,
191
185
  sourceTokenAddress: state.sourceToken?.address,
@@ -199,12 +193,12 @@ export const SwapController = {
199
193
  invalidSourceTokenAmount,
200
194
  availableToSwap:
201
195
  activeAddress && !invalidToToken && !invalidSourceToken && !invalidSourceTokenAmount,
202
- isAuthConnector: type === 'AUTH'
196
+ isAuthConnector: !!connection?.properties?.provider
203
197
  };
204
198
  },
205
199
 
206
200
  switchTokens() {
207
- if (state.initializing || !state.initialized) {
201
+ if (state.loadingTokens) {
208
202
  return;
209
203
  }
210
204
 
@@ -229,41 +223,36 @@ export const SwapController = {
229
223
  this.swapTokens();
230
224
  },
231
225
 
232
- resetState() {
233
- state.myTokensWithBalance = initialState.myTokensWithBalance;
234
- state.tokensPriceMap = initialState.tokensPriceMap;
235
- state.initialized = initialState.initialized;
236
- state.sourceToken = initialState.sourceToken;
237
- state.sourceTokenAmount = initialState.sourceTokenAmount;
238
- state.sourceTokenPriceInUSD = initialState.sourceTokenPriceInUSD;
239
- state.toToken = initialState.toToken;
240
- state.toTokenAmount = initialState.toTokenAmount;
241
- state.toTokenPriceInUSD = initialState.toTokenPriceInUSD;
242
- state.networkPrice = initialState.networkPrice;
243
- state.networkTokenSymbol = initialState.networkTokenSymbol;
244
- state.networkBalanceInUSD = initialState.networkBalanceInUSD;
245
- state.inputError = initialState.inputError;
246
- },
247
-
248
226
  async fetchTokens() {
249
- const { networkAddress } = this.getParams();
227
+ try {
228
+ const { networkAddress } = this.getParams();
250
229
 
251
- await this.getTokenList();
252
- await this.getNetworkTokenPrice();
253
- await this.getMyTokensWithBalance();
230
+ state.loadingTokens = true;
231
+ await this.getTokenList();
232
+ await this.getNetworkTokenPrice();
233
+ await this.getMyTokensWithBalance();
254
234
 
255
- const networkToken = state.tokens?.find(token => token.address === networkAddress);
235
+ const networkToken = state.tokens?.find(token => token.address === networkAddress);
256
236
 
257
- if (networkToken) {
258
- state.networkTokenSymbol = networkToken.symbol;
259
- }
237
+ if (networkToken) {
238
+ state.networkTokenSymbol = networkToken.symbol;
239
+ }
260
240
 
261
- const sourceToken =
262
- state.myTokensWithBalance?.find(token => token.address.startsWith(networkAddress)) ||
263
- 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];
264
246
 
265
- this.setSourceToken(sourceToken);
266
- 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
+ }
267
256
  },
268
257
 
269
258
  async getTokenList() {
@@ -289,21 +278,23 @@ export const SwapController = {
289
278
  }, {});
290
279
  },
291
280
 
292
- async getMyTokensWithBalance(forceUpdate?: string) {
293
- const balances = await SwapApiUtil.getMyTokensWithBalance(forceUpdate);
294
-
295
- if (!balances) {
281
+ async getMyTokensWithBalance(forceUpdate?: CaipAddress[]) {
282
+ await ConnectionsController.fetchBalance(forceUpdate);
283
+ const swapBalances = SwapApiUtil.mapBalancesToSwapTokens(ConnectionsController.state.balances);
284
+ if (!swapBalances) {
296
285
  return;
297
286
  }
298
287
 
299
288
  await this.getInitialGasPrice();
300
- this.setBalances(balances);
289
+ this.setBalances(swapBalances);
301
290
  },
302
291
 
303
- getFilteredPopularTokens() {
304
- return state.popularTokens?.filter(
305
- token => !state.myTokensWithBalance?.some(t => t.address === token.address)
306
- );
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));
307
298
  },
308
299
 
309
300
  setSourceToken(sourceToken: SwapTokenWithBalance | undefined) {
@@ -327,26 +318,10 @@ export const SwapController = {
327
318
  }
328
319
  },
329
320
 
330
- async initializeState() {
331
- if (state.initializing) {
332
- return;
333
- }
321
+ async getAddressPrice(address: CaipAddress) {
322
+ const [namespace, chain] = address.split(':');
323
+ const networkId: CaipNetworkId = `${namespace}:${chain}`;
334
324
 
335
- state.initializing = true;
336
- if (!state.initialized) {
337
- try {
338
- await this.fetchTokens();
339
- state.initialized = true;
340
- } catch (error) {
341
- state.initialized = false;
342
- SnackController.showError('Failed to initialize swap');
343
- RouterController.goBack();
344
- }
345
- }
346
- state.initializing = false;
347
- },
348
-
349
- async getAddressPrice(address: string) {
350
325
  const existPrice = state.tokensPriceMap[address];
351
326
 
352
327
  if (existPrice) {
@@ -355,7 +330,8 @@ export const SwapController = {
355
330
 
356
331
  const response = await BlockchainApiController.fetchTokenPrice({
357
332
  projectId: OptionsController.state.projectId,
358
- addresses: [address]
333
+ addresses: [address],
334
+ caipNetworkId: networkId
359
335
  });
360
336
  const fungibles = response?.fungibles || [];
361
337
  const allTokens = [...(state.tokens || []), ...(state.myTokensWithBalance || [])];
@@ -370,10 +346,13 @@ export const SwapController = {
370
346
 
371
347
  async getNetworkTokenPrice() {
372
348
  const { networkAddress } = this.getParams();
349
+ const [namespace, chain] = networkAddress.split(':');
350
+ const networkId: CaipNetworkId = `${namespace}:${chain}`;
373
351
 
374
352
  const response = await BlockchainApiController.fetchTokenPrice({
375
353
  projectId: OptionsController.state.projectId,
376
- addresses: [networkAddress]
354
+ addresses: [networkAddress],
355
+ caipNetworkId: networkId
377
356
  });
378
357
 
379
358
  const token = response?.fungibles?.[0];
@@ -409,24 +388,11 @@ export const SwapController = {
409
388
  },
410
389
 
411
390
  setBalances(balances: SwapTokenWithBalance[]) {
412
- const { networkAddress } = this.getParams();
413
- const caipNetwork = NetworkController.state.caipNetwork;
414
-
415
- if (!caipNetwork) {
416
- return;
417
- }
418
-
419
- const networkToken = balances.find(token => token.address === networkAddress);
391
+ state.myTokensWithBalance = balances;
420
392
 
421
393
  balances.forEach(token => {
422
394
  state.tokensPriceMap[token.address] = token.price || 0;
423
395
  });
424
-
425
- state.myTokensWithBalance = balances.filter(token => token.address?.startsWith(caipNetwork.id));
426
-
427
- state.networkBalanceInUSD = networkToken
428
- ? NumberUtil.multiply(networkToken.quantity.numeric, networkToken.price).toString()
429
- : '0';
430
396
  },
431
397
 
432
398
  setToToken(toToken: SwapTokenWithBalance | undefined) {
@@ -448,7 +414,7 @@ export const SwapController = {
448
414
  : '';
449
415
  },
450
416
 
451
- async setTokenPrice(address: string, target: SwapInputTarget) {
417
+ async setTokenPrice(address: CaipAddress, target: SwapInputTarget) {
452
418
  let price = state.tokensPriceMap[address] || 0;
453
419
 
454
420
  if (!price) {
@@ -473,12 +439,12 @@ export const SwapController = {
473
439
 
474
440
  // -- Swap ---------------------------------------------- //
475
441
  async swapTokens() {
476
- const address = AccountController.state.address as `${string}:${string}:${string}`;
442
+ const address = ConnectionsController.state.activeAddress;
477
443
  const sourceToken = state.sourceToken;
478
444
  const toToken = state.toToken;
479
445
  const haveSourceTokenAmount = NumberUtil.bigNumber(state.sourceTokenAmount).isGreaterThan(0);
480
446
 
481
- if (!toToken || !sourceToken || state.loadingPrices || !haveSourceTokenAmount) {
447
+ if (!toToken || !sourceToken || state.loadingPrices || !haveSourceTokenAmount || !address) {
482
448
  return;
483
449
  }
484
450
 
@@ -488,39 +454,45 @@ export const SwapController = {
488
454
  .multipliedBy(10 ** sourceToken.decimals)
489
455
  .integerValue();
490
456
 
491
- const quoteResponse = await BlockchainApiController.fetchSwapQuote({
492
- userAddress: address,
493
- projectId: OptionsController.state.projectId,
494
- from: sourceToken.address,
495
- to: toToken.address,
496
- gasPrice: state.gasFee,
497
- amount: amountDecimal.toString()
498
- });
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
+ });
499
466
 
500
- state.loadingQuote = false;
467
+ const quoteToAmount = quoteResponse?.quotes?.[0]?.toAmount;
501
468
 
502
- const quoteToAmount = quoteResponse?.quotes?.[0]?.toAmount;
469
+ if (!quoteToAmount) {
470
+ state.loadingQuote = false;
503
471
 
504
- if (!quoteToAmount) {
505
- return;
506
- }
472
+ return;
473
+ }
507
474
 
508
- const toTokenAmount = NumberUtil.bigNumber(quoteToAmount)
509
- .dividedBy(10 ** toToken.decimals)
510
- .toString();
475
+ const toTokenAmount = NumberUtil.bigNumber(quoteToAmount)
476
+ .dividedBy(10 ** toToken.decimals)
477
+ .toString();
511
478
 
512
- this.setToTokenAmount(toTokenAmount);
479
+ this.setToTokenAmount(toTokenAmount);
513
480
 
514
- const isInsufficientToken = this.hasInsufficientToken(
515
- state.sourceTokenAmount,
516
- sourceToken.address
517
- );
481
+ const isInsufficientToken = this.hasInsufficientToken(
482
+ state.sourceTokenAmount,
483
+ sourceToken.address
484
+ );
518
485
 
519
- if (isInsufficientToken) {
520
- state.inputError = 'Insufficient balance';
521
- } else {
522
- state.inputError = undefined;
523
- 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;
524
496
  }
525
497
  },
526
498
 
@@ -589,7 +561,7 @@ export const SwapController = {
589
561
  if (!response) {
590
562
  throw new Error('createAllowanceTransaction - No response from generateApproveCalldata');
591
563
  }
592
- const gasLimit = await ConnectionController.estimateGas({
564
+ const gasLimit = await ConnectionsController.estimateGas({
593
565
  address: fromAddress as `0x${string}`,
594
566
  to: CoreHelperUtil.getPlainAddress(response.tx.to) as `0x${string}`,
595
567
  data: response.tx.data
@@ -642,7 +614,7 @@ export const SwapController = {
642
614
  return undefined;
643
615
  }
644
616
 
645
- const amount = ConnectionController.parseUnits(
617
+ const amount = ConnectionsController.parseUnits(
646
618
  sourceTokenAmount,
647
619
  sourceToken.decimals
648
620
  )?.toString();
@@ -692,42 +664,32 @@ export const SwapController = {
692
664
  },
693
665
 
694
666
  async sendTransactionForApproval(data: TransactionParams) {
695
- const { fromAddress, isAuthConnector } = this.getParams();
696
-
667
+ const { fromAddress, network } = this.getParams();
697
668
  state.loadingApprovalTransaction = true;
698
- const approveLimitMessage = `Approve limit increase in your wallet`;
699
-
700
- if (isAuthConnector) {
701
- RouterController.pushTransactionStack({
702
- view: null,
703
- goBack: true,
704
- onSuccess() {
705
- SnackController.showLoading(approveLimitMessage);
706
- }
707
- });
708
- } else {
709
- SnackController.showLoading(approveLimitMessage);
710
- }
669
+
670
+ SnackController.showLoading('Approve limit increase in your wallet');
711
671
 
712
672
  try {
713
- await ConnectionController.sendTransaction({
673
+ await ConnectionsController.sendTransaction({
714
674
  address: fromAddress as `0x${string}`,
715
675
  to: data.to as `0x${string}`,
716
676
  data: data.data as `0x${string}`,
717
677
  value: BigInt(data.value),
718
678
  gasPrice: BigInt(data.gasPrice),
719
- chainNamespace: 'eip155'
679
+ chainNamespace: ConnectionsController.state.activeNamespace,
680
+ network
720
681
  });
721
682
 
722
683
  await this.swapTokens();
723
684
  await this.getTransaction();
724
685
  state.approvalTransaction = undefined;
725
- state.loadingApprovalTransaction = false;
726
686
  } catch (err) {
727
687
  const error = err as TransactionError;
728
688
  state.transactionError = error?.shortMessage as unknown as string;
729
- state.loadingApprovalTransaction = false;
689
+
730
690
  SnackController.showError(error?.shortMessage ?? 'Transaction error');
691
+ } finally {
692
+ state.loadingApprovalTransaction = false;
731
693
  }
732
694
  },
733
695
 
@@ -735,68 +697,53 @@ export const SwapController = {
735
697
  if (!data) {
736
698
  return undefined;
737
699
  }
738
-
739
- const { fromAddress, toTokenAmount, isAuthConnector } = this.getParams();
700
+ const { fromAddress, isAuthConnector, network } = this.getParams();
740
701
 
741
702
  state.loadingTransaction = true;
742
703
 
743
- const snackbarPendingMessage = `Swapping ${state.sourceToken
744
- ?.symbol} to ${NumberUtil.formatNumberToLocalString(toTokenAmount, 3)} ${state.toToken
745
- ?.symbol}`;
746
- const snackbarSuccessMessage = `Swapped ${state.sourceToken
747
- ?.symbol} to ${NumberUtil.formatNumberToLocalString(toTokenAmount, 3)} ${state.toToken
748
- ?.symbol}`;
749
-
750
- if (isAuthConnector) {
751
- RouterController.pushTransactionStack({
752
- view: 'Account',
753
- goBack: false,
754
- onSuccess() {
755
- SnackController.showLoading(snackbarPendingMessage);
756
- SwapController.resetState();
757
- }
758
- });
759
- } else {
760
- SnackController.showLoading('Confirm transaction in your wallet');
761
- }
704
+ const snackbarSuccessMessage = `Swapped ${state.sourceToken?.symbol} to ${state.toToken?.symbol}`;
705
+
706
+ SnackController.showLoading('Confirm transaction in your wallet');
762
707
 
763
708
  try {
764
- const forceUpdateAddresses = [state.sourceToken?.address, state.toToken?.address].join(',');
765
- 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({
766
714
  address: fromAddress as `0x${string}`,
767
715
  to: data.to as `0x${string}`,
768
716
  data: data.data as `0x${string}`,
769
717
  gas: data.gas,
770
718
  gasPrice: BigInt(data.gasPrice),
771
719
  value: data.value,
772
- chainNamespace: 'eip155'
720
+ chainNamespace: ConnectionsController.state.activeNamespace,
721
+ network
773
722
  });
774
723
 
775
724
  state.loadingTransaction = false;
776
- SnackController.showSuccess(snackbarSuccessMessage);
725
+
726
+ SnackController.showSuccess(snackbarSuccessMessage, true);
777
727
  EventsController.sendEvent({
778
728
  type: 'track',
779
729
  event: 'SWAP_SUCCESS',
780
730
  properties: {
781
- network: NetworkController.state.caipNetwork?.id || '',
731
+ network: ConnectionsController.state.activeNetwork?.caipNetworkId || '',
782
732
  swapFromToken: this.state.sourceToken?.symbol || '',
783
733
  swapToToken: this.state.toToken?.symbol || '',
784
734
  swapFromAmount: this.state.sourceTokenAmount || '',
785
735
  swapToAmount: this.state.toTokenAmount || '',
786
- isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount'
736
+ isSmartAccount: ConnectionsController.state.accountType === 'smartAccount'
787
737
  }
788
738
  });
789
- SwapController.resetState();
790
-
791
- if (!isAuthConnector) {
792
- RouterController.replace('AccountDefault');
793
- }
794
-
739
+ RouterController.replace(isAuthConnector ? 'Account' : 'AccountDefault');
740
+ SwapController.clearTokens();
795
741
  SwapController.getMyTokensWithBalance(forceUpdateAddresses);
796
- AccountController.fetchTokenBalance();
797
742
 
798
743
  setTimeout(() => {
799
- TransactionsController.fetchTransactions(AccountController.state.address, true);
744
+ if (ConnectionsController.state.activeAddress) {
745
+ TransactionsController.fetchTransactions(ConnectionsController.state.activeAddress, true);
746
+ }
800
747
  }, 5000);
801
748
 
802
749
  return transactionHash;
@@ -810,12 +757,12 @@ export const SwapController = {
810
757
  event: 'SWAP_ERROR',
811
758
  properties: {
812
759
  message: error?.shortMessage ?? error?.message ?? 'Unknown',
813
- network: NetworkController.state.caipNetwork?.id || '',
760
+ network: ConnectionsController.state.activeNetwork?.caipNetworkId || '',
814
761
  swapFromToken: this.state.sourceToken?.symbol || '',
815
762
  swapToToken: this.state.toToken?.symbol || '',
816
763
  swapFromAmount: this.state.sourceTokenAmount || '',
817
764
  swapToAmount: this.state.toTokenAmount || '',
818
- isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount'
765
+ isSmartAccount: ConnectionsController.state.accountType === 'smartAccount'
819
766
  }
820
767
  });
821
768
 
@@ -823,8 +770,45 @@ export const SwapController = {
823
770
  }
824
771
  },
825
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
+
826
804
  // -- Checks -------------------------------------------- //
827
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
+
828
812
  const isInsufficientSourceTokenForSwap = SwapCalculationUtil.isInsufficientSourceTokenForSwap(
829
813
  sourceTokenAmount,
830
814
  sourceTokenAddress,
@@ -832,12 +816,12 @@ export const SwapController = {
832
816
  );
833
817
 
834
818
  let insufficientNetworkTokenForGas = true;
835
- if (AccountController.state.preferredAccountType === 'smartAccount') {
819
+ if (ConnectionsController.state.accountType === 'smartAccount') {
836
820
  // Smart Accounts may pay gas in any ERC20 token
837
821
  insufficientNetworkTokenForGas = false;
838
822
  } else {
839
823
  insufficientNetworkTokenForGas = SwapCalculationUtil.isInsufficientNetworkTokenForGas(
840
- state.networkBalanceInUSD,
824
+ networkBalanceInUSD,
841
825
  state.gasPriceInUSD
842
826
  );
843
827
  }
@@ -1,10 +1,9 @@
1
- import type { Transaction } from '@reown/appkit-common-react-native';
2
- import { proxy, subscribe as sub } from 'valtio/vanilla';
1
+ import type { CaipAddress, Transaction } from '@reown/appkit-common-react-native';
2
+ import { proxy, subscribe as sub } from 'valtio';
3
3
  import { OptionsController } from './OptionsController';
4
4
  import { EventsController } from './EventsController';
5
5
  import { SnackController } from './SnackController';
6
6
  import { BlockchainApiController } from './BlockchainApiController';
7
- import { AccountController } from './AccountController';
8
7
  import { ConnectionsController } from './ConnectionsController';
9
8
 
10
9
  // -- Types --------------------------------------------- //
@@ -34,22 +33,29 @@ export const TransactionsController = {
34
33
  return sub(state, () => callback(state));
35
34
  },
36
35
 
37
- async fetchTransactions(accountAddress?: string, reset?: boolean) {
38
- const { projectId } = OptionsController.state;
36
+ async fetchTransactions(accountAddress: CaipAddress, reset?: boolean) {
37
+ try {
38
+ const { projectId } = OptionsController.state;
39
39
 
40
- if (!projectId || !accountAddress) {
41
- throw new Error("Transactions can't be fetched without a projectId and an accountAddress");
42
- }
40
+ if (!projectId || !accountAddress) {
41
+ throw new Error("Transactions can't be fetched without a projectId and an accountAddress");
42
+ }
43
43
 
44
- state.loading = true;
44
+ state.loading = true;
45
45
 
46
- if (reset) {
47
- state.next = undefined;
48
- }
46
+ if (reset) {
47
+ state.next = undefined;
48
+ }
49
+
50
+ const [namespace, chain, address] = accountAddress?.split(':') ?? [];
51
+
52
+ if (!namespace || !chain || !address) {
53
+ throw new Error('Invalid address');
54
+ }
49
55
 
50
- try {
51
56
  const response = await BlockchainApiController.fetchTransactions({
52
- account: accountAddress,
57
+ account: address,
58
+ chainId: `${namespace}:${chain}`,
53
59
  projectId,
54
60
  cursor: state.next
55
61
  });
@@ -72,10 +78,10 @@ export const TransactionsController = {
72
78
  type: 'track',
73
79
  event: 'ERROR_FETCH_TRANSACTIONS',
74
80
  properties: {
75
- address: accountAddress,
76
- projectId,
81
+ address: accountAddress ?? '',
82
+ projectId: OptionsController.state.projectId,
77
83
  cursor: state.next,
78
- isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount'
84
+ isSmartAccount: ConnectionsController.state.accountType === 'smartAccount'
79
85
  }
80
86
  });
81
87
  SnackController.showError('Failed to fetch transactions');
@@ -133,7 +139,7 @@ export const TransactionsController = {
133
139
  state.next = undefined;
134
140
  },
135
141
 
136
- resetTransactions() {
142
+ resetState() {
137
143
  state.transactions = [];
138
144
  state.loading = false;
139
145
  state.empty = false;