@reown/appkit-core-react-native 1.1.1 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/lib/commonjs/controllers/ApiController.js +1 -1
  2. package/lib/commonjs/controllers/BlockchainApiController.js +107 -21
  3. package/lib/commonjs/controllers/BlockchainApiController.js.map +1 -1
  4. package/lib/commonjs/controllers/ConnectionController.js +4 -2
  5. package/lib/commonjs/controllers/ConnectionController.js.map +1 -1
  6. package/lib/commonjs/controllers/EventsController.js +7 -0
  7. package/lib/commonjs/controllers/EventsController.js.map +1 -1
  8. package/lib/commonjs/controllers/NetworkController.js +6 -0
  9. package/lib/commonjs/controllers/NetworkController.js.map +1 -1
  10. package/lib/commonjs/controllers/RouterController.js.map +1 -1
  11. package/lib/commonjs/controllers/SnackController.js +5 -0
  12. package/lib/commonjs/controllers/SnackController.js.map +1 -1
  13. package/lib/commonjs/controllers/SwapController.js +578 -6
  14. package/lib/commonjs/controllers/SwapController.js.map +1 -1
  15. package/lib/commonjs/controllers/ThemeController.js +1 -1
  16. package/lib/commonjs/controllers/ThemeController.js.map +1 -1
  17. package/lib/commonjs/index.js +14 -0
  18. package/lib/commonjs/index.js.map +1 -1
  19. package/lib/commonjs/utils/ConnectionUtil.js +33 -0
  20. package/lib/commonjs/utils/ConnectionUtil.js.map +1 -0
  21. package/lib/commonjs/utils/ConstantsUtil.js +29 -0
  22. package/lib/commonjs/utils/ConstantsUtil.js.map +1 -1
  23. package/lib/commonjs/utils/CoreHelperUtil.js +12 -12
  24. package/lib/commonjs/utils/CoreHelperUtil.js.map +1 -1
  25. package/lib/commonjs/utils/NetworkUtil.js +46 -0
  26. package/lib/commonjs/utils/NetworkUtil.js.map +1 -0
  27. package/lib/commonjs/utils/RouterUtil.js +1 -1
  28. package/lib/commonjs/utils/RouterUtil.js.map +1 -1
  29. package/lib/commonjs/utils/SwapApiUtil.js +58 -0
  30. package/lib/commonjs/utils/SwapApiUtil.js.map +1 -1
  31. package/lib/commonjs/utils/SwapCalculationUtil.js +73 -0
  32. package/lib/commonjs/utils/SwapCalculationUtil.js.map +1 -1
  33. package/lib/module/controllers/ApiController.js +1 -1
  34. package/lib/module/controllers/BlockchainApiController.js +107 -21
  35. package/lib/module/controllers/BlockchainApiController.js.map +1 -1
  36. package/lib/module/controllers/ConnectionController.js +4 -2
  37. package/lib/module/controllers/ConnectionController.js.map +1 -1
  38. package/lib/module/controllers/EventsController.js +7 -0
  39. package/lib/module/controllers/EventsController.js.map +1 -1
  40. package/lib/module/controllers/NetworkController.js +6 -0
  41. package/lib/module/controllers/NetworkController.js.map +1 -1
  42. package/lib/module/controllers/RouterController.js.map +1 -1
  43. package/lib/module/controllers/SnackController.js +5 -0
  44. package/lib/module/controllers/SnackController.js.map +1 -1
  45. package/lib/module/controllers/SwapController.js +578 -6
  46. package/lib/module/controllers/SwapController.js.map +1 -1
  47. package/lib/module/controllers/ThemeController.js +1 -1
  48. package/lib/module/controllers/ThemeController.js.map +1 -1
  49. package/lib/module/index.js +2 -0
  50. package/lib/module/index.js.map +1 -1
  51. package/lib/module/utils/ConnectionUtil.js +27 -0
  52. package/lib/module/utils/ConnectionUtil.js.map +1 -0
  53. package/lib/module/utils/ConstantsUtil.js +29 -0
  54. package/lib/module/utils/ConstantsUtil.js.map +1 -1
  55. package/lib/module/utils/CoreHelperUtil.js +12 -12
  56. package/lib/module/utils/CoreHelperUtil.js.map +1 -1
  57. package/lib/module/utils/NetworkUtil.js +40 -0
  58. package/lib/module/utils/NetworkUtil.js.map +1 -0
  59. package/lib/module/utils/RouterUtil.js +1 -1
  60. package/lib/module/utils/RouterUtil.js.map +1 -1
  61. package/lib/module/utils/SwapApiUtil.js +58 -0
  62. package/lib/module/utils/SwapApiUtil.js.map +1 -1
  63. package/lib/module/utils/SwapCalculationUtil.js +73 -1
  64. package/lib/module/utils/SwapCalculationUtil.js.map +1 -1
  65. package/lib/typescript/controllers/ApiController.d.ts +1 -1
  66. package/lib/typescript/controllers/BlockchainApiController.d.ts +6 -1
  67. package/lib/typescript/controllers/BlockchainApiController.d.ts.map +1 -1
  68. package/lib/typescript/controllers/ConnectionController.d.ts +3 -1
  69. package/lib/typescript/controllers/ConnectionController.d.ts.map +1 -1
  70. package/lib/typescript/controllers/EventsController.d.ts +2 -1
  71. package/lib/typescript/controllers/EventsController.d.ts.map +1 -1
  72. package/lib/typescript/controllers/NetworkController.d.ts +1 -0
  73. package/lib/typescript/controllers/NetworkController.d.ts.map +1 -1
  74. package/lib/typescript/controllers/RouterController.d.ts +3 -2
  75. package/lib/typescript/controllers/RouterController.d.ts.map +1 -1
  76. package/lib/typescript/controllers/SnackController.d.ts +2 -1
  77. package/lib/typescript/controllers/SnackController.d.ts.map +1 -1
  78. package/lib/typescript/controllers/SwapController.d.ts +87 -0
  79. package/lib/typescript/controllers/SwapController.d.ts.map +1 -1
  80. package/lib/typescript/controllers/ThemeController.d.ts +2 -2
  81. package/lib/typescript/controllers/ThemeController.d.ts.map +1 -1
  82. package/lib/typescript/index.d.ts +2 -0
  83. package/lib/typescript/index.d.ts.map +1 -1
  84. package/lib/typescript/utils/ConnectionUtil.d.ts +4 -0
  85. package/lib/typescript/utils/ConnectionUtil.d.ts.map +1 -0
  86. package/lib/typescript/utils/ConstantsUtil.d.ts +4 -0
  87. package/lib/typescript/utils/ConstantsUtil.d.ts.map +1 -1
  88. package/lib/typescript/utils/CoreHelperUtil.d.ts +2 -2
  89. package/lib/typescript/utils/CoreHelperUtil.d.ts.map +1 -1
  90. package/lib/typescript/utils/NetworkUtil.d.ts +8 -0
  91. package/lib/typescript/utils/NetworkUtil.d.ts.map +1 -0
  92. package/lib/typescript/utils/RouterUtil.d.ts.map +1 -1
  93. package/lib/typescript/utils/SwapApiUtil.d.ts +8 -0
  94. package/lib/typescript/utils/SwapApiUtil.d.ts.map +1 -1
  95. package/lib/typescript/utils/SwapCalculationUtil.d.ts +19 -0
  96. package/lib/typescript/utils/SwapCalculationUtil.d.ts.map +1 -1
  97. package/lib/typescript/utils/TypeUtil.d.ts +147 -6
  98. package/lib/typescript/utils/TypeUtil.d.ts.map +1 -1
  99. package/package.json +2 -2
  100. package/src/controllers/ApiController.ts +1 -1
  101. package/src/controllers/BlockchainApiController.ts +114 -17
  102. package/src/controllers/ConnectionController.ts +6 -2
  103. package/src/controllers/EventsController.ts +9 -1
  104. package/src/controllers/NetworkController.ts +8 -0
  105. package/src/controllers/RouterController.ts +6 -1
  106. package/src/controllers/SnackController.ts +7 -1
  107. package/src/controllers/SwapController.ts +759 -6
  108. package/src/controllers/ThemeController.ts +3 -3
  109. package/src/index.ts +2 -0
  110. package/src/utils/ConnectionUtil.ts +27 -0
  111. package/src/utils/ConstantsUtil.ts +120 -0
  112. package/src/utils/CoreHelperUtil.ts +20 -15
  113. package/src/utils/NetworkUtil.ts +33 -0
  114. package/src/utils/RouterUtil.ts +4 -1
  115. package/src/utils/SwapApiUtil.ts +89 -0
  116. package/src/utils/SwapCalculationUtil.ts +125 -0
  117. package/src/utils/TypeUtil.ts +214 -10
@@ -1,15 +1,15 @@
1
1
  import { proxy, subscribe as sub } from 'valtio';
2
- import type { ThemeMode, ThemeVariables } from '../utils/TypeUtil';
2
+ import type { ThemeMode, ThemeVariables } from '@reown/appkit-common-react-native';
3
3
 
4
4
  // -- Types --------------------------------------------- //
5
5
  export interface ThemeControllerState {
6
- themeMode: ThemeMode;
6
+ themeMode?: ThemeMode;
7
7
  themeVariables: ThemeVariables;
8
8
  }
9
9
 
10
10
  // -- State --------------------------------------------- //
11
11
  const state = proxy<ThemeControllerState>({
12
- themeMode: 'dark',
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
+ };
@@ -8,7 +8,10 @@ export const RouterUtil = {
8
8
  }
9
9
 
10
10
  const { history } = RouterController.state;
11
- const networkSelectIndex = history.findIndex(name => name === 'Networks');
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 {
@@ -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
  };