@reown/appkit-core-react-native 2.0.0-alpha.1 → 2.0.0-alpha.3

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 (228) hide show
  1. package/lib/commonjs/controllers/ApiController.js +16 -21
  2. package/lib/commonjs/controllers/ApiController.js.map +1 -1
  3. package/lib/commonjs/controllers/AssetController.js +0 -4
  4. package/lib/commonjs/controllers/AssetController.js.map +1 -1
  5. package/lib/commonjs/controllers/BlockchainApiController.js +102 -112
  6. package/lib/commonjs/controllers/BlockchainApiController.js.map +1 -1
  7. package/lib/commonjs/controllers/ConnectionsController.js +248 -51
  8. package/lib/commonjs/controllers/ConnectionsController.js.map +1 -1
  9. package/lib/commonjs/controllers/EnsController.js +4 -4
  10. package/lib/commonjs/controllers/EnsController.js.map +1 -1
  11. package/lib/commonjs/controllers/EventsController.js +4 -4
  12. package/lib/commonjs/controllers/EventsController.js.map +1 -1
  13. package/lib/commonjs/controllers/ModalController.js +6 -7
  14. package/lib/commonjs/controllers/ModalController.js.map +1 -1
  15. package/lib/commonjs/controllers/OnRampController.js +117 -53
  16. package/lib/commonjs/controllers/OnRampController.js.map +1 -1
  17. package/lib/commonjs/controllers/OptionsController.js +10 -4
  18. package/lib/commonjs/controllers/OptionsController.js.map +1 -1
  19. package/lib/commonjs/controllers/PublicStateController.js.map +1 -1
  20. package/lib/commonjs/controllers/RouterController.js +6 -21
  21. package/lib/commonjs/controllers/RouterController.js.map +1 -1
  22. package/lib/commonjs/controllers/SendController.js +100 -100
  23. package/lib/commonjs/controllers/SendController.js.map +1 -1
  24. package/lib/commonjs/controllers/SnackController.js +29 -5
  25. package/lib/commonjs/controllers/SnackController.js.map +1 -1
  26. package/lib/commonjs/controllers/SwapController.js +109 -117
  27. package/lib/commonjs/controllers/SwapController.js.map +1 -1
  28. package/lib/commonjs/controllers/ThemeController.js.map +1 -1
  29. package/lib/commonjs/controllers/TransactionsController.js +23 -19
  30. package/lib/commonjs/controllers/TransactionsController.js.map +1 -1
  31. package/lib/commonjs/controllers/WcController.js +73 -0
  32. package/lib/commonjs/controllers/WcController.js.map +1 -0
  33. package/lib/commonjs/index.js +3 -38
  34. package/lib/commonjs/index.js.map +1 -1
  35. package/lib/commonjs/package.json +1 -0
  36. package/lib/commonjs/utils/ApiUtil.js.map +1 -1
  37. package/lib/commonjs/utils/AssetUtil.js +6 -14
  38. package/lib/commonjs/utils/AssetUtil.js.map +1 -1
  39. package/lib/commonjs/utils/ConstantsUtil.js +13 -425
  40. package/lib/commonjs/utils/ConstantsUtil.js.map +1 -1
  41. package/lib/commonjs/utils/CoreHelperUtil.js +13 -8
  42. package/lib/commonjs/utils/CoreHelperUtil.js.map +1 -1
  43. package/lib/commonjs/utils/EventUtil.js.map +1 -1
  44. package/lib/commonjs/utils/FetchUtil.js +34 -10
  45. package/lib/commonjs/utils/FetchUtil.js.map +1 -1
  46. package/lib/commonjs/utils/RouterUtil.js.map +1 -1
  47. package/lib/commonjs/utils/StorageUtil.js +77 -129
  48. package/lib/commonjs/utils/StorageUtil.js.map +1 -1
  49. package/lib/commonjs/utils/SwapApiUtil.js +2 -17
  50. package/lib/commonjs/utils/SwapApiUtil.js.map +1 -1
  51. package/lib/commonjs/utils/SwapCalculationUtil.js.map +1 -1
  52. package/lib/module/controllers/ApiController.js +17 -21
  53. package/lib/module/controllers/ApiController.js.map +1 -1
  54. package/lib/module/controllers/AssetController.js +2 -4
  55. package/lib/module/controllers/AssetController.js.map +1 -1
  56. package/lib/module/controllers/BlockchainApiController.js +103 -111
  57. package/lib/module/controllers/BlockchainApiController.js.map +1 -1
  58. package/lib/module/controllers/ConnectionsController.js +250 -51
  59. package/lib/module/controllers/ConnectionsController.js.map +1 -1
  60. package/lib/module/controllers/EnsController.js +4 -2
  61. package/lib/module/controllers/EnsController.js.map +1 -1
  62. package/lib/module/controllers/EventsController.js +3 -1
  63. package/lib/module/controllers/EventsController.js.map +1 -1
  64. package/lib/module/controllers/ModalController.js +8 -7
  65. package/lib/module/controllers/ModalController.js.map +1 -1
  66. package/lib/module/controllers/OnRampController.js +118 -52
  67. package/lib/module/controllers/OnRampController.js.map +1 -1
  68. package/lib/module/controllers/OptionsController.js +12 -4
  69. package/lib/module/controllers/OptionsController.js.map +1 -1
  70. package/lib/module/controllers/PublicStateController.js +2 -0
  71. package/lib/module/controllers/PublicStateController.js.map +1 -1
  72. package/lib/module/controllers/RouterController.js +8 -21
  73. package/lib/module/controllers/RouterController.js.map +1 -1
  74. package/lib/module/controllers/SendController.js +99 -97
  75. package/lib/module/controllers/SendController.js.map +1 -1
  76. package/lib/module/controllers/SnackController.js +31 -5
  77. package/lib/module/controllers/SnackController.js.map +1 -1
  78. package/lib/module/controllers/SwapController.js +111 -117
  79. package/lib/module/controllers/SwapController.js.map +1 -1
  80. package/lib/module/controllers/ThemeController.js +2 -0
  81. package/lib/module/controllers/ThemeController.js.map +1 -1
  82. package/lib/module/controllers/TransactionsController.js +23 -17
  83. package/lib/module/controllers/TransactionsController.js.map +1 -1
  84. package/lib/module/controllers/WcController.js +70 -0
  85. package/lib/module/controllers/WcController.js.map +1 -0
  86. package/lib/module/index.js +5 -6
  87. package/lib/module/index.js.map +1 -1
  88. package/lib/module/utils/ApiUtil.js +2 -0
  89. package/lib/module/utils/ApiUtil.js.map +1 -1
  90. package/lib/module/utils/AssetUtil.js +8 -14
  91. package/lib/module/utils/AssetUtil.js.map +1 -1
  92. package/lib/module/utils/ConstantsUtil.js +15 -425
  93. package/lib/module/utils/ConstantsUtil.js.map +1 -1
  94. package/lib/module/utils/CoreHelperUtil.js +15 -6
  95. package/lib/module/utils/CoreHelperUtil.js.map +1 -1
  96. package/lib/module/utils/EventUtil.js +2 -0
  97. package/lib/module/utils/EventUtil.js.map +1 -1
  98. package/lib/module/utils/FetchUtil.js +36 -10
  99. package/lib/module/utils/FetchUtil.js.map +1 -1
  100. package/lib/module/utils/RouterUtil.js +2 -0
  101. package/lib/module/utils/RouterUtil.js.map +1 -1
  102. package/lib/module/utils/StorageUtil.js +80 -129
  103. package/lib/module/utils/StorageUtil.js.map +1 -1
  104. package/lib/module/utils/SwapApiUtil.js +4 -17
  105. package/lib/module/utils/SwapApiUtil.js.map +1 -1
  106. package/lib/module/utils/SwapCalculationUtil.js +3 -0
  107. package/lib/module/utils/SwapCalculationUtil.js.map +1 -1
  108. package/lib/typescript/controllers/ApiController.d.ts +3 -4
  109. package/lib/typescript/controllers/ApiController.d.ts.map +1 -1
  110. package/lib/typescript/controllers/AssetController.d.ts +0 -2
  111. package/lib/typescript/controllers/AssetController.d.ts.map +1 -1
  112. package/lib/typescript/controllers/BlockchainApiController.d.ts +21 -13
  113. package/lib/typescript/controllers/BlockchainApiController.d.ts.map +1 -1
  114. package/lib/typescript/controllers/ConnectionsController.d.ts +19 -17
  115. package/lib/typescript/controllers/ConnectionsController.d.ts.map +1 -1
  116. package/lib/typescript/controllers/EnsController.d.ts +1 -1
  117. package/lib/typescript/controllers/EventsController.d.ts +1 -1
  118. package/lib/typescript/controllers/EventsController.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 +4 -3
  122. package/lib/typescript/controllers/OnRampController.d.ts.map +1 -1
  123. package/lib/typescript/controllers/OptionsController.d.ts +4 -4
  124. package/lib/typescript/controllers/OptionsController.d.ts.map +1 -1
  125. package/lib/typescript/controllers/RouterController.d.ts +5 -20
  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 +11 -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/controllers/WcController.d.ts +27 -0
  136. package/lib/typescript/controllers/WcController.d.ts.map +1 -0
  137. package/lib/typescript/index.d.ts +1 -7
  138. package/lib/typescript/index.d.ts.map +1 -1
  139. package/lib/typescript/utils/AssetUtil.d.ts +2 -3
  140. package/lib/typescript/utils/AssetUtil.d.ts.map +1 -1
  141. package/lib/typescript/utils/ConstantsUtil.d.ts +7 -415
  142. package/lib/typescript/utils/ConstantsUtil.d.ts.map +1 -1
  143. package/lib/typescript/utils/CoreHelperUtil.d.ts +4 -4
  144. package/lib/typescript/utils/CoreHelperUtil.d.ts.map +1 -1
  145. package/lib/typescript/utils/EventUtil.d.ts +1 -1
  146. package/lib/typescript/utils/EventUtil.d.ts.map +1 -1
  147. package/lib/typescript/utils/FetchUtil.d.ts +1 -1
  148. package/lib/typescript/utils/FetchUtil.d.ts.map +1 -1
  149. package/lib/typescript/utils/StorageUtil.d.ts +8 -19
  150. package/lib/typescript/utils/StorageUtil.d.ts.map +1 -1
  151. package/lib/typescript/utils/SwapApiUtil.d.ts +3 -4
  152. package/lib/typescript/utils/SwapApiUtil.d.ts.map +1 -1
  153. package/lib/typescript/utils/SwapCalculationUtil.d.ts +1 -1
  154. package/lib/typescript/utils/SwapCalculationUtil.d.ts.map +1 -1
  155. package/package.json +9 -23
  156. package/src/controllers/ApiController.ts +24 -28
  157. package/src/controllers/AssetController.ts +0 -6
  158. package/src/controllers/BlockchainApiController.ts +76 -121
  159. package/src/controllers/ConnectionsController.ts +308 -78
  160. package/src/controllers/EnsController.ts +3 -3
  161. package/src/controllers/EventsController.ts +2 -2
  162. package/src/controllers/ModalController.ts +7 -9
  163. package/src/controllers/OnRampController.ts +179 -82
  164. package/src/controllers/OptionsController.ts +24 -8
  165. package/src/controllers/RouterController.ts +12 -54
  166. package/src/controllers/SendController.ts +123 -112
  167. package/src/controllers/SnackController.ts +31 -5
  168. package/src/controllers/SwapController.ts +130 -146
  169. package/src/controllers/TransactionsController.ts +24 -18
  170. package/src/controllers/WcController.ts +93 -0
  171. package/src/index.ts +2 -21
  172. package/src/utils/AssetUtil.ts +7 -17
  173. package/src/utils/ConstantsUtil.ts +15 -429
  174. package/src/utils/CoreHelperUtil.ts +31 -8
  175. package/src/utils/EventUtil.ts +1 -1
  176. package/src/utils/FetchUtil.ts +38 -11
  177. package/src/utils/StorageUtil.ts +146 -157
  178. package/src/utils/SwapApiUtil.ts +18 -37
  179. package/src/utils/SwapCalculationUtil.ts +1 -2
  180. package/lib/commonjs/controllers/AccountController.js +0 -93
  181. package/lib/commonjs/controllers/AccountController.js.map +0 -1
  182. package/lib/commonjs/controllers/ConnectionController.js +0 -132
  183. package/lib/commonjs/controllers/ConnectionController.js.map +0 -1
  184. package/lib/commonjs/controllers/ConnectorController.js +0 -50
  185. package/lib/commonjs/controllers/ConnectorController.js.map +0 -1
  186. package/lib/commonjs/controllers/NetworkController.js +0 -90
  187. package/lib/commonjs/controllers/NetworkController.js.map +0 -1
  188. package/lib/commonjs/controllers/WebviewController.js +0 -52
  189. package/lib/commonjs/controllers/WebviewController.js.map +0 -1
  190. package/lib/commonjs/utils/NetworkUtil.js +0 -46
  191. package/lib/commonjs/utils/NetworkUtil.js.map +0 -1
  192. package/lib/commonjs/utils/TypeUtil.js +0 -6
  193. package/lib/commonjs/utils/TypeUtil.js.map +0 -1
  194. package/lib/module/controllers/AccountController.js +0 -88
  195. package/lib/module/controllers/AccountController.js.map +0 -1
  196. package/lib/module/controllers/ConnectionController.js +0 -127
  197. package/lib/module/controllers/ConnectionController.js.map +0 -1
  198. package/lib/module/controllers/ConnectorController.js +0 -45
  199. package/lib/module/controllers/ConnectorController.js.map +0 -1
  200. package/lib/module/controllers/NetworkController.js +0 -85
  201. package/lib/module/controllers/NetworkController.js.map +0 -1
  202. package/lib/module/controllers/WebviewController.js +0 -47
  203. package/lib/module/controllers/WebviewController.js.map +0 -1
  204. package/lib/module/utils/NetworkUtil.js +0 -40
  205. package/lib/module/utils/NetworkUtil.js.map +0 -1
  206. package/lib/module/utils/TypeUtil.js +0 -2
  207. package/lib/module/utils/TypeUtil.js.map +0 -1
  208. package/lib/typescript/controllers/AccountController.d.ts +0 -33
  209. package/lib/typescript/controllers/AccountController.d.ts.map +0 -1
  210. package/lib/typescript/controllers/ConnectionController.d.ts +0 -68
  211. package/lib/typescript/controllers/ConnectionController.d.ts.map +0 -1
  212. package/lib/typescript/controllers/ConnectorController.d.ts +0 -18
  213. package/lib/typescript/controllers/ConnectorController.d.ts.map +0 -1
  214. package/lib/typescript/controllers/NetworkController.d.ts +0 -34
  215. package/lib/typescript/controllers/NetworkController.d.ts.map +0 -1
  216. package/lib/typescript/controllers/WebviewController.d.ts +0 -21
  217. package/lib/typescript/controllers/WebviewController.d.ts.map +0 -1
  218. package/lib/typescript/utils/NetworkUtil.d.ts +0 -8
  219. package/lib/typescript/utils/NetworkUtil.d.ts.map +0 -1
  220. package/lib/typescript/utils/TypeUtil.d.ts +0 -817
  221. package/lib/typescript/utils/TypeUtil.d.ts.map +0 -1
  222. package/src/controllers/AccountController.ts +0 -128
  223. package/src/controllers/ConnectionController.ts +0 -208
  224. package/src/controllers/ConnectorController.ts +0 -64
  225. package/src/controllers/NetworkController.ts +0 -120
  226. package/src/controllers/WebviewController.ts +0 -63
  227. package/src/utils/NetworkUtil.ts +0 -33
  228. package/src/utils/TypeUtil.ts +0 -995
@@ -1,6 +1,12 @@
1
1
  import { subscribeKey as subKey } from 'valtio/utils';
2
2
  import { proxy, subscribe as sub } from 'valtio';
3
- import { NumberUtil, type CaipAddress } from '@reown/appkit-common-react-native';
3
+ import {
4
+ NumberUtil,
5
+ type CaipAddress,
6
+ type CaipNetworkId,
7
+ type SwapInputTarget,
8
+ type SwapTokenWithBalance
9
+ } from '@reown/appkit-common-react-native';
4
10
 
5
11
  import { ConstantsUtil } from '../utils/ConstantsUtil';
6
12
  import { SwapApiUtil } from '../utils/SwapApiUtil';
@@ -9,9 +15,6 @@ import { OptionsController } from './OptionsController';
9
15
  import { SwapCalculationUtil } from '../utils/SwapCalculationUtil';
10
16
  import { SnackController } from './SnackController';
11
17
  import { RouterController } from './RouterController';
12
- import type { SwapInputTarget, SwapTokenWithBalance } from '../utils/TypeUtil';
13
- import { ConnectorController } from './ConnectorController';
14
- import { AccountController } from './AccountController';
15
18
  import { CoreHelperUtil } from '../utils/CoreHelperUtil';
16
19
  import { TransactionsController } from './TransactionsController';
17
20
  import { EventsController } from './EventsController';
@@ -43,8 +46,7 @@ class TransactionError extends Error {
43
46
 
44
47
  export interface SwapControllerState {
45
48
  // Loading states
46
- initializing: boolean;
47
- initialized: boolean;
49
+ loadingTokens: boolean;
48
50
  loadingPrices: boolean;
49
51
  loadingQuote?: boolean;
50
52
  loadingApprovalTransaction?: boolean;
@@ -67,7 +69,6 @@ export interface SwapControllerState {
67
69
  toTokenAmount: string;
68
70
  toTokenPriceInUSD: number;
69
71
  networkPrice: string;
70
- networkBalanceInUSD: string;
71
72
  networkTokenSymbol: string;
72
73
  inputError: string | undefined;
73
74
 
@@ -95,8 +96,7 @@ type StateKey = keyof SwapControllerState;
95
96
  // -- State --------------------------------------------- //
96
97
  const initialState: SwapControllerState = {
97
98
  // Loading states
98
- initializing: false,
99
- initialized: false,
99
+ loadingTokens: false,
100
100
  loadingPrices: false,
101
101
  loadingQuote: false,
102
102
  loadingApprovalTransaction: false,
@@ -119,7 +119,6 @@ const initialState: SwapControllerState = {
119
119
  toTokenAmount: '',
120
120
  toTokenPriceInUSD: 0,
121
121
  networkPrice: '0',
122
- networkBalanceInUSD: '0',
123
122
  networkTokenSymbol: '',
124
123
  inputError: undefined,
125
124
 
@@ -142,7 +141,7 @@ const initialState: SwapControllerState = {
142
141
  providerFee: undefined
143
142
  };
144
143
 
145
- const state = proxy<SwapControllerState>(initialState);
144
+ const state = proxy<SwapControllerState>({ ...initialState });
146
145
 
147
146
  // -- Controller ---------------------------------------- //
148
147
  export const SwapController = {
@@ -157,7 +156,8 @@ export const SwapController = {
157
156
  },
158
157
 
159
158
  getParams() {
160
- const { activeAddress, activeNamespace, activeNetwork } = ConnectionsController.state;
159
+ const { activeAddress, activeNamespace, activeNetwork, connection } =
160
+ ConnectionsController.state;
161
161
  const address = CoreHelperUtil.getPlainAddress(activeAddress);
162
162
 
163
163
  if (!activeNamespace || !activeNetwork) {
@@ -166,8 +166,6 @@ export const SwapController = {
166
166
 
167
167
  const networkAddress: CaipAddress = `${activeNetwork.caipNetworkId}:${ConstantsUtil.NATIVE_TOKEN_ADDRESS[activeNamespace]}`;
168
168
 
169
- const type = ConnectorController.state.connectedConnector;
170
-
171
169
  if (!address) {
172
170
  throw new Error('No address found to swap the tokens from.');
173
171
  }
@@ -182,6 +180,7 @@ export const SwapController = {
182
180
 
183
181
  return {
184
182
  networkAddress,
183
+ network: activeNetwork,
185
184
  fromAddress: address,
186
185
  fromCaipAddress: activeAddress,
187
186
  sourceTokenAddress: state.sourceToken?.address,
@@ -195,12 +194,12 @@ export const SwapController = {
195
194
  invalidSourceTokenAmount,
196
195
  availableToSwap:
197
196
  activeAddress && !invalidToToken && !invalidSourceToken && !invalidSourceTokenAmount,
198
- isAuthConnector: type === 'AUTH'
197
+ isAuthConnector: !!connection?.properties?.provider
199
198
  };
200
199
  },
201
200
 
202
201
  switchTokens() {
203
- if (state.initializing || !state.initialized) {
202
+ if (state.loadingTokens) {
204
203
  return;
205
204
  }
206
205
 
@@ -225,41 +224,36 @@ export const SwapController = {
225
224
  this.swapTokens();
226
225
  },
227
226
 
228
- resetState() {
229
- state.myTokensWithBalance = initialState.myTokensWithBalance;
230
- state.tokensPriceMap = initialState.tokensPriceMap;
231
- state.initialized = initialState.initialized;
232
- state.sourceToken = initialState.sourceToken;
233
- state.sourceTokenAmount = initialState.sourceTokenAmount;
234
- state.sourceTokenPriceInUSD = initialState.sourceTokenPriceInUSD;
235
- state.toToken = initialState.toToken;
236
- state.toTokenAmount = initialState.toTokenAmount;
237
- state.toTokenPriceInUSD = initialState.toTokenPriceInUSD;
238
- state.networkPrice = initialState.networkPrice;
239
- state.networkTokenSymbol = initialState.networkTokenSymbol;
240
- state.networkBalanceInUSD = initialState.networkBalanceInUSD;
241
- state.inputError = initialState.inputError;
242
- },
243
-
244
227
  async fetchTokens() {
245
- const { networkAddress } = this.getParams();
228
+ try {
229
+ const { networkAddress } = this.getParams();
246
230
 
247
- await this.getTokenList();
248
- await this.getNetworkTokenPrice();
249
- await this.getMyTokensWithBalance();
231
+ state.loadingTokens = true;
232
+ await this.getTokenList();
233
+ await this.getNetworkTokenPrice();
234
+ await this.getMyTokensWithBalance();
250
235
 
251
- const networkToken = state.tokens?.find(token => token.address === networkAddress);
236
+ const networkToken = state.tokens?.find(token => token.address === networkAddress);
252
237
 
253
- if (networkToken) {
254
- state.networkTokenSymbol = networkToken.symbol;
255
- }
238
+ if (networkToken) {
239
+ state.networkTokenSymbol = networkToken.symbol;
240
+ }
256
241
 
257
- const sourceToken =
258
- state.myTokensWithBalance?.find(token => token.address.startsWith(networkAddress)) ||
259
- state.myTokensWithBalance?.[0];
242
+ // Set default source token if not set
243
+ if (!state.sourceToken && state.myTokensWithBalance?.length) {
244
+ const sourceToken =
245
+ state.myTokensWithBalance?.find(token => token.address.startsWith(networkAddress)) ||
246
+ state.myTokensWithBalance?.[0];
260
247
 
261
- this.setSourceToken(sourceToken);
262
- this.setSourceTokenAmount('1');
248
+ this.setSourceToken(sourceToken);
249
+ this.setSourceTokenAmount('1');
250
+ }
251
+ } catch (error) {
252
+ SnackController.showError('Failed to initialize swap');
253
+ RouterController.goBack();
254
+ } finally {
255
+ state.loadingTokens = false;
256
+ }
263
257
  },
264
258
 
265
259
  async getTokenList() {
@@ -285,20 +279,23 @@ export const SwapController = {
285
279
  }, {});
286
280
  },
287
281
 
288
- async getMyTokensWithBalance(forceUpdate?: string) {
289
- const balances = await SwapApiUtil.getMyTokensWithBalance(forceUpdate);
290
- if (!balances) {
282
+ async getMyTokensWithBalance(forceUpdate?: CaipAddress[]) {
283
+ await ConnectionsController.fetchBalance(forceUpdate);
284
+ const swapBalances = SwapApiUtil.mapBalancesToSwapTokens(ConnectionsController.state.balances);
285
+ if (!swapBalances) {
291
286
  return;
292
287
  }
293
288
 
294
289
  await this.getInitialGasPrice();
295
- this.setBalances(balances);
290
+ this.setBalances(swapBalances);
296
291
  },
297
292
 
298
- getFilteredPopularTokens() {
299
- return state.popularTokens?.filter(
300
- token => !state.myTokensWithBalance?.some(t => t.address === token.address)
301
- );
293
+ getFilteredPopularTokens(balances?: SwapTokenWithBalance[]) {
294
+ if (!balances) {
295
+ return state.popularTokens;
296
+ }
297
+
298
+ return state.popularTokens?.filter(token => !balances.some(t => t.address === token.address));
302
299
  },
303
300
 
304
301
  setSourceToken(sourceToken: SwapTokenWithBalance | undefined) {
@@ -322,26 +319,10 @@ export const SwapController = {
322
319
  }
323
320
  },
324
321
 
325
- async initializeState() {
326
- if (state.initializing) {
327
- return;
328
- }
329
-
330
- state.initializing = true;
331
- if (!state.initialized) {
332
- try {
333
- await this.fetchTokens();
334
- state.initialized = true;
335
- } catch (error) {
336
- state.initialized = false;
337
- SnackController.showError('Failed to initialize swap');
338
- RouterController.goBack();
339
- }
340
- }
341
- state.initializing = false;
342
- },
322
+ async getAddressPrice(address: CaipAddress) {
323
+ const [namespace, chain] = address.split(':');
324
+ const networkId: CaipNetworkId = `${namespace}:${chain}`;
343
325
 
344
- async getAddressPrice(address: string) {
345
326
  const existPrice = state.tokensPriceMap[address];
346
327
 
347
328
  if (existPrice) {
@@ -350,7 +331,8 @@ export const SwapController = {
350
331
 
351
332
  const response = await BlockchainApiController.fetchTokenPrice({
352
333
  projectId: OptionsController.state.projectId,
353
- addresses: [address]
334
+ addresses: [address],
335
+ caipNetworkId: networkId
354
336
  });
355
337
  const fungibles = response?.fungibles || [];
356
338
  const allTokens = [...(state.tokens || []), ...(state.myTokensWithBalance || [])];
@@ -365,10 +347,13 @@ export const SwapController = {
365
347
 
366
348
  async getNetworkTokenPrice() {
367
349
  const { networkAddress } = this.getParams();
350
+ const [namespace, chain] = networkAddress.split(':');
351
+ const networkId: CaipNetworkId = `${namespace}:${chain}`;
368
352
 
369
353
  const response = await BlockchainApiController.fetchTokenPrice({
370
354
  projectId: OptionsController.state.projectId,
371
- addresses: [networkAddress]
355
+ addresses: [networkAddress],
356
+ caipNetworkId: networkId
372
357
  });
373
358
 
374
359
  const token = response?.fungibles?.[0];
@@ -404,26 +389,11 @@ export const SwapController = {
404
389
  },
405
390
 
406
391
  setBalances(balances: SwapTokenWithBalance[]) {
407
- const { networkAddress } = this.getParams();
408
- const caipNetwork = ConnectionsController.state.activeNetwork;
409
-
410
- if (!caipNetwork) {
411
- return;
412
- }
413
-
414
- const networkToken = balances.find(token => token.address === networkAddress);
392
+ state.myTokensWithBalance = balances;
415
393
 
416
394
  balances.forEach(token => {
417
395
  state.tokensPriceMap[token.address] = token.price || 0;
418
396
  });
419
-
420
- state.myTokensWithBalance = balances.filter(
421
- token => token.address?.startsWith(caipNetwork.caipNetworkId)
422
- );
423
-
424
- state.networkBalanceInUSD = networkToken
425
- ? NumberUtil.multiply(networkToken.quantity.numeric, networkToken.price).toString()
426
- : '0';
427
397
  },
428
398
 
429
399
  setToToken(toToken: SwapTokenWithBalance | undefined) {
@@ -445,7 +415,7 @@ export const SwapController = {
445
415
  : '';
446
416
  },
447
417
 
448
- async setTokenPrice(address: string, target: SwapInputTarget) {
418
+ async setTokenPrice(address: CaipAddress, target: SwapInputTarget) {
449
419
  let price = state.tokensPriceMap[address] || 0;
450
420
 
451
421
  if (!price) {
@@ -495,11 +465,11 @@ export const SwapController = {
495
465
  amount: amountDecimal.toString()
496
466
  });
497
467
 
498
- state.loadingQuote = false;
499
-
500
468
  const quoteToAmount = quoteResponse?.quotes?.[0]?.toAmount;
501
469
 
502
470
  if (!quoteToAmount) {
471
+ state.loadingQuote = false;
472
+
503
473
  return;
504
474
  }
505
475
 
@@ -522,6 +492,7 @@ export const SwapController = {
522
492
  }
523
493
  } catch (error) {
524
494
  SnackController.showError('Failed to get swap quote');
495
+ } finally {
525
496
  state.loadingQuote = false;
526
497
  }
527
498
  },
@@ -694,22 +665,10 @@ export const SwapController = {
694
665
  },
695
666
 
696
667
  async sendTransactionForApproval(data: TransactionParams) {
697
- const { fromAddress, isAuthConnector } = this.getParams();
698
-
668
+ const { fromAddress, network } = this.getParams();
699
669
  state.loadingApprovalTransaction = true;
700
- const approveLimitMessage = `Approve limit increase in your wallet`;
701
-
702
- if (isAuthConnector) {
703
- RouterController.pushTransactionStack({
704
- view: null,
705
- goBack: true,
706
- onSuccess() {
707
- SnackController.showLoading(approveLimitMessage);
708
- }
709
- });
710
- } else {
711
- SnackController.showLoading(approveLimitMessage);
712
- }
670
+
671
+ SnackController.showLoading('Approve limit increase in your wallet');
713
672
 
714
673
  try {
715
674
  await ConnectionsController.sendTransaction({
@@ -718,18 +677,20 @@ export const SwapController = {
718
677
  data: data.data as `0x${string}`,
719
678
  value: BigInt(data.value),
720
679
  gasPrice: BigInt(data.gasPrice),
721
- chainNamespace: ConnectionsController.state.activeNamespace
680
+ chainNamespace: ConnectionsController.state.activeNamespace,
681
+ network
722
682
  });
723
683
 
724
684
  await this.swapTokens();
725
685
  await this.getTransaction();
726
686
  state.approvalTransaction = undefined;
727
- state.loadingApprovalTransaction = false;
728
687
  } catch (err) {
729
688
  const error = err as TransactionError;
730
689
  state.transactionError = error?.shortMessage as unknown as string;
731
- state.loadingApprovalTransaction = false;
690
+
732
691
  SnackController.showError(error?.shortMessage ?? 'Transaction error');
692
+ } finally {
693
+ state.loadingApprovalTransaction = false;
733
694
  }
734
695
  },
735
696
 
@@ -737,32 +698,19 @@ export const SwapController = {
737
698
  if (!data) {
738
699
  return undefined;
739
700
  }
740
- const { fromAddress, toTokenAmount, isAuthConnector } = this.getParams();
701
+ const { fromAddress, isAuthConnector, network } = this.getParams();
741
702
 
742
703
  state.loadingTransaction = true;
743
704
 
744
- const snackbarPendingMessage = `Swapping ${state.sourceToken
745
- ?.symbol} to ${NumberUtil.formatNumberToLocalString(toTokenAmount, 3)} ${state.toToken
746
- ?.symbol}`;
747
- const snackbarSuccessMessage = `Swapped ${state.sourceToken
748
- ?.symbol} to ${NumberUtil.formatNumberToLocalString(toTokenAmount, 3)} ${state.toToken
749
- ?.symbol}`;
750
-
751
- if (isAuthConnector) {
752
- RouterController.pushTransactionStack({
753
- view: 'Account',
754
- goBack: false,
755
- onSuccess() {
756
- SnackController.showLoading(snackbarPendingMessage);
757
- SwapController.resetState();
758
- }
759
- });
760
- } else {
761
- SnackController.showLoading('Confirm transaction in your wallet');
762
- }
705
+ const snackbarSuccessMessage = `Swapped ${state.sourceToken?.symbol} to ${state.toToken?.symbol}`;
706
+
707
+ SnackController.showLoading('Confirm transaction in your wallet');
763
708
 
764
709
  try {
765
- const forceUpdateAddresses = [state.sourceToken?.address, state.toToken?.address].join(',');
710
+ const forceUpdateAddresses = [state.sourceToken?.address, state.toToken?.address].filter(
711
+ Boolean
712
+ ) as CaipAddress[];
713
+
766
714
  const transactionHash = await ConnectionsController.sendTransaction({
767
715
  address: fromAddress as `0x${string}`,
768
716
  to: data.to as `0x${string}`,
@@ -770,11 +718,13 @@ export const SwapController = {
770
718
  gas: data.gas,
771
719
  gasPrice: BigInt(data.gasPrice),
772
720
  value: data.value,
773
- chainNamespace: ConnectionsController.state.activeNamespace
721
+ chainNamespace: ConnectionsController.state.activeNamespace,
722
+ network
774
723
  });
775
724
 
776
725
  state.loadingTransaction = false;
777
- SnackController.showSuccess(snackbarSuccessMessage);
726
+
727
+ SnackController.showSuccess(snackbarSuccessMessage, true);
778
728
  EventsController.sendEvent({
779
729
  type: 'track',
780
730
  event: 'SWAP_SUCCESS',
@@ -784,20 +734,17 @@ export const SwapController = {
784
734
  swapToToken: this.state.toToken?.symbol || '',
785
735
  swapFromAmount: this.state.sourceTokenAmount || '',
786
736
  swapToAmount: this.state.toTokenAmount || '',
787
- isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount'
737
+ isSmartAccount: ConnectionsController.state.accountType === 'smartAccount'
788
738
  }
789
739
  });
790
- SwapController.resetState();
791
-
792
- if (!isAuthConnector) {
793
- RouterController.replace('AccountDefault');
794
- }
795
-
740
+ RouterController.replace(isAuthConnector ? 'Account' : 'AccountDefault');
741
+ SwapController.clearTokens();
796
742
  SwapController.getMyTokensWithBalance(forceUpdateAddresses);
797
- AccountController.fetchTokenBalance();
798
743
 
799
744
  setTimeout(() => {
800
- TransactionsController.fetchTransactions(AccountController.state.address, true);
745
+ if (ConnectionsController.state.activeAddress) {
746
+ TransactionsController.fetchTransactions(ConnectionsController.state.activeAddress, true);
747
+ }
801
748
  }, 5000);
802
749
 
803
750
  return transactionHash;
@@ -816,7 +763,7 @@ export const SwapController = {
816
763
  swapToToken: this.state.toToken?.symbol || '',
817
764
  swapFromAmount: this.state.sourceTokenAmount || '',
818
765
  swapToAmount: this.state.toTokenAmount || '',
819
- isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount'
766
+ isSmartAccount: ConnectionsController.state.accountType === 'smartAccount'
820
767
  }
821
768
  });
822
769
 
@@ -824,8 +771,45 @@ export const SwapController = {
824
771
  }
825
772
  },
826
773
 
774
+ clearTransactionLoaders() {
775
+ state.loadingApprovalTransaction = false;
776
+ state.loadingBuildTransaction = false;
777
+ state.loadingTransaction = false;
778
+ },
779
+
780
+ clearTokens() {
781
+ state.sourceToken = initialState.sourceToken;
782
+ state.sourceTokenAmount = initialState.sourceTokenAmount;
783
+ state.sourceTokenPriceInUSD = initialState.sourceTokenPriceInUSD;
784
+ state.toToken = initialState.toToken;
785
+ state.toTokenAmount = initialState.toTokenAmount;
786
+ state.toTokenPriceInUSD = initialState.toTokenPriceInUSD;
787
+ state.inputError = initialState.inputError;
788
+ state.loadingApprovalTransaction = initialState.loadingApprovalTransaction;
789
+ state.loadingBuildTransaction = initialState.loadingBuildTransaction;
790
+ state.loadingTransaction = initialState.loadingTransaction;
791
+ state.fetchError = initialState.fetchError;
792
+ state.transactionError = initialState.transactionError;
793
+ state.swapTransaction = initialState.swapTransaction;
794
+ state.approvalTransaction = initialState.approvalTransaction;
795
+ },
796
+
797
+ resetState() {
798
+ this.clearTokens();
799
+ state.myTokensWithBalance = initialState.myTokensWithBalance;
800
+ state.tokensPriceMap = initialState.tokensPriceMap;
801
+ state.networkPrice = initialState.networkPrice;
802
+ state.networkTokenSymbol = initialState.networkTokenSymbol;
803
+ },
804
+
827
805
  // -- Checks -------------------------------------------- //
828
806
  hasInsufficientToken(sourceTokenAmount: string, sourceTokenAddress: string) {
807
+ const { balances } = ConnectionsController.state;
808
+ const networkToken = balances?.find(t => t.address === undefined);
809
+ const networkBalanceInUSD = networkToken
810
+ ? NumberUtil.multiply(networkToken.quantity?.numeric ?? '0', networkToken.price).toString()
811
+ : '0';
812
+
829
813
  const isInsufficientSourceTokenForSwap = SwapCalculationUtil.isInsufficientSourceTokenForSwap(
830
814
  sourceTokenAmount,
831
815
  sourceTokenAddress,
@@ -833,12 +817,12 @@ export const SwapController = {
833
817
  );
834
818
 
835
819
  let insufficientNetworkTokenForGas = true;
836
- if (AccountController.state.preferredAccountType === 'smartAccount') {
820
+ if (ConnectionsController.state.accountType === 'smartAccount') {
837
821
  // Smart Accounts may pay gas in any ERC20 token
838
822
  insufficientNetworkTokenForGas = false;
839
823
  } else {
840
824
  insufficientNetworkTokenForGas = SwapCalculationUtil.isInsufficientNetworkTokenForGas(
841
- state.networkBalanceInUSD,
825
+ networkBalanceInUSD,
842
826
  state.gasPriceInUSD
843
827
  );
844
828
  }
@@ -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;
@@ -0,0 +1,93 @@
1
+ import { proxy } from 'valtio';
2
+ import { subscribeKey as subKey } from 'valtio/utils';
3
+ import type { WalletDeepLink, WcWallet } from '@reown/appkit-common-react-native';
4
+ import { CoreHelperUtil } from '../utils/CoreHelperUtil';
5
+ import { StorageUtil } from '../utils/StorageUtil';
6
+
7
+ // -- Types --------------------------------------------- //
8
+ export interface WcControllerState {
9
+ wcUri?: string;
10
+ wcPromise?: Promise<void>;
11
+ wcPairingExpiry?: number;
12
+ wcLinking?: WalletDeepLink;
13
+ wcError?: boolean;
14
+ pressedWallet?: WcWallet;
15
+ recentWallets?: WcWallet[];
16
+ }
17
+
18
+ type StateKey = keyof WcControllerState;
19
+
20
+ // -- State --------------------------------------------- //
21
+ const state = proxy<WcControllerState>({
22
+ wcError: false
23
+ });
24
+
25
+ // -- Controller ---------------------------------------- //
26
+ export const WcController = {
27
+ state,
28
+
29
+ subscribeKey<K extends StateKey>(key: K, callback: (value: WcControllerState[K]) => void) {
30
+ return subKey(state, key, callback);
31
+ },
32
+
33
+ setWcLinking(wcLinking: WcControllerState['wcLinking']) {
34
+ state.wcLinking = wcLinking;
35
+ },
36
+
37
+ removeWcLinking() {
38
+ state.wcLinking = undefined;
39
+ },
40
+
41
+ setWcError(wcError: WcControllerState['wcError']) {
42
+ state.wcError = wcError;
43
+ },
44
+
45
+ setPressedWallet(wallet: WcControllerState['pressedWallet']) {
46
+ state.pressedWallet = wallet;
47
+ },
48
+
49
+ removePressedWallet() {
50
+ state.pressedWallet = undefined;
51
+ },
52
+
53
+ setWcPromise(wcPromise: WcControllerState['wcPromise']) {
54
+ state.wcPromise = wcPromise;
55
+ },
56
+
57
+ setWcUri(wcUri: WcControllerState['wcUri']) {
58
+ state.wcUri = wcUri;
59
+ state.wcPairingExpiry = CoreHelperUtil.getPairingExpiry();
60
+ },
61
+
62
+ setRecentWallets(wallets: WcControllerState['recentWallets']) {
63
+ state.recentWallets = wallets;
64
+ },
65
+
66
+ async addRecentWallet(wallet: WcWallet) {
67
+ const recentWallets = await StorageUtil.addRecentWallet(wallet);
68
+ if (recentWallets) {
69
+ WcController.setRecentWallets(recentWallets);
70
+ }
71
+ },
72
+
73
+ setConnectedWallet: async (wcLinking: WalletDeepLink, pressedWallet?: WcWallet) => {
74
+ StorageUtil.setWalletConnectDeepLink(wcLinking);
75
+
76
+ if (pressedWallet) {
77
+ WcController.addRecentWallet(pressedWallet);
78
+ }
79
+ },
80
+
81
+ clearUri() {
82
+ state.wcUri = undefined;
83
+ state.wcPairingExpiry = undefined;
84
+ state.wcPromise = undefined;
85
+ state.wcLinking = undefined;
86
+ },
87
+
88
+ resetState() {
89
+ this.clearUri();
90
+ state.pressedWallet = undefined;
91
+ StorageUtil.removeWalletConnectDeepLink();
92
+ }
93
+ };