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