@reown/appkit-core-react-native 1.1.1 → 1.2.0
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/ApiController.js +1 -1
- package/lib/commonjs/controllers/BlockchainApiController.js +107 -21
- package/lib/commonjs/controllers/BlockchainApiController.js.map +1 -1
- package/lib/commonjs/controllers/ConnectionController.js +4 -2
- package/lib/commonjs/controllers/ConnectionController.js.map +1 -1
- package/lib/commonjs/controllers/NetworkController.js +6 -0
- package/lib/commonjs/controllers/NetworkController.js.map +1 -1
- package/lib/commonjs/controllers/RouterController.js.map +1 -1
- package/lib/commonjs/controllers/SnackController.js +5 -0
- package/lib/commonjs/controllers/SnackController.js.map +1 -1
- package/lib/commonjs/controllers/SwapController.js +578 -6
- package/lib/commonjs/controllers/SwapController.js.map +1 -1
- package/lib/commonjs/controllers/ThemeController.js +1 -1
- package/lib/commonjs/controllers/ThemeController.js.map +1 -1
- package/lib/commonjs/index.js +14 -0
- package/lib/commonjs/index.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 +29 -0
- package/lib/commonjs/utils/ConstantsUtil.js.map +1 -1
- package/lib/commonjs/utils/CoreHelperUtil.js +12 -12
- package/lib/commonjs/utils/CoreHelperUtil.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/RouterUtil.js +1 -1
- package/lib/commonjs/utils/RouterUtil.js.map +1 -1
- package/lib/commonjs/utils/SwapApiUtil.js +58 -0
- package/lib/commonjs/utils/SwapApiUtil.js.map +1 -1
- package/lib/commonjs/utils/SwapCalculationUtil.js +73 -0
- package/lib/commonjs/utils/SwapCalculationUtil.js.map +1 -1
- package/lib/module/controllers/ApiController.js +1 -1
- package/lib/module/controllers/BlockchainApiController.js +107 -21
- package/lib/module/controllers/BlockchainApiController.js.map +1 -1
- package/lib/module/controllers/ConnectionController.js +4 -2
- package/lib/module/controllers/ConnectionController.js.map +1 -1
- package/lib/module/controllers/NetworkController.js +6 -0
- package/lib/module/controllers/NetworkController.js.map +1 -1
- package/lib/module/controllers/RouterController.js.map +1 -1
- package/lib/module/controllers/SnackController.js +5 -0
- package/lib/module/controllers/SnackController.js.map +1 -1
- package/lib/module/controllers/SwapController.js +578 -6
- package/lib/module/controllers/SwapController.js.map +1 -1
- package/lib/module/controllers/ThemeController.js +1 -1
- package/lib/module/controllers/ThemeController.js.map +1 -1
- package/lib/module/index.js +2 -0
- package/lib/module/index.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 +29 -0
- package/lib/module/utils/ConstantsUtil.js.map +1 -1
- package/lib/module/utils/CoreHelperUtil.js +12 -12
- package/lib/module/utils/CoreHelperUtil.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/RouterUtil.js +1 -1
- package/lib/module/utils/RouterUtil.js.map +1 -1
- package/lib/module/utils/SwapApiUtil.js +58 -0
- package/lib/module/utils/SwapApiUtil.js.map +1 -1
- package/lib/module/utils/SwapCalculationUtil.js +73 -1
- package/lib/module/utils/SwapCalculationUtil.js.map +1 -1
- package/lib/typescript/controllers/ApiController.d.ts +1 -1
- package/lib/typescript/controllers/BlockchainApiController.d.ts +6 -1
- package/lib/typescript/controllers/BlockchainApiController.d.ts.map +1 -1
- package/lib/typescript/controllers/ConnectionController.d.ts +3 -1
- package/lib/typescript/controllers/ConnectionController.d.ts.map +1 -1
- package/lib/typescript/controllers/NetworkController.d.ts +1 -0
- package/lib/typescript/controllers/NetworkController.d.ts.map +1 -1
- package/lib/typescript/controllers/RouterController.d.ts +3 -2
- package/lib/typescript/controllers/RouterController.d.ts.map +1 -1
- package/lib/typescript/controllers/SnackController.d.ts +2 -1
- package/lib/typescript/controllers/SnackController.d.ts.map +1 -1
- package/lib/typescript/controllers/SwapController.d.ts +87 -0
- package/lib/typescript/controllers/SwapController.d.ts.map +1 -1
- package/lib/typescript/controllers/ThemeController.d.ts +2 -2
- package/lib/typescript/controllers/ThemeController.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +2 -0
- package/lib/typescript/index.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 +4 -0
- package/lib/typescript/utils/ConstantsUtil.d.ts.map +1 -1
- package/lib/typescript/utils/CoreHelperUtil.d.ts +2 -2
- package/lib/typescript/utils/CoreHelperUtil.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/RouterUtil.d.ts.map +1 -1
- package/lib/typescript/utils/SwapApiUtil.d.ts +8 -0
- package/lib/typescript/utils/SwapApiUtil.d.ts.map +1 -1
- package/lib/typescript/utils/SwapCalculationUtil.d.ts +19 -0
- package/lib/typescript/utils/SwapCalculationUtil.d.ts.map +1 -1
- package/lib/typescript/utils/TypeUtil.d.ts +146 -6
- package/lib/typescript/utils/TypeUtil.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/controllers/ApiController.ts +1 -1
- package/src/controllers/BlockchainApiController.ts +114 -17
- package/src/controllers/ConnectionController.ts +6 -2
- package/src/controllers/NetworkController.ts +8 -0
- package/src/controllers/RouterController.ts +6 -1
- package/src/controllers/SnackController.ts +7 -1
- package/src/controllers/SwapController.ts +759 -6
- package/src/controllers/ThemeController.ts +3 -3
- package/src/index.ts +2 -0
- package/src/utils/ConnectionUtil.ts +27 -0
- package/src/utils/ConstantsUtil.ts +120 -0
- package/src/utils/CoreHelperUtil.ts +20 -15
- package/src/utils/NetworkUtil.ts +33 -0
- package/src/utils/RouterUtil.ts +4 -1
- package/src/utils/SwapApiUtil.ts +89 -0
- package/src/utils/SwapCalculationUtil.ts +125 -0
- package/src/utils/TypeUtil.ts +169 -10
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { proxy, subscribe as sub } from 'valtio';
|
|
2
|
-
import type { ThemeMode, ThemeVariables } from '
|
|
2
|
+
import type { ThemeMode, ThemeVariables } from '@reown/appkit-common-react-native';
|
|
3
3
|
|
|
4
4
|
// -- Types --------------------------------------------- //
|
|
5
5
|
export interface ThemeControllerState {
|
|
6
|
-
themeMode
|
|
6
|
+
themeMode?: ThemeMode;
|
|
7
7
|
themeVariables: ThemeVariables;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
// -- State --------------------------------------------- //
|
|
11
11
|
const state = proxy<ThemeControllerState>({
|
|
12
|
-
themeMode:
|
|
12
|
+
themeMode: undefined,
|
|
13
13
|
themeVariables: {}
|
|
14
14
|
});
|
|
15
15
|
|
package/src/index.ts
CHANGED
|
@@ -61,10 +61,12 @@ export { WebviewController, type WebviewControllerState } from './controllers/We
|
|
|
61
61
|
// -- Utils -------------------------------------------------------------------
|
|
62
62
|
export { ApiUtil } from './utils/ApiUtil';
|
|
63
63
|
export { AssetUtil } from './utils/AssetUtil';
|
|
64
|
+
export { ConnectionUtil } from './utils/ConnectionUtil';
|
|
64
65
|
export { ConstantsUtil } from './utils/ConstantsUtil';
|
|
65
66
|
export { CoreHelperUtil } from './utils/CoreHelperUtil';
|
|
66
67
|
export { StorageUtil } from './utils/StorageUtil';
|
|
67
68
|
export { EventUtil } from './utils/EventUtil';
|
|
68
69
|
export { RouterUtil } from './utils/RouterUtil';
|
|
70
|
+
export { NetworkUtil } from './utils/NetworkUtil';
|
|
69
71
|
|
|
70
72
|
export type * from './utils/TypeUtil';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AccountController } from '../controllers/AccountController';
|
|
2
|
+
import { ConnectionController } from '../controllers/ConnectionController';
|
|
3
|
+
import { EventsController } from '../controllers/EventsController';
|
|
4
|
+
import { ModalController } from '../controllers/ModalController';
|
|
5
|
+
import { RouterController } from '../controllers/RouterController';
|
|
6
|
+
import { TransactionsController } from '../controllers/TransactionsController';
|
|
7
|
+
|
|
8
|
+
export const ConnectionUtil = {
|
|
9
|
+
async disconnect() {
|
|
10
|
+
try {
|
|
11
|
+
await ConnectionController.disconnect();
|
|
12
|
+
ModalController.close();
|
|
13
|
+
AccountController.setIsConnected(false);
|
|
14
|
+
RouterController.reset('Connect');
|
|
15
|
+
TransactionsController.resetTransactions();
|
|
16
|
+
EventsController.sendEvent({
|
|
17
|
+
type: 'track',
|
|
18
|
+
event: 'DISCONNECT_SUCCESS'
|
|
19
|
+
});
|
|
20
|
+
} catch (error) {
|
|
21
|
+
EventsController.sendEvent({
|
|
22
|
+
type: 'track',
|
|
23
|
+
event: 'DISCONNECT_ERROR'
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Features } from './TypeUtil';
|
|
2
2
|
|
|
3
3
|
const defaultFeatures: Features = {
|
|
4
|
+
swaps: true,
|
|
4
5
|
email: true,
|
|
5
6
|
emailShowWallets: true,
|
|
6
7
|
socials: ['x', 'discord', 'apple']
|
|
@@ -19,5 +20,124 @@ export const ConstantsUtil = {
|
|
|
19
20
|
|
|
20
21
|
NATIVE_TOKEN_ADDRESS: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
|
|
21
22
|
|
|
23
|
+
SWAP_SUGGESTED_TOKENS: [
|
|
24
|
+
'ETH',
|
|
25
|
+
'UNI',
|
|
26
|
+
'1INCH',
|
|
27
|
+
'AAVE',
|
|
28
|
+
'SOL',
|
|
29
|
+
'ADA',
|
|
30
|
+
'AVAX',
|
|
31
|
+
'DOT',
|
|
32
|
+
'LINK',
|
|
33
|
+
'NITRO',
|
|
34
|
+
'GAIA',
|
|
35
|
+
'MILK',
|
|
36
|
+
'TRX',
|
|
37
|
+
'NEAR',
|
|
38
|
+
'GNO',
|
|
39
|
+
'WBTC',
|
|
40
|
+
'DAI',
|
|
41
|
+
'WETH',
|
|
42
|
+
'USDC',
|
|
43
|
+
'USDT',
|
|
44
|
+
'ARB',
|
|
45
|
+
'BAL',
|
|
46
|
+
'BICO',
|
|
47
|
+
'CRV',
|
|
48
|
+
'ENS',
|
|
49
|
+
'MATIC',
|
|
50
|
+
'OP'
|
|
51
|
+
],
|
|
52
|
+
|
|
53
|
+
SWAP_POPULAR_TOKENS: [
|
|
54
|
+
'ETH',
|
|
55
|
+
'UNI',
|
|
56
|
+
'1INCH',
|
|
57
|
+
'AAVE',
|
|
58
|
+
'SOL',
|
|
59
|
+
'ADA',
|
|
60
|
+
'AVAX',
|
|
61
|
+
'DOT',
|
|
62
|
+
'LINK',
|
|
63
|
+
'NITRO',
|
|
64
|
+
'GAIA',
|
|
65
|
+
'MILK',
|
|
66
|
+
'TRX',
|
|
67
|
+
'NEAR',
|
|
68
|
+
'GNO',
|
|
69
|
+
'WBTC',
|
|
70
|
+
'DAI',
|
|
71
|
+
'WETH',
|
|
72
|
+
'USDC',
|
|
73
|
+
'USDT',
|
|
74
|
+
'ARB',
|
|
75
|
+
'BAL',
|
|
76
|
+
'BICO',
|
|
77
|
+
'CRV',
|
|
78
|
+
'ENS',
|
|
79
|
+
'MATIC',
|
|
80
|
+
'OP',
|
|
81
|
+
'METAL',
|
|
82
|
+
'DAI',
|
|
83
|
+
'CHAMP',
|
|
84
|
+
'WOLF',
|
|
85
|
+
'SALE',
|
|
86
|
+
'BAL',
|
|
87
|
+
'BUSD',
|
|
88
|
+
'MUST',
|
|
89
|
+
'BTCpx',
|
|
90
|
+
'ROUTE',
|
|
91
|
+
'HEX',
|
|
92
|
+
'WELT',
|
|
93
|
+
'amDAI',
|
|
94
|
+
'VSQ',
|
|
95
|
+
'VISION',
|
|
96
|
+
'AURUM',
|
|
97
|
+
'pSP',
|
|
98
|
+
'SNX',
|
|
99
|
+
'VC',
|
|
100
|
+
'LINK',
|
|
101
|
+
'CHP',
|
|
102
|
+
'amUSDT',
|
|
103
|
+
'SPHERE',
|
|
104
|
+
'FOX',
|
|
105
|
+
'GIDDY',
|
|
106
|
+
'GFC',
|
|
107
|
+
'OMEN',
|
|
108
|
+
'OX_OLD',
|
|
109
|
+
'DE',
|
|
110
|
+
'WNT'
|
|
111
|
+
],
|
|
112
|
+
|
|
113
|
+
SWAP_SUPPORTED_NETWORKS: [
|
|
114
|
+
// Ethereum'
|
|
115
|
+
'eip155:1',
|
|
116
|
+
// Arbitrum One'
|
|
117
|
+
'eip155:42161',
|
|
118
|
+
// Optimism'
|
|
119
|
+
'eip155:10',
|
|
120
|
+
// ZKSync Era'
|
|
121
|
+
'eip155:324',
|
|
122
|
+
// Base'
|
|
123
|
+
'eip155:8453',
|
|
124
|
+
// BNB Smart Chain'
|
|
125
|
+
'eip155:56',
|
|
126
|
+
// Polygon'
|
|
127
|
+
'eip155:137',
|
|
128
|
+
// Gnosis'
|
|
129
|
+
'eip155:100',
|
|
130
|
+
// Avalanche'
|
|
131
|
+
'eip155:43114',
|
|
132
|
+
// Fantom'
|
|
133
|
+
'eip155:250',
|
|
134
|
+
// Klaytn'
|
|
135
|
+
'eip155:8217',
|
|
136
|
+
// Aurora
|
|
137
|
+
'eip155:1313161554'
|
|
138
|
+
],
|
|
139
|
+
|
|
140
|
+
CONVERT_SLIPPAGE_TOLERANCE: 1,
|
|
141
|
+
|
|
22
142
|
DEFAULT_FEATURES: defaultFeatures
|
|
23
143
|
};
|
|
@@ -4,7 +4,7 @@ import { Linking, Platform } from 'react-native';
|
|
|
4
4
|
import { ConstantsUtil as CommonConstants, type Balance } from '@reown/appkit-common-react-native';
|
|
5
5
|
|
|
6
6
|
import { ConstantsUtil } from './ConstantsUtil';
|
|
7
|
-
import type { CaipAddress, DataWallet, LinkingRecord } from './TypeUtil';
|
|
7
|
+
import type { CaipAddress, CaipNetwork, DataWallet, LinkingRecord } from './TypeUtil';
|
|
8
8
|
|
|
9
9
|
// -- Helpers -----------------------------------------------------------------
|
|
10
10
|
async function isAppInstalledIos(deepLink?: string): Promise<boolean> {
|
|
@@ -57,20 +57,6 @@ export const CoreHelperUtil = {
|
|
|
57
57
|
});
|
|
58
58
|
},
|
|
59
59
|
|
|
60
|
-
debounce(func: (...args: any[]) => unknown, timeout = 500) {
|
|
61
|
-
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
62
|
-
|
|
63
|
-
return (...args: unknown[]) => {
|
|
64
|
-
function next() {
|
|
65
|
-
func(...args);
|
|
66
|
-
}
|
|
67
|
-
if (timer) {
|
|
68
|
-
clearTimeout(timer);
|
|
69
|
-
}
|
|
70
|
-
timer = setTimeout(next, timeout);
|
|
71
|
-
};
|
|
72
|
-
},
|
|
73
|
-
|
|
74
60
|
isHttpUrl(url: string) {
|
|
75
61
|
return url.startsWith('http://') || url.startsWith('https://');
|
|
76
62
|
},
|
|
@@ -282,5 +268,24 @@ export const CoreHelperUtil = {
|
|
|
282
268
|
const [dollars, pennies] = roundedNumber.split('.');
|
|
283
269
|
|
|
284
270
|
return { dollars, pennies };
|
|
271
|
+
},
|
|
272
|
+
|
|
273
|
+
sortNetworks(
|
|
274
|
+
approvedCaipNetworkIds: `${string}:${string}`[] | undefined,
|
|
275
|
+
requestedCaipNetworks: CaipNetwork[] = []
|
|
276
|
+
) {
|
|
277
|
+
const approvedIds = approvedCaipNetworkIds;
|
|
278
|
+
const requested = [...requestedCaipNetworks];
|
|
279
|
+
|
|
280
|
+
if (approvedIds?.length) {
|
|
281
|
+
requested?.sort((a, b) => {
|
|
282
|
+
if (approvedIds.includes(a.id) && !approvedIds.includes(b.id)) return -1;
|
|
283
|
+
if (approvedIds.includes(b.id) && !approvedIds.includes(a.id)) return 1;
|
|
284
|
+
|
|
285
|
+
return 0;
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
return requested;
|
|
285
290
|
}
|
|
286
291
|
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { RouterUtil } from './RouterUtil';
|
|
2
|
+
import { RouterController } from '../controllers/RouterController';
|
|
3
|
+
import { NetworkController } from '../controllers/NetworkController';
|
|
4
|
+
import { AccountController } from '../controllers/AccountController';
|
|
5
|
+
import { ConnectorController } from '../controllers/ConnectorController';
|
|
6
|
+
import { SwapController } from '../controllers/SwapController';
|
|
7
|
+
import type { CaipNetwork } from '../utils/TypeUtil';
|
|
8
|
+
|
|
9
|
+
export const NetworkUtil = {
|
|
10
|
+
async handleNetworkSwitch(network: CaipNetwork) {
|
|
11
|
+
const { isConnected } = AccountController.state;
|
|
12
|
+
const { caipNetwork, approvedCaipNetworkIds, supportsAllNetworks } = NetworkController.state;
|
|
13
|
+
const isAuthConnected = ConnectorController.state.connectedConnector === 'AUTH';
|
|
14
|
+
let eventData = null;
|
|
15
|
+
|
|
16
|
+
if (isConnected && caipNetwork?.id !== network.id) {
|
|
17
|
+
if (approvedCaipNetworkIds?.includes(network.id) && !isAuthConnected) {
|
|
18
|
+
await NetworkController.switchActiveNetwork(network);
|
|
19
|
+
RouterUtil.navigateAfterNetworkSwitch(['ConnectingSiwe']);
|
|
20
|
+
eventData = { type: 'SWITCH_NETWORK', networkId: network.id };
|
|
21
|
+
} else if (supportsAllNetworks || isAuthConnected) {
|
|
22
|
+
RouterController.push('SwitchNetwork', { network });
|
|
23
|
+
}
|
|
24
|
+
} else if (!isConnected) {
|
|
25
|
+
NetworkController.setCaipNetwork(network);
|
|
26
|
+
RouterController.push('Connect');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
SwapController.resetState();
|
|
30
|
+
|
|
31
|
+
return eventData;
|
|
32
|
+
}
|
|
33
|
+
};
|
package/src/utils/RouterUtil.ts
CHANGED
|
@@ -8,7 +8,10 @@ export const RouterUtil = {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
const { history } = RouterController.state;
|
|
11
|
-
const networkSelectIndex = history.findIndex(
|
|
11
|
+
const networkSelectIndex = history.findIndex(
|
|
12
|
+
name => name === 'Networks' || name === 'UnsupportedChain'
|
|
13
|
+
);
|
|
14
|
+
|
|
12
15
|
if (networkSelectIndex >= 1) {
|
|
13
16
|
RouterController.goBackToIndex(networkSelectIndex - 1);
|
|
14
17
|
} else {
|
package/src/utils/SwapApiUtil.ts
CHANGED
|
@@ -1,8 +1,97 @@
|
|
|
1
1
|
import { BlockchainApiController } from '../controllers/BlockchainApiController';
|
|
2
2
|
import { OptionsController } from '../controllers/OptionsController';
|
|
3
3
|
import { NetworkController } from '../controllers/NetworkController';
|
|
4
|
+
import type {
|
|
5
|
+
BlockchainApiBalanceResponse,
|
|
6
|
+
BlockchainApiSwapAllowanceRequest,
|
|
7
|
+
SwapTokenWithBalance
|
|
8
|
+
} from './TypeUtil';
|
|
9
|
+
import { AccountController } from '../controllers/AccountController';
|
|
10
|
+
import { ConnectionController } from '../controllers/ConnectionController';
|
|
4
11
|
|
|
5
12
|
export const SwapApiUtil = {
|
|
13
|
+
async getTokenList() {
|
|
14
|
+
const response = await BlockchainApiController.fetchSwapTokens({
|
|
15
|
+
projectId: OptionsController.state.projectId,
|
|
16
|
+
chainId: NetworkController.state.caipNetwork?.id
|
|
17
|
+
});
|
|
18
|
+
const tokens =
|
|
19
|
+
response?.tokens?.map(
|
|
20
|
+
token =>
|
|
21
|
+
({
|
|
22
|
+
...token,
|
|
23
|
+
eip2612: false,
|
|
24
|
+
quantity: {
|
|
25
|
+
decimals: '0',
|
|
26
|
+
numeric: '0'
|
|
27
|
+
},
|
|
28
|
+
price: 0,
|
|
29
|
+
value: 0
|
|
30
|
+
}) as SwapTokenWithBalance
|
|
31
|
+
) || [];
|
|
32
|
+
|
|
33
|
+
return tokens;
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
async fetchSwapAllowance({
|
|
37
|
+
tokenAddress,
|
|
38
|
+
userAddress,
|
|
39
|
+
sourceTokenAmount,
|
|
40
|
+
sourceTokenDecimals
|
|
41
|
+
}: Pick<BlockchainApiSwapAllowanceRequest, 'tokenAddress' | 'userAddress'> & {
|
|
42
|
+
sourceTokenAmount: string;
|
|
43
|
+
sourceTokenDecimals: number;
|
|
44
|
+
}) {
|
|
45
|
+
const projectId = OptionsController.state.projectId;
|
|
46
|
+
|
|
47
|
+
const response = await BlockchainApiController.fetchSwapAllowance({
|
|
48
|
+
projectId,
|
|
49
|
+
tokenAddress,
|
|
50
|
+
userAddress
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
if (response?.allowance && sourceTokenAmount && sourceTokenDecimals) {
|
|
54
|
+
const parsedValue =
|
|
55
|
+
ConnectionController.parseUnits(sourceTokenAmount, sourceTokenDecimals) || 0;
|
|
56
|
+
const hasAllowance = BigInt(response.allowance) >= parsedValue;
|
|
57
|
+
|
|
58
|
+
return hasAllowance;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return false;
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
async getMyTokensWithBalance(forceUpdate?: string) {
|
|
65
|
+
const address = AccountController.state.address;
|
|
66
|
+
const chainId = NetworkController.state.caipNetwork?.id;
|
|
67
|
+
|
|
68
|
+
if (!address) {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const response = await BlockchainApiController.getBalance(address, chainId, forceUpdate);
|
|
73
|
+
const balances = response?.balances.filter(balance => balance.quantity.decimals !== '0');
|
|
74
|
+
|
|
75
|
+
AccountController.setTokenBalance(balances);
|
|
76
|
+
|
|
77
|
+
return this.mapBalancesToSwapTokens(balances);
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
mapBalancesToSwapTokens(balances?: BlockchainApiBalanceResponse['balances']) {
|
|
81
|
+
return (
|
|
82
|
+
balances?.map(
|
|
83
|
+
token =>
|
|
84
|
+
({
|
|
85
|
+
...token,
|
|
86
|
+
address: token?.address || NetworkController.getActiveNetworkTokenAddress(),
|
|
87
|
+
decimals: parseInt(token.quantity.decimals, 10),
|
|
88
|
+
logoUri: token.iconUrl,
|
|
89
|
+
eip2612: false
|
|
90
|
+
}) as SwapTokenWithBalance
|
|
91
|
+
) || []
|
|
92
|
+
);
|
|
93
|
+
},
|
|
94
|
+
|
|
6
95
|
async fetchGasPrice() {
|
|
7
96
|
const projectId = OptionsController.state.projectId;
|
|
8
97
|
const caipNetwork = NetworkController.state.caipNetwork;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// -- Types --------------------------------------------- //
|
|
2
2
|
|
|
3
3
|
import { NumberUtil } from '@reown/appkit-common-react-native';
|
|
4
|
+
import type { SwapTokenWithBalance } from './TypeUtil';
|
|
4
5
|
|
|
5
6
|
// -- Util ---------------------------------------- //
|
|
6
7
|
export const SwapCalculationUtil = {
|
|
@@ -17,5 +18,129 @@ export const SwapCalculationUtil = {
|
|
|
17
18
|
const gasCostInUSD = networkPriceInUSD.multipliedBy(totalGasCostInEther);
|
|
18
19
|
|
|
19
20
|
return gasCostInUSD.toNumber();
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
getPriceImpact({
|
|
24
|
+
sourceTokenAmount,
|
|
25
|
+
sourceTokenPriceInUSD,
|
|
26
|
+
toTokenPriceInUSD,
|
|
27
|
+
toTokenAmount
|
|
28
|
+
}: {
|
|
29
|
+
sourceTokenAmount: string;
|
|
30
|
+
sourceTokenPriceInUSD: number;
|
|
31
|
+
toTokenPriceInUSD: number;
|
|
32
|
+
toTokenAmount: string;
|
|
33
|
+
}) {
|
|
34
|
+
const inputValue = NumberUtil.bigNumber(sourceTokenAmount).multipliedBy(sourceTokenPriceInUSD);
|
|
35
|
+
const outputValue = NumberUtil.bigNumber(toTokenAmount).multipliedBy(toTokenPriceInUSD);
|
|
36
|
+
const priceImpact = inputValue.minus(outputValue).dividedBy(inputValue).multipliedBy(100);
|
|
37
|
+
|
|
38
|
+
return priceImpact.toNumber();
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
getMaxSlippage(slippage: number, toTokenAmount: string) {
|
|
42
|
+
const slippageToleranceDecimal = NumberUtil.bigNumber(slippage).dividedBy(100);
|
|
43
|
+
const maxSlippageAmount = NumberUtil.multiply(toTokenAmount, slippageToleranceDecimal);
|
|
44
|
+
|
|
45
|
+
return maxSlippageAmount.toNumber();
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
getProviderFee(sourceTokenAmount: string, feePercentage = 0.0085) {
|
|
49
|
+
const providerFee = NumberUtil.bigNumber(sourceTokenAmount).multipliedBy(feePercentage);
|
|
50
|
+
|
|
51
|
+
return providerFee.toString();
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
getProviderFeePrice(
|
|
55
|
+
sourceTokenAmount: string,
|
|
56
|
+
sourceTokenPriceInUSD: number,
|
|
57
|
+
feePercentage = 0.0085
|
|
58
|
+
) {
|
|
59
|
+
const providerFee = SwapCalculationUtil.getProviderFee(sourceTokenAmount, feePercentage);
|
|
60
|
+
const providerFeePrice = NumberUtil.bigNumber(providerFee).multipliedBy(sourceTokenPriceInUSD);
|
|
61
|
+
|
|
62
|
+
return providerFeePrice.toNumber();
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
isInsufficientNetworkTokenForGas(networkBalanceInUSD: string, gasPriceInUSD: number | undefined) {
|
|
66
|
+
const gasPrice = gasPriceInUSD ?? '0';
|
|
67
|
+
|
|
68
|
+
if (NumberUtil.bigNumber(networkBalanceInUSD).isZero()) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return NumberUtil.bigNumber(NumberUtil.bigNumber(gasPrice)).isGreaterThan(networkBalanceInUSD);
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
isInsufficientSourceTokenForSwap(
|
|
76
|
+
sourceTokenAmount: string,
|
|
77
|
+
sourceTokenAddress: string,
|
|
78
|
+
balance: SwapTokenWithBalance[] | undefined
|
|
79
|
+
) {
|
|
80
|
+
const sourceTokenBalance = balance?.find(token => token.address === sourceTokenAddress)
|
|
81
|
+
?.quantity?.numeric;
|
|
82
|
+
|
|
83
|
+
const isInSufficientBalance = NumberUtil.bigNumber(sourceTokenBalance ?? '0').isLessThan(
|
|
84
|
+
sourceTokenAmount
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
return isInSufficientBalance;
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
getToTokenAmount({
|
|
91
|
+
sourceToken,
|
|
92
|
+
toToken,
|
|
93
|
+
sourceTokenPrice,
|
|
94
|
+
toTokenPrice,
|
|
95
|
+
sourceTokenAmount
|
|
96
|
+
}: {
|
|
97
|
+
sourceToken: SwapTokenWithBalance | undefined;
|
|
98
|
+
toToken: SwapTokenWithBalance | undefined;
|
|
99
|
+
sourceTokenPrice: number;
|
|
100
|
+
toTokenPrice: number;
|
|
101
|
+
sourceTokenAmount: string;
|
|
102
|
+
}) {
|
|
103
|
+
if (sourceTokenAmount === '0') {
|
|
104
|
+
return '0';
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (!sourceToken || !toToken) {
|
|
108
|
+
return '0';
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const sourceTokenDecimals = sourceToken.decimals;
|
|
112
|
+
const sourceTokenPriceInUSD = sourceTokenPrice;
|
|
113
|
+
const toTokenDecimals = toToken.decimals;
|
|
114
|
+
const toTokenPriceInUSD = toTokenPrice;
|
|
115
|
+
|
|
116
|
+
if (toTokenPriceInUSD <= 0) {
|
|
117
|
+
return '0';
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Calculate the provider fee (0.85% of the source token amount)
|
|
121
|
+
const providerFee = NumberUtil.bigNumber(sourceTokenAmount).multipliedBy(0.0085);
|
|
122
|
+
|
|
123
|
+
// Adjust the source token amount by subtracting the provider fee
|
|
124
|
+
const adjustedSourceTokenAmount = NumberUtil.bigNumber(sourceTokenAmount).minus(providerFee);
|
|
125
|
+
|
|
126
|
+
// Proceed with conversion using the adjusted source token amount
|
|
127
|
+
const sourceAmountInSmallestUnit = adjustedSourceTokenAmount.multipliedBy(
|
|
128
|
+
NumberUtil.bigNumber(10).pow(sourceTokenDecimals)
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
const priceRatio = NumberUtil.bigNumber(sourceTokenPriceInUSD).dividedBy(toTokenPriceInUSD);
|
|
132
|
+
|
|
133
|
+
const decimalDifference = sourceTokenDecimals - toTokenDecimals;
|
|
134
|
+
const toTokenAmountInSmallestUnit = sourceAmountInSmallestUnit
|
|
135
|
+
.multipliedBy(priceRatio)
|
|
136
|
+
.dividedBy(NumberUtil.bigNumber(10).pow(decimalDifference));
|
|
137
|
+
|
|
138
|
+
const toTokenAmount = toTokenAmountInSmallestUnit.dividedBy(
|
|
139
|
+
NumberUtil.bigNumber(10).pow(toTokenDecimals)
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
const amount = toTokenAmount.toFixed(toTokenDecimals).toString();
|
|
143
|
+
|
|
144
|
+
return amount;
|
|
20
145
|
}
|
|
21
146
|
};
|