@reown/appkit-core-react-native 0.0.0-feat-smart-account-20241016183051 → 0.0.0-feat-swaps-20241129153709

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 (112) hide show
  1. package/lib/commonjs/controllers/ApiController.js +19 -7
  2. package/lib/commonjs/controllers/ApiController.js.map +1 -1
  3. package/lib/commonjs/controllers/BlockchainApiController.js +163 -1
  4. package/lib/commonjs/controllers/BlockchainApiController.js.map +1 -1
  5. package/lib/commonjs/controllers/ConnectionController.js +5 -8
  6. package/lib/commonjs/controllers/ConnectionController.js.map +1 -1
  7. package/lib/commonjs/controllers/ConnectorController.js +9 -1
  8. package/lib/commonjs/controllers/ConnectorController.js.map +1 -1
  9. package/lib/commonjs/controllers/NetworkController.js +9 -0
  10. package/lib/commonjs/controllers/NetworkController.js.map +1 -1
  11. package/lib/commonjs/controllers/OptionsController.js +5 -1
  12. package/lib/commonjs/controllers/OptionsController.js.map +1 -1
  13. package/lib/commonjs/controllers/RouterController.js.map +1 -1
  14. package/lib/commonjs/controllers/SnackController.js +26 -1
  15. package/lib/commonjs/controllers/SnackController.js.map +1 -1
  16. package/lib/commonjs/controllers/SwapController.js +580 -6
  17. package/lib/commonjs/controllers/SwapController.js.map +1 -1
  18. package/lib/commonjs/controllers/WebviewController.js +13 -1
  19. package/lib/commonjs/controllers/WebviewController.js.map +1 -1
  20. package/lib/commonjs/utils/ApiUtil.js +9 -2
  21. package/lib/commonjs/utils/ApiUtil.js.map +1 -1
  22. package/lib/commonjs/utils/ConstantsUtil.js +30 -1
  23. package/lib/commonjs/utils/ConstantsUtil.js.map +1 -1
  24. package/lib/commonjs/utils/CoreHelperUtil.js +0 -12
  25. package/lib/commonjs/utils/CoreHelperUtil.js.map +1 -1
  26. package/lib/commonjs/utils/StorageUtil.js.map +1 -1
  27. package/lib/commonjs/utils/SwapApiUtil.js +58 -0
  28. package/lib/commonjs/utils/SwapApiUtil.js.map +1 -1
  29. package/lib/commonjs/utils/SwapCalculationUtil.js +73 -0
  30. package/lib/commonjs/utils/SwapCalculationUtil.js.map +1 -1
  31. package/lib/module/controllers/ApiController.js +19 -7
  32. package/lib/module/controllers/ApiController.js.map +1 -1
  33. package/lib/module/controllers/BlockchainApiController.js +163 -1
  34. package/lib/module/controllers/BlockchainApiController.js.map +1 -1
  35. package/lib/module/controllers/ConnectionController.js +5 -8
  36. package/lib/module/controllers/ConnectionController.js.map +1 -1
  37. package/lib/module/controllers/ConnectorController.js +9 -1
  38. package/lib/module/controllers/ConnectorController.js.map +1 -1
  39. package/lib/module/controllers/NetworkController.js +9 -0
  40. package/lib/module/controllers/NetworkController.js.map +1 -1
  41. package/lib/module/controllers/OptionsController.js +5 -1
  42. package/lib/module/controllers/OptionsController.js.map +1 -1
  43. package/lib/module/controllers/RouterController.js.map +1 -1
  44. package/lib/module/controllers/SnackController.js +26 -1
  45. package/lib/module/controllers/SnackController.js.map +1 -1
  46. package/lib/module/controllers/SwapController.js +579 -6
  47. package/lib/module/controllers/SwapController.js.map +1 -1
  48. package/lib/module/controllers/WebviewController.js +13 -1
  49. package/lib/module/controllers/WebviewController.js.map +1 -1
  50. package/lib/module/utils/ApiUtil.js +9 -2
  51. package/lib/module/utils/ApiUtil.js.map +1 -1
  52. package/lib/module/utils/ConstantsUtil.js +30 -1
  53. package/lib/module/utils/ConstantsUtil.js.map +1 -1
  54. package/lib/module/utils/CoreHelperUtil.js +0 -12
  55. package/lib/module/utils/CoreHelperUtil.js.map +1 -1
  56. package/lib/module/utils/StorageUtil.js.map +1 -1
  57. package/lib/module/utils/SwapApiUtil.js +58 -0
  58. package/lib/module/utils/SwapApiUtil.js.map +1 -1
  59. package/lib/module/utils/SwapCalculationUtil.js +73 -1
  60. package/lib/module/utils/SwapCalculationUtil.js.map +1 -1
  61. package/lib/typescript/controllers/ApiController.d.ts +3 -1
  62. package/lib/typescript/controllers/ApiController.d.ts.map +1 -1
  63. package/lib/typescript/controllers/BlockchainApiController.d.ts +6 -1
  64. package/lib/typescript/controllers/BlockchainApiController.d.ts.map +1 -1
  65. package/lib/typescript/controllers/ConnectionController.d.ts +3 -1
  66. package/lib/typescript/controllers/ConnectionController.d.ts.map +1 -1
  67. package/lib/typescript/controllers/ConnectorController.d.ts +1 -1
  68. package/lib/typescript/controllers/ConnectorController.d.ts.map +1 -1
  69. package/lib/typescript/controllers/NetworkController.d.ts +2 -0
  70. package/lib/typescript/controllers/NetworkController.d.ts.map +1 -1
  71. package/lib/typescript/controllers/OptionsController.d.ts +2 -0
  72. package/lib/typescript/controllers/OptionsController.d.ts.map +1 -1
  73. package/lib/typescript/controllers/RouterController.d.ts +3 -2
  74. package/lib/typescript/controllers/RouterController.d.ts.map +1 -1
  75. package/lib/typescript/controllers/SnackController.d.ts +9 -1
  76. package/lib/typescript/controllers/SnackController.d.ts.map +1 -1
  77. package/lib/typescript/controllers/SwapController.d.ts +87 -0
  78. package/lib/typescript/controllers/SwapController.d.ts.map +1 -1
  79. package/lib/typescript/controllers/WebviewController.d.ts +3 -0
  80. package/lib/typescript/controllers/WebviewController.d.ts.map +1 -1
  81. package/lib/typescript/utils/ApiUtil.d.ts +1 -0
  82. package/lib/typescript/utils/ApiUtil.d.ts.map +1 -1
  83. package/lib/typescript/utils/ConstantsUtil.d.ts +4 -0
  84. package/lib/typescript/utils/ConstantsUtil.d.ts.map +1 -1
  85. package/lib/typescript/utils/CoreHelperUtil.d.ts +0 -1
  86. package/lib/typescript/utils/CoreHelperUtil.d.ts.map +1 -1
  87. package/lib/typescript/utils/StorageUtil.d.ts +1 -1
  88. package/lib/typescript/utils/StorageUtil.d.ts.map +1 -1
  89. package/lib/typescript/utils/SwapApiUtil.d.ts +8 -0
  90. package/lib/typescript/utils/SwapApiUtil.d.ts.map +1 -1
  91. package/lib/typescript/utils/SwapCalculationUtil.d.ts +19 -0
  92. package/lib/typescript/utils/SwapCalculationUtil.d.ts.map +1 -1
  93. package/lib/typescript/utils/TypeUtil.d.ts +151 -5
  94. package/lib/typescript/utils/TypeUtil.d.ts.map +1 -1
  95. package/package.json +2 -2
  96. package/src/controllers/ApiController.ts +32 -17
  97. package/src/controllers/BlockchainApiController.ts +153 -1
  98. package/src/controllers/ConnectionController.ts +7 -8
  99. package/src/controllers/ConnectorController.ts +13 -1
  100. package/src/controllers/NetworkController.ts +15 -0
  101. package/src/controllers/OptionsController.ts +7 -1
  102. package/src/controllers/RouterController.ts +6 -1
  103. package/src/controllers/SnackController.ts +35 -2
  104. package/src/controllers/SwapController.ts +750 -6
  105. package/src/controllers/WebviewController.ts +16 -1
  106. package/src/utils/ApiUtil.ts +14 -6
  107. package/src/utils/ConstantsUtil.ts +121 -1
  108. package/src/utils/CoreHelperUtil.ts +0 -14
  109. package/src/utils/StorageUtil.ts +1 -1
  110. package/src/utils/SwapApiUtil.ts +89 -0
  111. package/src/utils/SwapCalculationUtil.ts +125 -0
  112. package/src/utils/TypeUtil.ts +171 -10
@@ -8,6 +8,7 @@ export interface WebviewControllerState {
8
8
  webviewUrl?: string;
9
9
  connecting?: boolean;
10
10
  connectingProvider?: SocialProvider;
11
+ processingAuth?: boolean;
11
12
  }
12
13
 
13
14
  // -- State --------------------------------------------- //
@@ -15,7 +16,8 @@ const state = proxy<WebviewControllerState>({
15
16
  frameViewVisible: false,
16
17
  webviewVisible: false,
17
18
  connecting: false,
18
- connectingProvider: undefined
19
+ connectingProvider: undefined,
20
+ processingAuth: false
19
21
  });
20
22
 
21
23
  // -- Controller ---------------------------------------- //
@@ -44,5 +46,18 @@ export const WebviewController = {
44
46
 
45
47
  setConnectingProvider(provider: WebviewControllerState['connectingProvider']) {
46
48
  state.connectingProvider = provider;
49
+ },
50
+
51
+ setProcessingAuth(processingAuth: WebviewControllerState['processingAuth']) {
52
+ state.processingAuth = processingAuth;
53
+ },
54
+
55
+ reset() {
56
+ state.frameViewVisible = false;
57
+ state.webviewVisible = false;
58
+ state.connecting = false;
59
+ state.connectingProvider = undefined;
60
+ state.processingAuth = false;
61
+ state.webviewUrl = undefined;
47
62
  }
48
63
  };
@@ -6,13 +6,21 @@ export const ApiUtil = {
6
6
  return CoreHelperUtil.getBundleId();
7
7
  },
8
8
 
9
- getUserAgent() {
10
- const reactNativeVersion = [
11
- Platform.constants.reactNativeVersion.major,
12
- Platform.constants.reactNativeVersion.minor,
13
- Platform.constants.reactNativeVersion.patch
9
+ getReactNativeVersion() {
10
+ return [
11
+ Platform.constants?.reactNativeVersion?.major,
12
+ Platform.constants?.reactNativeVersion?.minor,
13
+ Platform.constants?.reactNativeVersion?.patch
14
14
  ].join('.');
15
+ },
16
+
17
+ getUserAgent() {
18
+ const rnVersion = Platform.select({
19
+ ios: this.getReactNativeVersion(),
20
+ android: this.getReactNativeVersion(),
21
+ default: 'undefined'
22
+ });
15
23
 
16
- return `${Platform.OS}-${Platform.Version}@rn-${reactNativeVersion}`;
24
+ return `${Platform.OS}-${Platform.Version}@rn-${rnVersion}`;
17
25
  }
18
26
  };
@@ -1,9 +1,10 @@
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
- socials: ['x', 'discord', 'apple', 'facebook', 'farcaster']
7
+ socials: ['x', 'discord', 'apple', 'farcaster']
7
8
  };
8
9
 
9
10
  export const ConstantsUtil = {
@@ -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
  };
@@ -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
  },
@@ -92,7 +92,7 @@ export const StorageUtil = {
92
92
  }
93
93
  },
94
94
 
95
- async getConnectedConnector() {
95
+ async getConnectedConnector(): Promise<ConnectorType | undefined> {
96
96
  try {
97
97
  const connector = (await AsyncStorage.getItem(CONNECTED_CONNECTOR)) as ConnectorType;
98
98
 
@@ -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
  };