@reown/appkit-core-react-native 0.0.0-feat-multi-social-20250715153550 → 0.0.0-feat-onramp-20250718185718
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.
- package/lib/commonjs/controllers/AccountController.js +17 -20
- package/lib/commonjs/controllers/AccountController.js.map +1 -1
- package/lib/commonjs/controllers/ApiController.js +15 -17
- package/lib/commonjs/controllers/ApiController.js.map +1 -1
- package/lib/commonjs/controllers/BlockchainApiController.js +29 -110
- package/lib/commonjs/controllers/BlockchainApiController.js.map +1 -1
- package/lib/commonjs/controllers/ConnectionController.js +11 -8
- package/lib/commonjs/controllers/ConnectionController.js.map +1 -1
- package/lib/commonjs/controllers/ConnectorController.js +49 -0
- package/lib/commonjs/controllers/ConnectorController.js.map +1 -0
- package/lib/commonjs/controllers/EnsController.js +4 -4
- package/lib/commonjs/controllers/EnsController.js.map +1 -1
- package/lib/commonjs/controllers/EventsController.js +4 -4
- package/lib/commonjs/controllers/EventsController.js.map +1 -1
- package/lib/commonjs/controllers/ModalController.js +2 -2
- package/lib/commonjs/controllers/ModalController.js.map +1 -1
- package/lib/commonjs/controllers/OnRampController.js +60 -20
- package/lib/commonjs/controllers/OnRampController.js.map +1 -1
- package/lib/commonjs/controllers/OptionsController.js +3 -8
- package/lib/commonjs/controllers/OptionsController.js.map +1 -1
- package/lib/commonjs/controllers/RouterController.js +22 -1
- package/lib/commonjs/controllers/RouterController.js.map +1 -1
- package/lib/commonjs/controllers/SendController.js +33 -34
- package/lib/commonjs/controllers/SendController.js.map +1 -1
- package/lib/commonjs/controllers/SnackController.js +5 -29
- package/lib/commonjs/controllers/SnackController.js.map +1 -1
- package/lib/commonjs/controllers/SwapController.js +148 -136
- package/lib/commonjs/controllers/SwapController.js.map +1 -1
- package/lib/commonjs/controllers/ThemeController.js +1 -9
- package/lib/commonjs/controllers/ThemeController.js.map +1 -1
- package/lib/commonjs/controllers/TransactionsController.js +21 -25
- package/lib/commonjs/controllers/TransactionsController.js.map +1 -1
- package/lib/commonjs/controllers/WebviewController.js +52 -0
- package/lib/commonjs/controllers/WebviewController.js.map +1 -0
- package/lib/commonjs/index.js +24 -3
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils/AssetUtil.js +12 -8
- package/lib/commonjs/utils/AssetUtil.js.map +1 -1
- package/lib/commonjs/utils/ConnectionUtil.js +33 -0
- package/lib/commonjs/utils/ConnectionUtil.js.map +1 -0
- package/lib/commonjs/utils/ConstantsUtil.js +8 -537
- package/lib/commonjs/utils/ConstantsUtil.js.map +1 -1
- package/lib/commonjs/utils/CoreHelperUtil.js +4 -4
- package/lib/commonjs/utils/CoreHelperUtil.js.map +1 -1
- package/lib/commonjs/utils/FetchUtil.js +28 -9
- package/lib/commonjs/utils/FetchUtil.js.map +1 -1
- package/lib/commonjs/utils/NetworkUtil.js +46 -0
- package/lib/commonjs/utils/NetworkUtil.js.map +1 -0
- package/lib/commonjs/utils/StorageUtil.js +42 -51
- package/lib/commonjs/utils/StorageUtil.js.map +1 -1
- package/lib/commonjs/utils/SwapApiUtil.js +21 -15
- package/lib/commonjs/utils/SwapApiUtil.js.map +1 -1
- package/lib/module/controllers/AccountController.js +17 -20
- package/lib/module/controllers/AccountController.js.map +1 -1
- package/lib/module/controllers/ApiController.js +15 -16
- package/lib/module/controllers/ApiController.js.map +1 -1
- package/lib/module/controllers/BlockchainApiController.js +29 -110
- package/lib/module/controllers/BlockchainApiController.js.map +1 -1
- package/lib/module/controllers/ConnectionController.js +11 -8
- package/lib/module/controllers/ConnectionController.js.map +1 -1
- package/lib/module/controllers/ConnectorController.js +44 -0
- package/lib/module/controllers/ConnectorController.js.map +1 -0
- package/lib/module/controllers/EnsController.js +2 -2
- package/lib/module/controllers/EnsController.js.map +1 -1
- package/lib/module/controllers/EventsController.js +1 -1
- package/lib/module/controllers/EventsController.js.map +1 -1
- package/lib/module/controllers/ModalController.js +2 -2
- package/lib/module/controllers/ModalController.js.map +1 -1
- package/lib/module/controllers/OnRampController.js +60 -20
- package/lib/module/controllers/OnRampController.js.map +1 -1
- package/lib/module/controllers/OptionsController.js +3 -8
- package/lib/module/controllers/OptionsController.js.map +1 -1
- package/lib/module/controllers/RouterController.js +22 -1
- package/lib/module/controllers/RouterController.js.map +1 -1
- package/lib/module/controllers/SendController.js +30 -31
- package/lib/module/controllers/SendController.js.map +1 -1
- package/lib/module/controllers/SnackController.js +5 -29
- package/lib/module/controllers/SnackController.js.map +1 -1
- package/lib/module/controllers/SwapController.js +148 -136
- package/lib/module/controllers/SwapController.js.map +1 -1
- package/lib/module/controllers/ThemeController.js +1 -9
- package/lib/module/controllers/ThemeController.js.map +1 -1
- package/lib/module/controllers/TransactionsController.js +19 -23
- package/lib/module/controllers/TransactionsController.js.map +1 -1
- package/lib/module/controllers/WebviewController.js +47 -0
- package/lib/module/controllers/WebviewController.js.map +1 -0
- package/lib/module/index.js +4 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils/AssetUtil.js +12 -8
- package/lib/module/utils/AssetUtil.js.map +1 -1
- package/lib/module/utils/ConnectionUtil.js +27 -0
- package/lib/module/utils/ConnectionUtil.js.map +1 -0
- package/lib/module/utils/ConstantsUtil.js +8 -537
- package/lib/module/utils/ConstantsUtil.js.map +1 -1
- package/lib/module/utils/CoreHelperUtil.js +4 -4
- package/lib/module/utils/CoreHelperUtil.js.map +1 -1
- package/lib/module/utils/FetchUtil.js +28 -9
- package/lib/module/utils/FetchUtil.js.map +1 -1
- package/lib/module/utils/NetworkUtil.js +40 -0
- package/lib/module/utils/NetworkUtil.js.map +1 -0
- package/lib/module/utils/StorageUtil.js +42 -51
- package/lib/module/utils/StorageUtil.js.map +1 -1
- package/lib/module/utils/SwapApiUtil.js +21 -15
- package/lib/module/utils/SwapApiUtil.js.map +1 -1
- package/lib/typescript/controllers/AccountController.d.ts +4 -4
- package/lib/typescript/controllers/AccountController.d.ts.map +1 -1
- package/lib/typescript/controllers/ApiController.d.ts +1 -1
- package/lib/typescript/controllers/ApiController.d.ts.map +1 -1
- package/lib/typescript/controllers/BlockchainApiController.d.ts +4 -16
- package/lib/typescript/controllers/BlockchainApiController.d.ts.map +1 -1
- package/lib/typescript/controllers/ConnectionController.d.ts +11 -3
- package/lib/typescript/controllers/ConnectionController.d.ts.map +1 -1
- package/lib/typescript/controllers/ConnectorController.d.ts +18 -0
- package/lib/typescript/controllers/ConnectorController.d.ts.map +1 -0
- package/lib/typescript/controllers/ModalController.d.ts +1 -1
- package/lib/typescript/controllers/ModalController.d.ts.map +1 -1
- package/lib/typescript/controllers/NetworkController.d.ts +1 -1
- package/lib/typescript/controllers/NetworkController.d.ts.map +1 -1
- package/lib/typescript/controllers/OnRampController.d.ts +3 -1
- package/lib/typescript/controllers/OnRampController.d.ts.map +1 -1
- package/lib/typescript/controllers/OptionsController.d.ts +2 -5
- package/lib/typescript/controllers/OptionsController.d.ts.map +1 -1
- package/lib/typescript/controllers/PublicStateController.d.ts +1 -1
- package/lib/typescript/controllers/PublicStateController.d.ts.map +1 -1
- package/lib/typescript/controllers/RouterController.d.ts +16 -4
- package/lib/typescript/controllers/RouterController.d.ts.map +1 -1
- package/lib/typescript/controllers/SendController.d.ts.map +1 -1
- package/lib/typescript/controllers/SnackController.d.ts +3 -3
- package/lib/typescript/controllers/SnackController.d.ts.map +1 -1
- package/lib/typescript/controllers/SwapController.d.ts +9 -9
- package/lib/typescript/controllers/SwapController.d.ts.map +1 -1
- package/lib/typescript/controllers/ThemeController.d.ts +1 -1
- package/lib/typescript/controllers/ThemeController.d.ts.map +1 -1
- package/lib/typescript/controllers/TransactionsController.d.ts +3 -3
- package/lib/typescript/controllers/TransactionsController.d.ts.map +1 -1
- package/lib/typescript/controllers/WebviewController.d.ts +21 -0
- package/lib/typescript/controllers/WebviewController.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +4 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/utils/AssetUtil.d.ts +3 -3
- package/lib/typescript/utils/AssetUtil.d.ts.map +1 -1
- package/lib/typescript/utils/ConnectionUtil.d.ts +4 -0
- package/lib/typescript/utils/ConnectionUtil.d.ts.map +1 -0
- package/lib/typescript/utils/ConstantsUtil.d.ts +1 -421
- package/lib/typescript/utils/ConstantsUtil.d.ts.map +1 -1
- package/lib/typescript/utils/CoreHelperUtil.d.ts +3 -3
- package/lib/typescript/utils/CoreHelperUtil.d.ts.map +1 -1
- package/lib/typescript/utils/FetchUtil.d.ts +1 -1
- package/lib/typescript/utils/FetchUtil.d.ts.map +1 -1
- package/lib/typescript/utils/NetworkUtil.d.ts +8 -0
- package/lib/typescript/utils/NetworkUtil.d.ts.map +1 -0
- package/lib/typescript/utils/StorageUtil.d.ts +7 -14
- package/lib/typescript/utils/StorageUtil.d.ts.map +1 -1
- package/lib/typescript/utils/SwapApiUtil.d.ts +3 -3
- package/lib/typescript/utils/SwapApiUtil.d.ts.map +1 -1
- package/lib/typescript/utils/TypeUtil.d.ts +172 -24
- package/lib/typescript/utils/TypeUtil.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/controllers/AccountController.ts +27 -23
- package/src/controllers/ApiController.ts +9 -15
- package/src/controllers/BlockchainApiController.ts +32 -145
- package/src/controllers/ConnectionController.ts +24 -12
- package/src/controllers/ConnectorController.ts +63 -0
- package/src/controllers/EnsController.ts +2 -2
- package/src/controllers/EventsController.ts +1 -1
- package/src/controllers/ModalController.ts +3 -4
- package/src/controllers/NetworkController.ts +1 -1
- package/src/controllers/OnRampController.ts +91 -32
- package/src/controllers/OptionsController.ts +13 -14
- package/src/controllers/PublicStateController.ts +1 -1
- package/src/controllers/RouterController.ts +54 -5
- package/src/controllers/SendController.ts +30 -39
- package/src/controllers/SnackController.ts +5 -31
- package/src/controllers/SwapController.ts +178 -155
- package/src/controllers/ThemeController.ts +2 -11
- package/src/controllers/TransactionsController.ts +20 -26
- package/src/controllers/WebviewController.ts +63 -0
- package/src/index.ts +6 -3
- package/src/utils/AssetUtil.ts +14 -8
- package/src/utils/ConnectionUtil.ts +27 -0
- package/src/utils/ConstantsUtil.ts +8 -542
- package/src/utils/CoreHelperUtil.ts +7 -15
- package/src/utils/FetchUtil.ts +31 -10
- package/src/utils/NetworkUtil.ts +33 -0
- package/src/utils/StorageUtil.ts +48 -60
- package/src/utils/SwapApiUtil.ts +38 -27
- package/src/utils/TypeUtil.ts +172 -26
- package/lib/commonjs/controllers/ConnectionsController.js +0 -383
- package/lib/commonjs/controllers/ConnectionsController.js.map +0 -1
- package/lib/module/controllers/ConnectionsController.js +0 -378
- package/lib/module/controllers/ConnectionsController.js.map +0 -1
- package/lib/typescript/controllers/ConnectionsController.d.ts +0 -52
- package/lib/typescript/controllers/ConnectionsController.d.ts.map +0 -1
- package/src/controllers/ConnectionsController.ts +0 -503
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import { subscribeKey as subKey } from 'valtio/utils';
|
|
2
2
|
import { proxy, subscribe as sub } from 'valtio';
|
|
3
|
-
import { NumberUtil
|
|
3
|
+
import { NumberUtil } from '@reown/appkit-common-react-native';
|
|
4
4
|
|
|
5
5
|
import { ConstantsUtil } from '../utils/ConstantsUtil';
|
|
6
6
|
import { SwapApiUtil } from '../utils/SwapApiUtil';
|
|
7
|
+
import { NetworkController } from './NetworkController';
|
|
7
8
|
import { BlockchainApiController } from './BlockchainApiController';
|
|
8
9
|
import { OptionsController } from './OptionsController';
|
|
9
10
|
import { SwapCalculationUtil } from '../utils/SwapCalculationUtil';
|
|
10
11
|
import { SnackController } from './SnackController';
|
|
11
12
|
import { RouterController } from './RouterController';
|
|
12
13
|
import type { SwapInputTarget, SwapTokenWithBalance } from '../utils/TypeUtil';
|
|
14
|
+
import { ConnectorController } from './ConnectorController';
|
|
15
|
+
import { AccountController } from './AccountController';
|
|
13
16
|
import { CoreHelperUtil } from '../utils/CoreHelperUtil';
|
|
17
|
+
import { ConnectionController } from './ConnectionController';
|
|
14
18
|
import { TransactionsController } from './TransactionsController';
|
|
15
19
|
import { EventsController } from './EventsController';
|
|
16
|
-
import { ConnectionsController } from './ConnectionsController';
|
|
17
20
|
|
|
18
21
|
// -- Constants ---------------------------------------- //
|
|
19
22
|
export const INITIAL_GAS_LIMIT = 150000;
|
|
@@ -41,7 +44,8 @@ class TransactionError extends Error {
|
|
|
41
44
|
|
|
42
45
|
export interface SwapControllerState {
|
|
43
46
|
// Loading states
|
|
44
|
-
|
|
47
|
+
initializing: boolean;
|
|
48
|
+
initialized: boolean;
|
|
45
49
|
loadingPrices: boolean;
|
|
46
50
|
loadingQuote?: boolean;
|
|
47
51
|
loadingApprovalTransaction?: boolean;
|
|
@@ -64,6 +68,7 @@ export interface SwapControllerState {
|
|
|
64
68
|
toTokenAmount: string;
|
|
65
69
|
toTokenPriceInUSD: number;
|
|
66
70
|
networkPrice: string;
|
|
71
|
+
networkBalanceInUSD: string;
|
|
67
72
|
networkTokenSymbol: string;
|
|
68
73
|
inputError: string | undefined;
|
|
69
74
|
|
|
@@ -91,7 +96,8 @@ type StateKey = keyof SwapControllerState;
|
|
|
91
96
|
// -- State --------------------------------------------- //
|
|
92
97
|
const initialState: SwapControllerState = {
|
|
93
98
|
// Loading states
|
|
94
|
-
|
|
99
|
+
initializing: false,
|
|
100
|
+
initialized: false,
|
|
95
101
|
loadingPrices: false,
|
|
96
102
|
loadingQuote: false,
|
|
97
103
|
loadingApprovalTransaction: false,
|
|
@@ -114,6 +120,7 @@ const initialState: SwapControllerState = {
|
|
|
114
120
|
toTokenAmount: '',
|
|
115
121
|
toTokenPriceInUSD: 0,
|
|
116
122
|
networkPrice: '0',
|
|
123
|
+
networkBalanceInUSD: '0',
|
|
117
124
|
networkTokenSymbol: '',
|
|
118
125
|
inputError: undefined,
|
|
119
126
|
|
|
@@ -151,15 +158,10 @@ export const SwapController = {
|
|
|
151
158
|
},
|
|
152
159
|
|
|
153
160
|
getParams() {
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
if (!activeNamespace || !activeNetwork) {
|
|
159
|
-
throw new Error('No active namespace or network found to swap the tokens from.');
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const networkAddress: CaipAddress = `${activeNetwork.caipNetworkId}:${ConstantsUtil.NATIVE_TOKEN_ADDRESS[activeNamespace]}`;
|
|
161
|
+
const caipAddress = AccountController.state.caipAddress;
|
|
162
|
+
const address = CoreHelperUtil.getPlainAddress(caipAddress);
|
|
163
|
+
const networkAddress = NetworkController.getActiveNetworkTokenAddress();
|
|
164
|
+
const type = ConnectorController.state.connectedConnector;
|
|
163
165
|
|
|
164
166
|
if (!address) {
|
|
165
167
|
throw new Error('No address found to swap the tokens from.');
|
|
@@ -176,7 +178,7 @@ export const SwapController = {
|
|
|
176
178
|
return {
|
|
177
179
|
networkAddress,
|
|
178
180
|
fromAddress: address,
|
|
179
|
-
fromCaipAddress:
|
|
181
|
+
fromCaipAddress: caipAddress,
|
|
180
182
|
sourceTokenAddress: state.sourceToken?.address,
|
|
181
183
|
toTokenAddress: state.toToken?.address,
|
|
182
184
|
toTokenAmount: state.toTokenAmount,
|
|
@@ -187,13 +189,13 @@ export const SwapController = {
|
|
|
187
189
|
invalidSourceToken,
|
|
188
190
|
invalidSourceTokenAmount,
|
|
189
191
|
availableToSwap:
|
|
190
|
-
|
|
191
|
-
isAuthConnector:
|
|
192
|
+
caipAddress && !invalidToToken && !invalidSourceToken && !invalidSourceTokenAmount,
|
|
193
|
+
isAuthConnector: type === 'AUTH'
|
|
192
194
|
};
|
|
193
195
|
},
|
|
194
196
|
|
|
195
197
|
switchTokens() {
|
|
196
|
-
if (state.
|
|
198
|
+
if (state.initializing || !state.initialized) {
|
|
197
199
|
return;
|
|
198
200
|
}
|
|
199
201
|
|
|
@@ -218,36 +220,41 @@ export const SwapController = {
|
|
|
218
220
|
this.swapTokens();
|
|
219
221
|
},
|
|
220
222
|
|
|
223
|
+
resetState() {
|
|
224
|
+
state.myTokensWithBalance = initialState.myTokensWithBalance;
|
|
225
|
+
state.tokensPriceMap = initialState.tokensPriceMap;
|
|
226
|
+
state.initialized = initialState.initialized;
|
|
227
|
+
state.sourceToken = initialState.sourceToken;
|
|
228
|
+
state.sourceTokenAmount = initialState.sourceTokenAmount;
|
|
229
|
+
state.sourceTokenPriceInUSD = initialState.sourceTokenPriceInUSD;
|
|
230
|
+
state.toToken = initialState.toToken;
|
|
231
|
+
state.toTokenAmount = initialState.toTokenAmount;
|
|
232
|
+
state.toTokenPriceInUSD = initialState.toTokenPriceInUSD;
|
|
233
|
+
state.networkPrice = initialState.networkPrice;
|
|
234
|
+
state.networkTokenSymbol = initialState.networkTokenSymbol;
|
|
235
|
+
state.networkBalanceInUSD = initialState.networkBalanceInUSD;
|
|
236
|
+
state.inputError = initialState.inputError;
|
|
237
|
+
},
|
|
238
|
+
|
|
221
239
|
async fetchTokens() {
|
|
222
|
-
|
|
223
|
-
const { networkAddress } = this.getParams();
|
|
240
|
+
const { networkAddress } = this.getParams();
|
|
224
241
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
await this.getMyTokensWithBalance();
|
|
242
|
+
await this.getTokenList();
|
|
243
|
+
await this.getNetworkTokenPrice();
|
|
244
|
+
await this.getMyTokensWithBalance();
|
|
229
245
|
|
|
230
|
-
|
|
246
|
+
const networkToken = state.tokens?.find(token => token.address === networkAddress);
|
|
231
247
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
248
|
+
if (networkToken) {
|
|
249
|
+
state.networkTokenSymbol = networkToken.symbol;
|
|
250
|
+
}
|
|
235
251
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
state.myTokensWithBalance?.find(token => token.address.startsWith(networkAddress)) ||
|
|
240
|
-
state.myTokensWithBalance?.[0];
|
|
252
|
+
const sourceToken =
|
|
253
|
+
state.myTokensWithBalance?.find(token => token.address.startsWith(networkAddress)) ||
|
|
254
|
+
state.myTokensWithBalance?.[0];
|
|
241
255
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
}
|
|
245
|
-
} catch (error) {
|
|
246
|
-
SnackController.showError('Failed to initialize swap');
|
|
247
|
-
RouterController.goBack();
|
|
248
|
-
} finally {
|
|
249
|
-
state.loadingTokens = false;
|
|
250
|
-
}
|
|
256
|
+
this.setSourceToken(sourceToken);
|
|
257
|
+
this.setSourceTokenAmount('1');
|
|
251
258
|
},
|
|
252
259
|
|
|
253
260
|
async getTokenList() {
|
|
@@ -273,23 +280,21 @@ export const SwapController = {
|
|
|
273
280
|
}, {});
|
|
274
281
|
},
|
|
275
282
|
|
|
276
|
-
async getMyTokensWithBalance(forceUpdate?:
|
|
277
|
-
await
|
|
278
|
-
|
|
279
|
-
if (!
|
|
283
|
+
async getMyTokensWithBalance(forceUpdate?: string) {
|
|
284
|
+
const balances = await SwapApiUtil.getMyTokensWithBalance(forceUpdate);
|
|
285
|
+
|
|
286
|
+
if (!balances) {
|
|
280
287
|
return;
|
|
281
288
|
}
|
|
282
289
|
|
|
283
290
|
await this.getInitialGasPrice();
|
|
284
|
-
this.setBalances(
|
|
291
|
+
this.setBalances(balances);
|
|
285
292
|
},
|
|
286
293
|
|
|
287
|
-
getFilteredPopularTokens(
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
return state.popularTokens?.filter(token => !balances.some(t => t.address === token.address));
|
|
294
|
+
getFilteredPopularTokens() {
|
|
295
|
+
return state.popularTokens?.filter(
|
|
296
|
+
token => !state.myTokensWithBalance?.some(t => t.address === token.address)
|
|
297
|
+
);
|
|
293
298
|
},
|
|
294
299
|
|
|
295
300
|
setSourceToken(sourceToken: SwapTokenWithBalance | undefined) {
|
|
@@ -313,6 +318,25 @@ export const SwapController = {
|
|
|
313
318
|
}
|
|
314
319
|
},
|
|
315
320
|
|
|
321
|
+
async initializeState() {
|
|
322
|
+
if (state.initializing) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
state.initializing = true;
|
|
327
|
+
if (!state.initialized) {
|
|
328
|
+
try {
|
|
329
|
+
await this.fetchTokens();
|
|
330
|
+
state.initialized = true;
|
|
331
|
+
} catch (error) {
|
|
332
|
+
state.initialized = false;
|
|
333
|
+
SnackController.showError('Failed to initialize swap');
|
|
334
|
+
RouterController.goBack();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
state.initializing = false;
|
|
338
|
+
},
|
|
339
|
+
|
|
316
340
|
async getAddressPrice(address: string) {
|
|
317
341
|
const existPrice = state.tokensPriceMap[address];
|
|
318
342
|
|
|
@@ -376,11 +400,24 @@ export const SwapController = {
|
|
|
376
400
|
},
|
|
377
401
|
|
|
378
402
|
setBalances(balances: SwapTokenWithBalance[]) {
|
|
379
|
-
|
|
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);
|
|
380
411
|
|
|
381
412
|
balances.forEach(token => {
|
|
382
413
|
state.tokensPriceMap[token.address] = token.price || 0;
|
|
383
414
|
});
|
|
415
|
+
|
|
416
|
+
state.myTokensWithBalance = balances.filter(token => token.address?.startsWith(caipNetwork.id));
|
|
417
|
+
|
|
418
|
+
state.networkBalanceInUSD = networkToken
|
|
419
|
+
? NumberUtil.multiply(networkToken.quantity.numeric, networkToken.price).toString()
|
|
420
|
+
: '0';
|
|
384
421
|
},
|
|
385
422
|
|
|
386
423
|
setToToken(toToken: SwapTokenWithBalance | undefined) {
|
|
@@ -427,12 +464,12 @@ export const SwapController = {
|
|
|
427
464
|
|
|
428
465
|
// -- Swap ---------------------------------------------- //
|
|
429
466
|
async swapTokens() {
|
|
430
|
-
const address =
|
|
467
|
+
const address = AccountController.state.address as `${string}:${string}:${string}`;
|
|
431
468
|
const sourceToken = state.sourceToken;
|
|
432
469
|
const toToken = state.toToken;
|
|
433
470
|
const haveSourceTokenAmount = NumberUtil.bigNumber(state.sourceTokenAmount).isGreaterThan(0);
|
|
434
471
|
|
|
435
|
-
if (!toToken || !sourceToken || state.loadingPrices || !haveSourceTokenAmount
|
|
472
|
+
if (!toToken || !sourceToken || state.loadingPrices || !haveSourceTokenAmount) {
|
|
436
473
|
return;
|
|
437
474
|
}
|
|
438
475
|
|
|
@@ -442,45 +479,39 @@ export const SwapController = {
|
|
|
442
479
|
.multipliedBy(10 ** sourceToken.decimals)
|
|
443
480
|
.integerValue();
|
|
444
481
|
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
});
|
|
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
|
+
});
|
|
454
490
|
|
|
455
|
-
|
|
491
|
+
state.loadingQuote = false;
|
|
456
492
|
|
|
457
|
-
|
|
458
|
-
state.loadingQuote = false;
|
|
493
|
+
const quoteToAmount = quoteResponse?.quotes?.[0]?.toAmount;
|
|
459
494
|
|
|
460
|
-
|
|
461
|
-
|
|
495
|
+
if (!quoteToAmount) {
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
462
498
|
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
499
|
+
const toTokenAmount = NumberUtil.bigNumber(quoteToAmount)
|
|
500
|
+
.dividedBy(10 ** toToken.decimals)
|
|
501
|
+
.toString();
|
|
466
502
|
|
|
467
|
-
|
|
503
|
+
this.setToTokenAmount(toTokenAmount);
|
|
468
504
|
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
505
|
+
const isInsufficientToken = this.hasInsufficientToken(
|
|
506
|
+
state.sourceTokenAmount,
|
|
507
|
+
sourceToken.address
|
|
508
|
+
);
|
|
473
509
|
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
}
|
|
480
|
-
} catch (error) {
|
|
481
|
-
SnackController.showError('Failed to get swap quote');
|
|
482
|
-
} finally {
|
|
483
|
-
state.loadingQuote = false;
|
|
510
|
+
if (isInsufficientToken) {
|
|
511
|
+
state.inputError = 'Insufficient balance';
|
|
512
|
+
} else {
|
|
513
|
+
state.inputError = undefined;
|
|
514
|
+
this.setTransactionDetails();
|
|
484
515
|
}
|
|
485
516
|
},
|
|
486
517
|
|
|
@@ -549,7 +580,7 @@ export const SwapController = {
|
|
|
549
580
|
if (!response) {
|
|
550
581
|
throw new Error('createAllowanceTransaction - No response from generateApproveCalldata');
|
|
551
582
|
}
|
|
552
|
-
const gasLimit = await
|
|
583
|
+
const gasLimit = await ConnectionController.estimateGas({
|
|
553
584
|
address: fromAddress as `0x${string}`,
|
|
554
585
|
to: CoreHelperUtil.getPlainAddress(response.tx.to) as `0x${string}`,
|
|
555
586
|
data: response.tx.data
|
|
@@ -602,7 +633,7 @@ export const SwapController = {
|
|
|
602
633
|
return undefined;
|
|
603
634
|
}
|
|
604
635
|
|
|
605
|
-
const amount =
|
|
636
|
+
const amount = ConnectionController.parseUnits(
|
|
606
637
|
sourceTokenAmount,
|
|
607
638
|
sourceToken.decimals
|
|
608
639
|
)?.toString();
|
|
@@ -652,31 +683,42 @@ export const SwapController = {
|
|
|
652
683
|
},
|
|
653
684
|
|
|
654
685
|
async sendTransactionForApproval(data: TransactionParams) {
|
|
655
|
-
const { fromAddress } = this.getParams();
|
|
656
|
-
state.loadingApprovalTransaction = true;
|
|
686
|
+
const { fromAddress, isAuthConnector } = this.getParams();
|
|
657
687
|
|
|
658
|
-
|
|
688
|
+
state.loadingApprovalTransaction = true;
|
|
689
|
+
const approveLimitMessage = `Approve limit increase in your wallet`;
|
|
690
|
+
|
|
691
|
+
if (isAuthConnector) {
|
|
692
|
+
RouterController.pushTransactionStack({
|
|
693
|
+
view: null,
|
|
694
|
+
goBack: true,
|
|
695
|
+
onSuccess() {
|
|
696
|
+
SnackController.showLoading(approveLimitMessage);
|
|
697
|
+
}
|
|
698
|
+
});
|
|
699
|
+
} else {
|
|
700
|
+
SnackController.showLoading(approveLimitMessage);
|
|
701
|
+
}
|
|
659
702
|
|
|
660
703
|
try {
|
|
661
|
-
await
|
|
704
|
+
await ConnectionController.sendTransaction({
|
|
662
705
|
address: fromAddress as `0x${string}`,
|
|
663
706
|
to: data.to as `0x${string}`,
|
|
664
707
|
data: data.data as `0x${string}`,
|
|
665
708
|
value: BigInt(data.value),
|
|
666
709
|
gasPrice: BigInt(data.gasPrice),
|
|
667
|
-
chainNamespace:
|
|
710
|
+
chainNamespace: 'eip155'
|
|
668
711
|
});
|
|
669
712
|
|
|
670
713
|
await this.swapTokens();
|
|
671
714
|
await this.getTransaction();
|
|
672
715
|
state.approvalTransaction = undefined;
|
|
716
|
+
state.loadingApprovalTransaction = false;
|
|
673
717
|
} catch (err) {
|
|
674
718
|
const error = err as TransactionError;
|
|
675
719
|
state.transactionError = error?.shortMessage as unknown as string;
|
|
676
|
-
|
|
677
|
-
SnackController.showError(error?.shortMessage ?? 'Transaction error');
|
|
678
|
-
} finally {
|
|
679
720
|
state.loadingApprovalTransaction = false;
|
|
721
|
+
SnackController.showError(error?.shortMessage ?? 'Transaction error');
|
|
680
722
|
}
|
|
681
723
|
},
|
|
682
724
|
|
|
@@ -684,50 +726,68 @@ export const SwapController = {
|
|
|
684
726
|
if (!data) {
|
|
685
727
|
return undefined;
|
|
686
728
|
}
|
|
687
|
-
const { fromAddress, isAuthConnector } = this.getParams();
|
|
688
729
|
|
|
689
|
-
|
|
730
|
+
const { fromAddress, toTokenAmount, isAuthConnector } = this.getParams();
|
|
690
731
|
|
|
691
|
-
|
|
732
|
+
state.loadingTransaction = true;
|
|
692
733
|
|
|
693
|
-
|
|
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
|
+
}
|
|
694
753
|
|
|
695
754
|
try {
|
|
696
|
-
const forceUpdateAddresses = [state.sourceToken?.address, state.toToken?.address].
|
|
697
|
-
|
|
698
|
-
) as CaipAddress[];
|
|
699
|
-
|
|
700
|
-
const transactionHash = await ConnectionsController.sendTransaction({
|
|
755
|
+
const forceUpdateAddresses = [state.sourceToken?.address, state.toToken?.address].join(',');
|
|
756
|
+
const transactionHash = await ConnectionController.sendTransaction({
|
|
701
757
|
address: fromAddress as `0x${string}`,
|
|
702
758
|
to: data.to as `0x${string}`,
|
|
703
759
|
data: data.data as `0x${string}`,
|
|
704
760
|
gas: data.gas,
|
|
705
761
|
gasPrice: BigInt(data.gasPrice),
|
|
706
762
|
value: data.value,
|
|
707
|
-
chainNamespace:
|
|
763
|
+
chainNamespace: 'eip155'
|
|
708
764
|
});
|
|
709
765
|
|
|
710
766
|
state.loadingTransaction = false;
|
|
711
|
-
|
|
712
|
-
SnackController.showSuccess(snackbarSuccessMessage, true);
|
|
767
|
+
SnackController.showSuccess(snackbarSuccessMessage);
|
|
713
768
|
EventsController.sendEvent({
|
|
714
769
|
type: 'track',
|
|
715
770
|
event: 'SWAP_SUCCESS',
|
|
716
771
|
properties: {
|
|
717
|
-
network:
|
|
772
|
+
network: NetworkController.state.caipNetwork?.id || '',
|
|
718
773
|
swapFromToken: this.state.sourceToken?.symbol || '',
|
|
719
774
|
swapToToken: this.state.toToken?.symbol || '',
|
|
720
775
|
swapFromAmount: this.state.sourceTokenAmount || '',
|
|
721
776
|
swapToAmount: this.state.toTokenAmount || '',
|
|
722
|
-
isSmartAccount:
|
|
777
|
+
isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount'
|
|
723
778
|
}
|
|
724
779
|
});
|
|
725
|
-
|
|
726
|
-
|
|
780
|
+
SwapController.resetState();
|
|
781
|
+
|
|
782
|
+
if (!isAuthConnector) {
|
|
783
|
+
RouterController.replace('AccountDefault');
|
|
784
|
+
}
|
|
785
|
+
|
|
727
786
|
SwapController.getMyTokensWithBalance(forceUpdateAddresses);
|
|
787
|
+
AccountController.fetchTokenBalance();
|
|
728
788
|
|
|
729
789
|
setTimeout(() => {
|
|
730
|
-
TransactionsController.fetchTransactions(
|
|
790
|
+
TransactionsController.fetchTransactions(AccountController.state.address, true);
|
|
731
791
|
}, 5000);
|
|
732
792
|
|
|
733
793
|
return transactionHash;
|
|
@@ -741,12 +801,12 @@ export const SwapController = {
|
|
|
741
801
|
event: 'SWAP_ERROR',
|
|
742
802
|
properties: {
|
|
743
803
|
message: error?.shortMessage ?? error?.message ?? 'Unknown',
|
|
744
|
-
network:
|
|
804
|
+
network: NetworkController.state.caipNetwork?.id || '',
|
|
745
805
|
swapFromToken: this.state.sourceToken?.symbol || '',
|
|
746
806
|
swapToToken: this.state.toToken?.symbol || '',
|
|
747
807
|
swapFromAmount: this.state.sourceTokenAmount || '',
|
|
748
808
|
swapToAmount: this.state.toTokenAmount || '',
|
|
749
|
-
isSmartAccount:
|
|
809
|
+
isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount'
|
|
750
810
|
}
|
|
751
811
|
});
|
|
752
812
|
|
|
@@ -754,45 +814,8 @@ export const SwapController = {
|
|
|
754
814
|
}
|
|
755
815
|
},
|
|
756
816
|
|
|
757
|
-
clearTransactionLoaders() {
|
|
758
|
-
state.loadingApprovalTransaction = false;
|
|
759
|
-
state.loadingBuildTransaction = false;
|
|
760
|
-
state.loadingTransaction = false;
|
|
761
|
-
},
|
|
762
|
-
|
|
763
|
-
clearTokens() {
|
|
764
|
-
state.sourceToken = initialState.sourceToken;
|
|
765
|
-
state.sourceTokenAmount = initialState.sourceTokenAmount;
|
|
766
|
-
state.sourceTokenPriceInUSD = initialState.sourceTokenPriceInUSD;
|
|
767
|
-
state.toToken = initialState.toToken;
|
|
768
|
-
state.toTokenAmount = initialState.toTokenAmount;
|
|
769
|
-
state.toTokenPriceInUSD = initialState.toTokenPriceInUSD;
|
|
770
|
-
state.inputError = initialState.inputError;
|
|
771
|
-
state.loadingApprovalTransaction = initialState.loadingApprovalTransaction;
|
|
772
|
-
state.loadingBuildTransaction = initialState.loadingBuildTransaction;
|
|
773
|
-
state.loadingTransaction = initialState.loadingTransaction;
|
|
774
|
-
state.fetchError = initialState.fetchError;
|
|
775
|
-
state.transactionError = initialState.transactionError;
|
|
776
|
-
state.swapTransaction = initialState.swapTransaction;
|
|
777
|
-
state.approvalTransaction = initialState.approvalTransaction;
|
|
778
|
-
},
|
|
779
|
-
|
|
780
|
-
resetState() {
|
|
781
|
-
this.clearTokens();
|
|
782
|
-
state.myTokensWithBalance = initialState.myTokensWithBalance;
|
|
783
|
-
state.tokensPriceMap = initialState.tokensPriceMap;
|
|
784
|
-
state.networkPrice = initialState.networkPrice;
|
|
785
|
-
state.networkTokenSymbol = initialState.networkTokenSymbol;
|
|
786
|
-
},
|
|
787
|
-
|
|
788
817
|
// -- Checks -------------------------------------------- //
|
|
789
818
|
hasInsufficientToken(sourceTokenAmount: string, sourceTokenAddress: string) {
|
|
790
|
-
const { balances } = ConnectionsController.state;
|
|
791
|
-
const networkToken = balances?.find(t => t.address === undefined);
|
|
792
|
-
const networkBalanceInUSD = networkToken
|
|
793
|
-
? NumberUtil.multiply(networkToken.quantity?.numeric ?? '0', networkToken.price).toString()
|
|
794
|
-
: '0';
|
|
795
|
-
|
|
796
819
|
const isInsufficientSourceTokenForSwap = SwapCalculationUtil.isInsufficientSourceTokenForSwap(
|
|
797
820
|
sourceTokenAmount,
|
|
798
821
|
sourceTokenAddress,
|
|
@@ -800,12 +823,12 @@ export const SwapController = {
|
|
|
800
823
|
);
|
|
801
824
|
|
|
802
825
|
let insufficientNetworkTokenForGas = true;
|
|
803
|
-
if (
|
|
826
|
+
if (AccountController.state.preferredAccountType === 'smartAccount') {
|
|
804
827
|
// Smart Accounts may pay gas in any ERC20 token
|
|
805
828
|
insufficientNetworkTokenForGas = false;
|
|
806
829
|
} else {
|
|
807
830
|
insufficientNetworkTokenForGas = SwapCalculationUtil.isInsufficientNetworkTokenForGas(
|
|
808
|
-
networkBalanceInUSD,
|
|
831
|
+
state.networkBalanceInUSD,
|
|
809
832
|
state.gasPriceInUSD
|
|
810
833
|
);
|
|
811
834
|
}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { Appearance } from 'react-native';
|
|
2
1
|
import { proxy, subscribe as sub } from 'valtio';
|
|
3
2
|
import type { ThemeMode, ThemeVariables } from '@reown/appkit-common-react-native';
|
|
4
3
|
|
|
5
4
|
// -- Types --------------------------------------------- //
|
|
6
5
|
export interface ThemeControllerState {
|
|
7
6
|
themeMode?: ThemeMode;
|
|
8
|
-
themeVariables
|
|
7
|
+
themeVariables: ThemeVariables;
|
|
9
8
|
}
|
|
10
9
|
|
|
11
10
|
// -- State --------------------------------------------- //
|
|
@@ -23,18 +22,10 @@ export const ThemeController = {
|
|
|
23
22
|
},
|
|
24
23
|
|
|
25
24
|
setThemeMode(themeMode: ThemeControllerState['themeMode']) {
|
|
26
|
-
|
|
27
|
-
state.themeMode = Appearance.getColorScheme() as ThemeMode;
|
|
28
|
-
} else {
|
|
29
|
-
state.themeMode = themeMode;
|
|
30
|
-
}
|
|
25
|
+
state.themeMode = themeMode;
|
|
31
26
|
},
|
|
32
27
|
|
|
33
28
|
setThemeVariables(themeVariables: ThemeControllerState['themeVariables']) {
|
|
34
|
-
if (!themeVariables) {
|
|
35
|
-
state.themeVariables = {};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
29
|
state.themeVariables = { ...state.themeVariables, ...themeVariables };
|
|
39
30
|
}
|
|
40
31
|
};
|