@xswap-link/sdk 0.3.5 → 0.4.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 (199) hide show
  1. package/.eslintrc.json +9 -5
  2. package/CHANGELOG.md +16 -0
  3. package/README.md +2 -1
  4. package/dist/index.d.mts +106 -20
  5. package/dist/index.d.ts +106 -20
  6. package/dist/index.global.js +856 -307
  7. package/dist/index.global.js.map +1 -0
  8. package/dist/index.js +105 -3564
  9. package/dist/index.js.map +1 -0
  10. package/dist/index.mjs +105 -3534
  11. package/dist/index.mjs.map +1 -0
  12. package/nodemon.json +1 -1
  13. package/package.json +16 -9
  14. package/postcss.config.js +8 -1
  15. package/src/{components → assets}/icons/ArrowDownIcon.tsx +1 -2
  16. package/src/assets/icons/ArrowDownLongIcon.tsx +12 -0
  17. package/src/{components → assets}/icons/ArrowLeftIcon.tsx +1 -5
  18. package/src/{components → assets}/icons/ArrowRightIcon.tsx +1 -5
  19. package/src/assets/icons/ArrowUpIcon.tsx +12 -0
  20. package/src/{components → assets}/icons/ArrowUpRightIcon.tsx +1 -5
  21. package/src/assets/icons/CashbacklIcon.tsx +28 -0
  22. package/src/{components → assets}/icons/CheckIcon.tsx +1 -5
  23. package/src/assets/icons/ChevronDownIcon.tsx +12 -0
  24. package/src/assets/icons/ChevronUpIcon.tsx +7 -0
  25. package/src/{components → assets}/icons/CircularProgressIcon.tsx +1 -2
  26. package/src/assets/icons/CloseIcon.tsx +15 -0
  27. package/src/{components → assets}/icons/CoinsIcon.tsx +0 -2
  28. package/src/assets/icons/CopyIcon.tsx +15 -0
  29. package/src/assets/icons/DotGreenIcon.tsx +12 -0
  30. package/src/{components → assets}/icons/DownArrorIcon.tsx +0 -2
  31. package/src/{components → assets}/icons/ErrorIcon.tsx +0 -1
  32. package/src/assets/icons/ErrorModalStatusIcon.tsx +31 -0
  33. package/src/assets/icons/HelpIcon.tsx +21 -0
  34. package/src/assets/icons/HistoryGradientBgIcon.tsx +32 -0
  35. package/src/assets/icons/HistoryIcon.tsx +12 -0
  36. package/src/{components → assets}/icons/HourGlassIcon.tsx +1 -5
  37. package/src/assets/icons/Icon.tsx +5 -0
  38. package/src/{components → assets}/icons/InfoIcon.tsx +0 -1
  39. package/src/assets/icons/LinkExternalIcon.tsx +15 -0
  40. package/src/{components → assets}/icons/PercentageIcon.tsx +0 -1
  41. package/src/assets/icons/RankIcon.tsx +28 -0
  42. package/src/assets/icons/SettingsGradientBgIcon.tsx +32 -0
  43. package/src/assets/icons/SettingsIcon.tsx +12 -0
  44. package/src/{components → assets}/icons/SignIcon.tsx +0 -2
  45. package/src/{components → assets}/icons/SuccessIcon.tsx +0 -1
  46. package/src/assets/icons/SuccessModalStatusIcon.tsx +31 -0
  47. package/src/assets/icons/ThumbUpRoundedIcon.tsx +15 -0
  48. package/src/{components → assets}/icons/TimerIcon.tsx +0 -1
  49. package/src/assets/icons/TokensIcon.tsx +16 -0
  50. package/src/assets/icons/WaitingIcon.tsx +15 -0
  51. package/src/{components → assets}/icons/XMarkIcon.tsx +1 -5
  52. package/src/assets/icons/XPowerIcon.tsx +28 -0
  53. package/src/{components → assets}/icons/index.ts +16 -0
  54. package/src/components/Alert/index.tsx +1 -1
  55. package/src/components/Button/index.tsx +57 -0
  56. package/src/components/MessageBar/SnackMessage.tsx +32 -0
  57. package/src/components/MessageBar/index.tsx +44 -0
  58. package/src/components/Modal/index.tsx +52 -0
  59. package/src/components/PoweredBy/index.tsx +12 -0
  60. package/src/components/SafeInput/index.tsx +51 -0
  61. package/src/components/Skeleton/index.tsx +5 -9
  62. package/src/components/Spinner/index.tsx +6 -8
  63. package/src/components/Swap/Header/Controls/index.tsx +57 -0
  64. package/src/components/Swap/Header/index.tsx +16 -0
  65. package/src/components/Swap/HistoryView/index.tsx +34 -0
  66. package/src/components/Swap/SettingsView/Delivery/index.tsx +42 -0
  67. package/src/components/Swap/SettingsView/Slippage/index.tsx +80 -0
  68. package/src/components/Swap/SettingsView/index.tsx +11 -0
  69. package/src/components/Swap/SwapView/ConfirmationView/TxOverview/ArrowIcon.tsx +13 -0
  70. package/src/components/Swap/SwapView/ConfirmationView/TxOverview/Header/index.tsx +37 -0
  71. package/src/components/Swap/SwapView/ConfirmationView/TxOverview/Steps/index.tsx +145 -0
  72. package/src/components/Swap/SwapView/ConfirmationView/TxOverview/SwapPanel/index.tsx +61 -0
  73. package/src/components/Swap/SwapView/ConfirmationView/TxOverview/index.tsx +291 -0
  74. package/src/components/Swap/SwapView/ConfirmationView/TxResult/TokenItem/index.tsx +24 -0
  75. package/src/components/Swap/SwapView/ConfirmationView/TxResult/index.tsx +84 -0
  76. package/src/components/Swap/SwapView/ConfirmationView/index.tsx +17 -0
  77. package/src/components/Swap/SwapView/FeesPanel/DeliveryInfo/index.tsx +25 -0
  78. package/src/components/Swap/SwapView/FeesPanel/Fee/index.tsx +18 -0
  79. package/src/components/Swap/SwapView/FeesPanel/Fees/index.tsx +71 -0
  80. package/src/components/Swap/SwapView/FeesPanel/index.tsx +67 -0
  81. package/src/components/Swap/SwapView/SwapButton/index.tsx +154 -0
  82. package/src/components/Swap/SwapView/SwapPanel/AmountPanel/Balance/index.tsx +23 -0
  83. package/src/components/Swap/SwapView/SwapPanel/AmountPanel/index.tsx +56 -0
  84. package/src/components/Swap/SwapView/SwapPanel/ChainPanel/ChainPicker/ChainItem/index.tsx +70 -0
  85. package/src/components/Swap/SwapView/SwapPanel/ChainPanel/ChainPicker/index.tsx +62 -0
  86. package/src/components/Swap/SwapView/SwapPanel/ChainPanel/index.tsx +74 -0
  87. package/src/components/Swap/SwapView/SwapPanel/MaxPanel/index.tsx +35 -0
  88. package/src/components/Swap/SwapView/SwapPanel/TokenPanel/TokenPicker/QuickPickTokenItem/index.tsx +40 -0
  89. package/src/components/Swap/SwapView/SwapPanel/TokenPanel/TokenPicker/TokenItem/index.tsx +62 -0
  90. package/src/components/Swap/SwapView/SwapPanel/TokenPanel/TokenPicker/index.tsx +399 -0
  91. package/src/components/Swap/SwapView/SwapPanel/TokenPanel/index.tsx +104 -0
  92. package/src/components/Swap/SwapView/SwapPanel/index.tsx +42 -0
  93. package/src/components/Swap/SwapView/index.tsx +20 -0
  94. package/src/components/Swap/index.tsx +34 -0
  95. package/src/components/TextInput/index.tsx +67 -0
  96. package/src/components/Timer/index.tsx +57 -0
  97. package/src/components/ToggleButton/index.tsx +24 -0
  98. package/src/components/{UnknownTokenLogo/UnknownTokenLogo.tsx → TokenLogo/Unknown/index.tsx} +3 -4
  99. package/src/components/TokenLogo/WithChain/index.tsx +34 -0
  100. package/src/components/TokenLogo/index.tsx +22 -0
  101. package/src/components/Tooltip/index.tsx +108 -0
  102. package/src/components/TxConfigForm/index.tsx +63 -42
  103. package/src/components/TxDataCard/TokenDetails/index.tsx +30 -0
  104. package/src/components/TxDataCard/TxDataCardUI/index.tsx +133 -0
  105. package/src/components/TxDataCard/index.tsx +30 -0
  106. package/src/components/TxStatusButton/index.tsx +64 -108
  107. package/src/components/global.css +115 -4
  108. package/src/components/index.ts +18 -1
  109. package/src/config/fonts.ts +114 -0
  110. package/src/config/global.d.ts +4 -0
  111. package/src/config/init.tsx +35 -31
  112. package/src/constants/crosschainEstimationTimes.ts +52 -0
  113. package/src/constants/index.ts +8 -0
  114. package/src/context/GlobalDataProvider.tsx +165 -0
  115. package/src/context/HistoryProvider.tsx +339 -0
  116. package/src/context/ModalProvider.tsx +47 -0
  117. package/src/context/SwapProvider.tsx +664 -0
  118. package/src/context/TransactionProvider.tsx +86 -0
  119. package/src/context/TxUIWrapper.tsx +388 -0
  120. package/src/context/index.ts +5 -0
  121. package/src/contracts/abi/CustomXSwapRouter.json +953 -0
  122. package/src/contracts/abi/StakingStableAPR.json +1438 -0
  123. package/src/contracts/abi/XSwapRouter.json +1242 -0
  124. package/src/contracts/abi/XSwapTokenFeeDistributor.json +350 -0
  125. package/src/contracts/abi/index.ts +8 -0
  126. package/src/contracts/addresses.ts +24 -6
  127. package/src/fonts/Satoshi-Black.woff2 +0 -0
  128. package/src/fonts/Satoshi-BlackItalic.woff2 +0 -0
  129. package/src/fonts/Satoshi-Bold.woff2 +0 -0
  130. package/src/fonts/Satoshi-BoldItalic.woff2 +0 -0
  131. package/src/fonts/Satoshi-Light.woff2 +0 -0
  132. package/src/fonts/Satoshi-LightItalic.woff2 +0 -0
  133. package/src/fonts/Satoshi-Medium.woff2 +0 -0
  134. package/src/fonts/Satoshi-MediumItalic.woff2 +0 -0
  135. package/src/fonts/Satoshi-Regular.woff2 +0 -0
  136. package/src/fonts/Satoshi-RegularItalic.woff2 +0 -0
  137. package/src/fonts/Satoshi-Variable.woff2 +0 -0
  138. package/src/fonts/Satoshi-VariableItalic.woff2 +0 -0
  139. package/src/hooks/index.ts +5 -0
  140. package/src/hooks/networkManagement/clientToSigner.tsx +17 -0
  141. package/src/hooks/networkManagement/useNetworks.ts +51 -0
  142. package/src/hooks/useBatchQuery.ts +46 -0
  143. package/src/hooks/useDebounce.tsx +28 -0
  144. package/src/hooks/useEvmContractApi.ts +85 -0
  145. package/src/hooks/usePortal.ts +79 -0
  146. package/src/hooks/useXPower.ts +58 -0
  147. package/src/models/Addresses.ts +8 -2
  148. package/src/models/TokenData.ts +13 -0
  149. package/src/models/TransactionHistory.ts +2 -0
  150. package/src/models/TxUIWrapper.ts +51 -0
  151. package/src/models/XSwapConfig.ts +1 -0
  152. package/src/models/index.ts +1 -0
  153. package/src/models/payloads/GetBalancesPayload.ts +3 -0
  154. package/src/models/payloads/GetFinishedLeaderboardQuestsPayload.ts +3 -0
  155. package/src/models/payloads/GetLeaderboardChangePayload.ts +4 -0
  156. package/src/models/payloads/{GetSwapTxPayload.ts → ModalIntegrationPayload.ts} +3 -1
  157. package/src/models/payloads/index.ts +5 -2
  158. package/src/services/api.ts +34 -5
  159. package/src/services/integrations/monitoring.ts +49 -37
  160. package/src/services/integrations/transactions.ts +50 -6
  161. package/src/utils/contracts.ts +29 -0
  162. package/src/utils/index.ts +3 -3
  163. package/src/utils/numbers.ts +14 -0
  164. package/src/utils/parseWeb3Error.ts +7 -3
  165. package/tailwind.config.js +15 -5
  166. package/tsconfig.json +7 -7
  167. package/tsup.config.ts +62 -0
  168. package/xswap.config.ts +1 -0
  169. package/dist/index.css +0 -1
  170. package/src/components/TxConfigForm/BalanceComponent.tsx +0 -52
  171. package/src/components/TxConfigForm/Button.tsx +0 -20
  172. package/src/components/TxConfigForm/ChainListElement.tsx +0 -36
  173. package/src/components/TxConfigForm/ConfirmationAmount.tsx +0 -91
  174. package/src/components/TxConfigForm/ConfirmationView/ErrorView.tsx +0 -38
  175. package/src/components/TxConfigForm/ConfirmationView/SuccessView.tsx +0 -159
  176. package/src/components/TxConfigForm/ConfirmationView/index.tsx +0 -149
  177. package/src/components/TxConfigForm/ConnectWalletPrompt.tsx +0 -21
  178. package/src/components/TxConfigForm/Description.tsx +0 -17
  179. package/src/components/TxConfigForm/ErrorField.tsx +0 -19
  180. package/src/components/TxConfigForm/FeesDetails.tsx +0 -117
  181. package/src/components/TxConfigForm/Form.tsx +0 -574
  182. package/src/components/TxConfigForm/History.tsx +0 -131
  183. package/src/components/TxConfigForm/HistoryCard.tsx +0 -182
  184. package/src/components/TxConfigForm/PoweredBy.tsx +0 -12
  185. package/src/components/TxConfigForm/Settings.tsx +0 -143
  186. package/src/components/TxConfigForm/Summary.tsx +0 -105
  187. package/src/components/TxConfigForm/SwapPanel.tsx +0 -185
  188. package/src/components/TxConfigForm/TokenPicker.tsx +0 -176
  189. package/src/components/TxConfigForm/TopBar.tsx +0 -58
  190. package/src/components/TxConfigForm/UsdPrice.tsx +0 -44
  191. package/src/components/icons/ChevronDownIcon.tsx +0 -15
  192. package/src/components/icons/ChevronUpIcon.tsx +0 -10
  193. package/src/components/icons/CloseIcon.tsx +0 -15
  194. package/src/components/icons/HistoryIcon.tsx +0 -16
  195. package/src/components/icons/SettingsIcon.tsx +0 -16
  196. /package/src/{components → assets}/icons/ChainlinkCCIPIcon.tsx +0 -0
  197. /package/src/{components → assets}/icons/SearchIcon.tsx +0 -0
  198. /package/src/{components → assets}/icons/XSwapBadgeIcon.tsx +0 -0
  199. /package/src/{components → assets}/icons/XSwapLogo.tsx +0 -0
@@ -7,15 +7,19 @@ import { ethers } from "ethers";
7
7
  */
8
8
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
9
  export function parseWeb3Error(error: any): string {
10
- const errorMessage =
10
+ let errorMessage =
11
11
  typeof error === "string"
12
12
  ? error
13
13
  : error?.message || "An unknown error occurred";
14
14
 
15
+ // attach contract's errors like "insufficient funds for gas * price + value"
16
+ errorMessage += error?.data?.message || "";
17
+
15
18
  // User rejected the transaction
16
19
  if (
17
- errorMessage.includes("User denied transaction signature") ||
18
- errorMessage.includes("User rejected the request")
20
+ errorMessage.match(/User denied transaction signature/i) ||
21
+ errorMessage.match(/User rejected the request/i) ||
22
+ errorMessage.match(/User rejected transaction/i)
19
23
  ) {
20
24
  return "Transaction was cancelled.";
21
25
  }
@@ -1,20 +1,29 @@
1
1
  /** @type {import("tailwindcss").Config} */
2
2
  export default {
3
- content: ["./src/components/**/*.{js,ts,jsx,tsx,mdx}"],
3
+ content: ["src/components/**/*.{ts,tsx}"],
4
4
  theme: {
5
+ fontFamily: {
6
+ body: ["'Satoshi-Medium'", "Tahoma", "Verdana", "ui-sans-serif"],
7
+ sans: ["Satoshi-Medium", "Tahoma", "Verdana", "ui-sans-serif"],
8
+ },
5
9
  extend: {
6
10
  colors: {
7
11
  x_alert: "rgb(255,183,77)",
8
12
  x_alert_light: "rgb(255,226,183)",
9
13
  x_blue: "#3396FF",
10
14
  x_green: "#66bb6a",
15
+ x_orange: "#ffa726",
11
16
  x_grey: "#ffffff80",
12
17
  x_error_background: "rgba(255,202,40,0.1)",
18
+ x_skeleton_background: "rgba(255,255,255,0.13)",
13
19
  x_error_border: "rgba(255,111,0,1)",
14
20
  x_blue_light: "rgba(54,129,198,1)",
15
21
  x_blue_dark: "rgba(43,74,157,1)",
16
22
  x_green_light: "rgba(43,74,157,1)",
17
23
  x_green_dark: "rgba(46,125,50,1)",
24
+ x_swap_primary: "#e0e7fa",
25
+ x_swap_secondary: "#1a2b6b",
26
+ x_swap_secondary_active: "#e0e7fa",
18
27
 
19
28
  x_gray_100: "#D1D3D4",
20
29
  x_gray_200: "#90A4AE",
@@ -55,9 +64,11 @@ export default {
55
64
  x_orange_500: "#FF6F00",
56
65
  x_orange_600: "#795548",
57
66
  },
58
- width: {
59
- x_desktop: "600px",
60
- x_mobile: "360px",
67
+ minWidth: {
68
+ x_modal: "360px",
69
+ },
70
+ maxWidth: {
71
+ x_modal: "480px",
61
72
  },
62
73
  animation: {
63
74
  "spin-slow": "spin 3s linear infinite",
@@ -65,5 +76,4 @@ export default {
65
76
  },
66
77
  },
67
78
  plugins: [],
68
- prefix: "xpay-",
69
79
  };
package/tsconfig.json CHANGED
@@ -1,21 +1,21 @@
1
1
  {
2
2
  "compilerOptions": {
3
+ "target": "es2021",
4
+ "jsx": "react-jsx",
5
+ "module": "ESNext",
6
+ "allowJs": true,
3
7
  "esModuleInterop": true,
8
+ "strict": true,
4
9
  "skipLibCheck": true,
5
- "target": "es2021",
6
10
  "verbatimModuleSyntax": false,
7
- "allowJs": true,
8
- "resolveJsonModule": true,
9
11
  "moduleDetection": "force",
10
- "strict": true,
11
12
  "noUncheckedIndexedAccess": true,
12
13
  "moduleResolution": "Bundler",
13
- "module": "ESNext",
14
+ "resolveJsonModule": true,
15
+ "noImplicitAny": false,
14
16
  "noEmit": true,
15
- "jsx": "react-jsx",
16
17
  "paths": {
17
18
  "@src/*": ["./src/*"],
18
- "@src/global.css": ["./src/components/global.css"]
19
19
  }
20
20
  }
21
21
  }
package/tsup.config.ts ADDED
@@ -0,0 +1,62 @@
1
+ import { defineConfig } from "tsup";
2
+
3
+ export default defineConfig(() => {
4
+ return [
5
+ // Main build configuration
6
+ {
7
+ entry: ["src/index.ts"],
8
+ format: ["cjs", "esm"],
9
+ dts: true,
10
+ clean: true,
11
+ minify: true,
12
+ splitting: false,
13
+ sourcemap: true,
14
+ noExternal: ["ethers"],
15
+ outDir: "dist",
16
+ esbuildOptions(options) {
17
+ options.loader = {
18
+ ...options.loader,
19
+ ".ttf": "dataurl",
20
+ ".eot": "dataurl",
21
+ ".woff": "dataurl",
22
+ ".woff2": "dataurl",
23
+ };
24
+ },
25
+ loader: {
26
+ ".css": "text",
27
+ ".eot": "file",
28
+ ".ttf": "file",
29
+ ".woff": "file",
30
+ ".woff2": "file",
31
+ },
32
+ },
33
+ // CDN build configuration
34
+ {
35
+ entry: ["src/index.ts"],
36
+ format: ["iife"],
37
+ globalName: "XPay",
38
+ minify: true,
39
+ splitting: false,
40
+ sourcemap: true,
41
+ target: "chrome110.0",
42
+ outDir: "dist",
43
+ platform: "browser",
44
+ esbuildOptions(options) {
45
+ options.loader = {
46
+ ...options.loader,
47
+ ".ttf": "dataurl",
48
+ ".eot": "dataurl",
49
+ ".woff": "dataurl",
50
+ ".woff2": "dataurl",
51
+ };
52
+ },
53
+ loader: {
54
+ ".css": "text",
55
+ ".eot": "file",
56
+ ".ttf": "file",
57
+ ".woff": "file",
58
+ ".woff2": "file",
59
+ },
60
+ },
61
+ ];
62
+ });
package/xswap.config.ts CHANGED
@@ -2,6 +2,7 @@ import { XSwapConfig } from "@src/models";
2
2
 
3
3
  const xSwapConfig: XSwapConfig = {
4
4
  apiUrl: "https://xswap.link/api",
5
+ localCss: false,
5
6
  };
6
7
 
7
8
  let xSwapConfigLocal = {};
package/dist/index.css DELETED
@@ -1 +0,0 @@
1
- *,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.xpay-global-border{border:1px solid rgba(255,255,255,.1)}.xpay-fixed{position:fixed}.xpay-absolute{position:absolute}.xpay-relative{position:relative}.xpay-bottom-0{bottom:0}.xpay-bottom-5{bottom:1.25rem}.xpay-left-0{left:0}.xpay-right-0{right:0}.xpay-right-2{right:.5rem}.xpay-right-4{right:1rem}.xpay-right-\[50\%\]{right:50%}.xpay-top-0{top:0}.xpay-top-10{top:2.5rem}.xpay-top-4{top:1rem}.xpay-top-\[46px\]{top:46px}.xpay-z-10{z-index:10}.xpay-z-20{z-index:20}.xpay-z-50{z-index:50}.xpay-z-\[1\]{z-index:1}.xpay-z-\[999\]{z-index:999}.xpay-mx-0{margin-left:0;margin-right:0}.xpay-mx-1\.5{margin-left:.375rem;margin-right:.375rem}.xpay-mx-2{margin-left:.5rem;margin-right:.5rem}.xpay-mx-\[-24px\]{margin-left:-24px;margin-right:-24px}.xpay-mx-auto{margin-left:auto;margin-right:auto}.xpay-my-0{margin-top:0;margin-bottom:0}.xpay-my-3{margin-top:.75rem;margin-bottom:.75rem}.xpay-my-4{margin-top:1rem;margin-bottom:1rem}.xpay--mb-6{margin-bottom:-1.5rem}.xpay--mt-7{margin-top:-1.75rem}.xpay-mb-1{margin-bottom:.25rem}.xpay-mb-2{margin-bottom:.5rem}.xpay-mb-4{margin-bottom:1rem}.xpay-ml-1{margin-left:.25rem}.xpay-ml-2{margin-left:.5rem}.xpay-ml-2\.5{margin-left:.625rem}.xpay-mr-1{margin-right:.25rem}.xpay-mt-1{margin-top:.25rem}.xpay-mt-4{margin-top:1rem}.xpay-box-border{box-sizing:border-box}.xpay-block{display:block}.xpay-flex{display:flex}.xpay-inline-flex{display:inline-flex}.xpay-h-10{height:2.5rem}.xpay-h-14{height:3.5rem}.xpay-h-3{height:.75rem}.xpay-h-3\.5{height:.875rem}.xpay-h-4{height:1rem}.xpay-h-5{height:1.25rem}.xpay-h-6{height:1.5rem}.xpay-h-7{height:1.75rem}.xpay-h-8{height:2rem}.xpay-h-9{height:2.25rem}.xpay-h-96{height:24rem}.xpay-h-\[2px\]{height:2px}.xpay-h-\[30vh\]{height:30vh}.xpay-h-\[36px\]{height:36px}.xpay-h-\[41px\]{height:41px}.xpay-h-\[70\%\]{height:70%}.xpay-h-\[9px\]{height:9px}.xpay-h-full{height:100%}.xpay-h-px{height:1px}.xpay-max-h-\[40vh\]{max-height:40vh}.xpay-max-h-\[70\%\]{max-height:70%}.xpay-min-h-\[26px\]{min-height:26px}.xpay-w-1\/2{width:50%}.xpay-w-10{width:2.5rem}.xpay-w-12{width:3rem}.xpay-w-14{width:3.5rem}.xpay-w-20{width:5rem}.xpay-w-3\.5{width:.875rem}.xpay-w-4{width:1rem}.xpay-w-5{width:1.25rem}.xpay-w-6{width:1.5rem}.xpay-w-7{width:1.75rem}.xpay-w-8{width:2rem}.xpay-w-9{width:2.25rem}.xpay-w-\[100\%\+48px\]{width:100%+48px}.xpay-w-\[100px\]{width:100px}.xpay-w-\[15px\]{width:15px}.xpay-w-\[310px\]{width:310px}.xpay-w-\[452px\]{width:452px}.xpay-w-full{width:100%}.xpay-w-px{width:1px}.xpay-w-screen{width:100vw}.xpay-min-w-60{min-width:15rem}.xpay-min-w-\[26px\]{min-width:26px}.xpay-max-w-full{max-width:100%}.xpay-grow{flex-grow:1}.xpay-translate-x-1\/2{--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.xpay-translate-x-\[12px\]{--tw-translate-x: 12px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.xpay-translate-y-\[-4px\]{--tw-translate-y: -4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.xpay-translate-y-\[-60\%\]{--tw-translate-y: -60%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes xpay-pulse{50%{opacity:.5}}.xpay-animate-pulse{animation:xpay-pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes xpay-spin{to{transform:rotate(360deg)}}.xpay-animate-spin{animation:xpay-spin 1s linear infinite}.xpay-cursor-pointer{cursor:pointer}.xpay-flex-col{flex-direction:column}.xpay-flex-wrap{flex-wrap:wrap}.xpay-items-start{align-items:flex-start}.xpay-items-end{align-items:flex-end}.xpay-items-center{align-items:center}.xpay-justify-end{justify-content:flex-end}.xpay-justify-center{justify-content:center}.xpay-justify-between{justify-content:space-between}.xpay-gap-1{gap:.25rem}.xpay-gap-2{gap:.5rem}.xpay-gap-2\.5{gap:.625rem}.xpay-gap-3{gap:.75rem}.xpay-gap-4{gap:1rem}.xpay-overflow-auto{overflow:auto}.xpay-overflow-hidden{overflow:hidden}.xpay-overflow-scroll{overflow:scroll}.xpay-overflow-x-hidden{overflow-x:hidden}.xpay-overflow-y-scroll{overflow-y:scroll}.xpay-overflow-ellipsis,.xpay-text-ellipsis{text-overflow:ellipsis}.xpay-whitespace-nowrap{white-space:nowrap}.xpay-rounded{border-radius:.25rem}.xpay-rounded-2xl{border-radius:1rem}.xpay-rounded-3xl{border-radius:1.5rem}.xpay-rounded-full{border-radius:9999px}.xpay-rounded-lg{border-radius:.5rem}.xpay-rounded-xl{border-radius:.75rem}.xpay-border{border-width:1px}.xpay-border-2{border-width:2px}.xpay-border-solid{border-style:solid}.xpay-border-none{border-style:none}.xpay-border-\[rgba\(255\,255\,255\,0\.1\)\]{border-color:#ffffff1a}.xpay-border-\[rgba\(255\,255\,255\,0\.2\)\]{border-color:#fff3}.xpay-border-\[rgba\(54\,129\,198\,1\)\]{border-color:#3681c6}.xpay-border-\[rgba\(82\,82\,82\,1\)\]{border-color:#525252}.xpay-border-transparent{border-color:transparent}.xpay-border-x_alert{--tw-border-opacity: 1;border-color:rgb(255 183 77 / var(--tw-border-opacity))}.xpay-border-x_blue_dark{border-color:#2b4a9d}.xpay-border-x_error_border{border-color:#ff6f00}.xpay-border-x_green_dark{border-color:#2e7d32}.xpay-bg-\[\#272e40\]{--tw-bg-opacity: 1;background-color:rgb(39 46 64 / var(--tw-bg-opacity))}.xpay-bg-\[rgb\(15\,15\,15\)\]{--tw-bg-opacity: 1;background-color:rgb(15 15 15 / var(--tw-bg-opacity))}.xpay-bg-\[rgb\(35\,35\,35\)\]{--tw-bg-opacity: 1;background-color:rgb(35 35 35 / var(--tw-bg-opacity))}.xpay-bg-\[rgba\(0\,0\,0\,0\.8\)\]{background-color:#000c}.xpay-bg-\[rgba\(15\,15\,15\,1\)\]{background-color:#0f0f0f}.xpay-bg-\[rgba\(2\,2\,2\,1\)\]{background-color:#020202}.xpay-bg-\[rgba\(255\,255\,255\,0\.1\)\]{background-color:#ffffff1a}.xpay-bg-\[rgba\(255\,255\,255\,0\.15\)\]{background-color:#ffffff26}.xpay-bg-\[rgba\(255\,255\,255\,0\.3\)\]{background-color:#ffffff4d}.xpay-bg-\[rgba\(39\,39\,39\,1\)\]{background-color:#272727}.xpay-bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.xpay-bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity))}.xpay-bg-transparent{background-color:transparent}.xpay-bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.xpay-bg-x_blue{--tw-bg-opacity: 1;background-color:rgb(51 150 255 / var(--tw-bg-opacity))}.xpay-bg-x_error_background{background-color:#ffca281a}.xpay-bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.xpay-bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.xpay-from-\[\#3681c6\]{--tw-gradient-from: #3681c6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(54 129 198 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.xpay-from-\[rgba\(54\,129\,198\,0\.2\)\]{--tw-gradient-from: rgba(54,129,198,.2) var(--tw-gradient-from-position);--tw-gradient-to: rgba(54, 129, 198, 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.xpay-from-\[rgba\(54\,129\,198\,1\)\]{--tw-gradient-from: rgba(54,129,198,1) var(--tw-gradient-from-position);--tw-gradient-to: rgba(54, 129, 198, 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.xpay-from-\[rgba\(76\,175\,80\,0\.2\)\]{--tw-gradient-from: rgba(76,175,80,.2) var(--tw-gradient-from-position);--tw-gradient-to: rgba(76, 175, 80, 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.xpay-from-x_blue_300_20{--tw-gradient-from: #3681C633 var(--tw-gradient-from-position);--tw-gradient-to: rgb(54 129 198 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.xpay-from-x_blue_light{--tw-gradient-from: rgba(54,129,198,1) var(--tw-gradient-from-position);--tw-gradient-to: rgba(54, 129, 198, 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.xpay-to-\[\#2b4a9d\]{--tw-gradient-to: #2b4a9d var(--tw-gradient-to-position)}.xpay-to-\[rgba\(43\,74\,157\,0\.2\)\]{--tw-gradient-to: rgba(43,74,157,.2) var(--tw-gradient-to-position)}.xpay-to-\[rgba\(43\,74\,157\,1\)\]{--tw-gradient-to: rgba(43,74,157,1) var(--tw-gradient-to-position)}.xpay-to-\[rgba\(46\,125\,50\,0\.2\)\]{--tw-gradient-to: rgba(46,125,50,.2) var(--tw-gradient-to-position)}.xpay-to-x_blue_400_20{--tw-gradient-to: #2B4A9D33 var(--tw-gradient-to-position)}.xpay-to-x_blue_dark{--tw-gradient-to: rgba(43,74,157,1) var(--tw-gradient-to-position)}.xpay-bg-clip-text{background-clip:text}.xpay-fill-\[rgba\(54\,129\,198\,1\)\]{fill:#3681c6}.xpay-p-0{padding:0}.xpay-p-2{padding:.5rem}.xpay-p-3{padding:.75rem}.xpay-p-4{padding:1rem}.xpay-p-5{padding:1.25rem}.xpay-p-6{padding:1.5rem}.xpay-p-\[5px\]{padding:5px}.xpay-px-0{padding-left:0;padding-right:0}.xpay-px-12{padding-left:3rem;padding-right:3rem}.xpay-px-2{padding-left:.5rem;padding-right:.5rem}.xpay-px-3{padding-left:.75rem;padding-right:.75rem}.xpay-px-4{padding-left:1rem;padding-right:1rem}.xpay-px-\[24px\]{padding-left:24px;padding-right:24px}.xpay-py-0{padding-top:0;padding-bottom:0}.xpay-py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.xpay-py-1{padding-top:.25rem;padding-bottom:.25rem}.xpay-py-2{padding-top:.5rem;padding-bottom:.5rem}.xpay-py-4{padding-top:1rem;padding-bottom:1rem}.xpay-pl-9{padding-left:2.25rem}.xpay-pt-2{padding-top:.5rem}.xpay-text-left{text-align:left}.xpay-text-center{text-align:center}.xpay-text-right{text-align:right}.xpay-align-middle{vertical-align:middle}.xpay-text-2xl{font-size:1.5rem;line-height:2rem}.xpay-text-\[10px\]{font-size:10px}.xpay-text-\[11px\]{font-size:11px}.xpay-text-\[15px\]{font-size:15px}.xpay-text-base{font-size:1rem;line-height:1.5rem}.xpay-text-sm{font-size:.875rem;line-height:1.25rem}.xpay-text-xl{font-size:1.25rem;line-height:1.75rem}.xpay-text-xs{font-size:.75rem;line-height:1rem}.xpay-font-bold{font-weight:700}.xpay-font-light{font-weight:300}.xpay-font-medium{font-weight:500}.xpay-font-normal{font-weight:400}.xpay-leading-8{line-height:2rem}.xpay-leading-\[10px\]{line-height:10px}.xpay-leading-\[16px\]{line-height:16px}.xpay-leading-\[41px\]{line-height:41px}.xpay-leading-none{line-height:1}.xpay-text-\[\#888\]{--tw-text-opacity: 1;color:rgb(136 136 136 / var(--tw-text-opacity))}.xpay-text-\[\#e0e7fa\]{--tw-text-opacity: 1;color:rgb(224 231 250 / var(--tw-text-opacity))}.xpay-text-\[\#ffa726\]{--tw-text-opacity: 1;color:rgb(255 167 38 / var(--tw-text-opacity))}.xpay-text-\[rgb\(100\,200\,100\)\]{--tw-text-opacity: 1;color:rgb(100 200 100 / var(--tw-text-opacity))}.xpay-text-\[rgb\(158\,158\,158\)\]{--tw-text-opacity: 1;color:rgb(158 158 158 / var(--tw-text-opacity))}.xpay-text-\[rgb\(250\,200\,100\)\]{--tw-text-opacity: 1;color:rgb(250 200 100 / var(--tw-text-opacity))}.xpay-text-\[rgb\(255\,100\,100\)\]{--tw-text-opacity: 1;color:rgb(255 100 100 / var(--tw-text-opacity))}.xpay-text-\[rgba\(255\,255\,255\,0\.2\)\]{color:#fff3}.xpay-text-\[rgba\(255\,255\,255\,0\.6\)\]{color:#fff9}.xpay-text-\[rgba\(54\,129\,198\,1\)\]{color:#3681c6}.xpay-text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.xpay-text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity))}.xpay-text-transparent{color:transparent}.xpay-text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.xpay-text-x_alert_light{--tw-text-opacity: 1;color:rgb(255 226 183 / var(--tw-text-opacity))}.xpay-text-x_blue_dark{color:#2b4a9d}.xpay-text-x_green{--tw-text-opacity: 1;color:rgb(102 187 106 / var(--tw-text-opacity))}.xpay-text-x_grey{color:#ffffff80}.xpay-underline{text-decoration-line:underline}.xpay-no-underline{text-decoration-line:none}.xpay-opacity-50{opacity:.5}.xpay-opacity-60{opacity:.6}.xpay-shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.xpay-outline-none{outline:2px solid transparent;outline-offset:2px}.xpay-transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xpay{*{scrollbar-width:thin;scrollbar-color:#252525 #000}*::-webkit-scrollbar{width:4px}*::-webkit-scrollbar-track{background:#000;border-radius:4px}*::-webkit-scrollbar-thumb{background-color:#252525;border-radius:4px}}.placeholder\:xpay-text-sm::placeholder{font-size:.875rem;line-height:1.25rem}.placeholder\:xpay-text-\[rgba\(255\,255\,255\,0\.2\)\]::placeholder{color:#fff3}.last\:xpay-mb-0:last-child{margin-bottom:0}.visited\:xpay-text-white:visited{color:#fff}.hover\:xpay-cursor-pointer:hover{cursor:pointer}.hover\:xpay-bg-\[rgb\(25\,25\,25\)\]:hover{--tw-bg-opacity: 1;background-color:rgb(25 25 25 / var(--tw-bg-opacity))}.hover\:xpay-text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.focus\:xpay-outline-none:focus{outline:2px solid transparent;outline-offset:2px}.disabled\:xpay-opacity-25:disabled{opacity:.25}@media (min-width: 640px){.sm\:xpay-w-\[190px\]{width:190px}.sm\:xpay-w-\[520px\]{width:520px}.sm\:xpay-w-x_desktop{width:600px}.sm\:xpay-flex-row{flex-direction:row}.sm\:xpay-gap-5{gap:1.25rem}.sm\:xpay-p-4{padding:1rem}.sm\:xpay-text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:xpay-text-base{font-size:1rem;line-height:1.5rem}.sm\:xpay-text-sm{font-size:.875rem;line-height:1.25rem}.sm\:xpay-text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width: 768px){.md\:xpay-p-4{padding:1rem}}@media (prefers-color-scheme: dark){.dark\:xpay-text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}}
@@ -1,52 +0,0 @@
1
- import { MINIMUM_DISPLAYED_TOKEN_AMOUNT } from "@src/constants";
2
- import { Token, TokenBalances } from "@src/models";
3
- import { weiToHumanReadable } from "@src/utils";
4
- import BigNumber from "bignumber.js";
5
- import { FC, useMemo } from "react";
6
-
7
- interface Props {
8
- srcToken: Token | undefined;
9
- balances: TokenBalances | undefined;
10
- }
11
-
12
- export const BalanceComponent: FC<Props> = ({ srcToken, balances }) => {
13
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
14
- const balanceText = useMemo(() => {
15
- if (!balances || !srcToken) return "0";
16
- if (balances[srcToken.address]?.toString() === "0") return "0";
17
- const fullHumanReadable = weiToHumanReadable({
18
- amount: balances[srcToken.address]?.toString() || "0",
19
- decimals: srcToken.decimals,
20
- precisionFractionalPlaces: srcToken.decimals,
21
- });
22
-
23
- if (
24
- new BigNumber(fullHumanReadable).lt(
25
- MINIMUM_DISPLAYED_TOKEN_AMOUNT.toString(),
26
- )
27
- )
28
- return `<${MINIMUM_DISPLAYED_TOKEN_AMOUNT}`;
29
-
30
- return weiToHumanReadable({
31
- amount: balances[srcToken.address]?.toString() || "0",
32
- decimals: srcToken.decimals,
33
- precisionFractionalPlaces: 5,
34
- });
35
- }, [srcToken, balances]);
36
-
37
- return (
38
- <>
39
- Balance:{" "}
40
- {srcToken && balances
41
- ? weiToHumanReadable({
42
- amount: balances[srcToken.address]?.toString() || "0",
43
- decimals: srcToken.decimals,
44
- precisionFractionalPlaces: 4,
45
- })
46
- : 0}
47
- <span className="xpay-bg-gradient-to-r xpay-from-x_blue_light xpay-to-x_blue_dark xpay-bg-clip-text xpay-text-transparent">
48
- Max
49
- </span>
50
- </>
51
- );
52
- };
@@ -1,20 +0,0 @@
1
- import { FC, ReactNode } from "react";
2
-
3
- interface Props {
4
- children: ReactNode;
5
- onClick?: () => void;
6
- type?: "submit" | "reset" | "button";
7
- disabled?: boolean;
8
- }
9
- export const Button: FC<Props> = ({ children, onClick, type, disabled }) => {
10
- return (
11
- <button
12
- className="xpay-text-white xpay-border-none xpay-rounded-2xl xpay-text-xl xpay-py-4 xpay-cursor-pointer xpay-w-full xpay-bg-gradient-to-r xpay-from-[#3681c6] xpay-to-[#2b4a9d] disabled:xpay-opacity-25"
13
- onClick={onClick}
14
- type={type}
15
- disabled={disabled}
16
- >
17
- {children}
18
- </button>
19
- );
20
- };
@@ -1,36 +0,0 @@
1
- import { FC } from "react";
2
- import { Chain } from "@src/models";
3
-
4
- interface Props {
5
- chain: Chain;
6
- index: number;
7
- length: number;
8
- setSrcChain: (chain: Chain) => void;
9
- setChainListShown: (x: boolean) => void;
10
- }
11
-
12
- export const ChainListElement: FC<Props> = ({
13
- chain,
14
- setSrcChain,
15
- setChainListShown,
16
- index,
17
- length,
18
- }) => {
19
- return (
20
- <div key={`${chain.ecosystem}-${chain.chainId}`}>
21
- <li
22
- className="xpay-bg-transparent xpay-border-none xpay-flex xpay-gap-1 xpay-items-center xpay-cursor-pointer xpay-py-2 xpay-w-full"
23
- onClick={() => {
24
- setSrcChain(chain);
25
- setChainListShown(false);
26
- }}
27
- >
28
- <img width={12} height={12} src={chain.image} alt={chain.displayName} />
29
- {chain.displayName}
30
- </li>
31
- {index !== length - 1 && (
32
- <div className="xpay-h-px xpay-mx-2 xpay-bg-[rgba(255,255,255,0.15)]"></div>
33
- )}
34
- </div>
35
- );
36
- };
@@ -1,91 +0,0 @@
1
- import { FC, useEffect, useMemo, useState } from "react";
2
- import { weiToHumanReadable } from "@src/utils";
3
- import { Chain, Token, TokenPrices } from "@src/models";
4
- import { UsdPrice } from "@src/components/TxConfigForm/UsdPrice";
5
- import { getPrices } from "@src/services";
6
- import { UnknownTokenLogo } from "../UnknownTokenLogo/UnknownTokenLogo";
7
-
8
- interface Props {
9
- amount: string;
10
- token?: Token;
11
- chain?: Chain;
12
- type: "src" | "dst";
13
- }
14
-
15
- export const ConfirmationAmount: FC<Props> = ({
16
- amount,
17
- token,
18
- chain,
19
- type,
20
- }) => {
21
- const [prices, setPrices] = useState<TokenPrices>();
22
-
23
- const amountReadable = useMemo(() => {
24
- return weiToHumanReadable({
25
- amount: amount || "0",
26
- decimals: token?.decimals || 18,
27
- precisionFractionalPlaces: 8,
28
- });
29
- }, [amount, token]);
30
-
31
- useEffect(() => {
32
- if (chain) {
33
- getPrices({ chainId: chain.chainId, currency: "USD" }).then((prices) =>
34
- setPrices(prices),
35
- );
36
- }
37
- }, [chain]);
38
-
39
- return (
40
- <div className="xpay-flex xpay-flex-col xpay-globalBorder xpay-rounded-xl xpay-bg-gradient-to-r xpay-from-x_blue_300_20 xpay-to-x_blue_400_20 xpay-p-4 xpay-relative">
41
- <div className="xpay-flex xpay-justify-between">
42
- <div className="xpay-flex xpay-flex-col xpay-gap-1">
43
- <p className="xpay-text-white xpay-opacity-60 xpay-text-xs sm:xpay-text-sm xpay-font-medium">
44
- {type === "src" ? "You pay" : "You receive"}
45
- </p>
46
- <div
47
- className={`xpay-flex xpay-gap-2 xpay-items-center xpay-text-xl sm:xpay-text-3xl ${
48
- type === "dst"
49
- ? "xpay-text-[rgba(54,129,198,1)]"
50
- : "xpay-text-white"
51
- }`}
52
- >
53
- {amountReadable}
54
- </div>
55
-
56
- <UsdPrice
57
- prices={prices}
58
- token={token}
59
- amount={amountReadable}
60
- loading={false}
61
- />
62
- </div>
63
- <div className="xpay-flex xpay-gap-2 xpay-text-sm xpay-justify-center xpay-items-center">
64
- <div className="xpay-flex xpay-flex-col xpay-justify-center xpay-items-end xpay-gap-1">
65
- <p className="xpay-text-base sm:xpay-text-xl">{token?.name}</p>
66
- <div className="xpay-flex xpay-justify-center xpay-items-center xpay-gap-1">
67
- <p className="xpay-text-[rgba(255,255,255,0.6)] xpay-text-xs xpay-text-right">
68
- {chain?.displayName}
69
- </p>
70
- </div>
71
- </div>
72
-
73
- <div className="xpay-w-10 xpay-h-10">
74
- {token?.image ? (
75
- <img
76
- className="xpay-w-10 xpay-h-10"
77
- src={token?.image}
78
- alt={token?.name}
79
- />
80
- ) : (
81
- <UnknownTokenLogo
82
- tokenName={"?"}
83
- className="xpay-w-10 xpay-h-10"
84
- />
85
- )}
86
- </div>
87
- </div>
88
- </div>
89
- </div>
90
- );
91
- };
@@ -1,38 +0,0 @@
1
- import { CloseIcon, ErrorIcon } from "@src/components/icons";
2
- import { parseWeb3Error } from "@src/utils";
3
- import React from "react";
4
-
5
- type Props = {
6
- txError: string | null;
7
- onClose: () => void;
8
- };
9
- export const ErrorView = ({ txError, onClose }: Props) => {
10
- return (
11
- <div>
12
- <div className="xpay-flex xpay-w-full xpay-justify-end xpay-items-center xpay-mx-auto xpay-p-2">
13
- <div className="xpay-cursor-pointer xpay-text-white" onClick={onClose}>
14
- <CloseIcon />
15
- </div>
16
- </div>
17
-
18
- <div className="xpay-flex xpay-flex-col xpay-w-full xpay-justify-center xpay-items-center xpay-mx-auto xpay-p-2 xpay-gap-4">
19
- <div>
20
- <ErrorIcon />
21
- </div>
22
-
23
- <div className="xpay-flex xpay-flex-col">
24
- <div>
25
- <p className="xpay-text-2xl xpay-font-bold xpay-leading-8 xpay-text-center xpay-text-white">
26
- Transaction error!
27
- </p>
28
- </div>
29
- <div>
30
- <p className="xpay-text-sm xpay-text-center xpay-text-white xpay-opacity-50">
31
- {parseWeb3Error(txError)}
32
- </p>
33
- </div>
34
- </div>
35
- </div>
36
- </div>
37
- );
38
- };
@@ -1,159 +0,0 @@
1
- import {
2
- ArrowRightIcon,
3
- ArrowUpRightIcon,
4
- CloseIcon,
5
- SuccessIcon,
6
- } from "@src/components/icons";
7
- import { UnknownTokenLogo } from "@src/components/UnknownTokenLogo/UnknownTokenLogo";
8
- import { weiToHumanReadable } from "@src/utils";
9
- import { CCIP_EXPLORER } from "@src/constants";
10
- import React, { useMemo } from "react";
11
- import { Chain, Route, Token } from "@src/models";
12
-
13
- type Props = {
14
- onClose: () => void;
15
- txSuccessHash?: string;
16
- srcChain?: Chain;
17
- dstChain?: Chain;
18
- isExpressDelivery: boolean;
19
- srcToken?: Token;
20
- amount: string;
21
- dstDisplayToken?: Token;
22
- dstToken?: Token;
23
- route?: Route;
24
- supportedChains: Chain[];
25
- };
26
- export const SuccessView = ({
27
- onClose,
28
- srcChain,
29
- dstChain,
30
- isExpressDelivery,
31
- srcToken,
32
- amount,
33
- dstDisplayToken,
34
- dstToken,
35
- route,
36
- txSuccessHash,
37
- supportedChains,
38
- }: Props) => {
39
- const dstTokenToDisplay = useMemo(() => {
40
- return dstDisplayToken ? dstDisplayToken : dstToken;
41
- }, [dstDisplayToken, dstToken]);
42
-
43
- return (
44
- <div>
45
- <div className="xpay-flex xpay-w-full xpay-justify-end xpay-items-center xpay-mx-auto xpay-p-2">
46
- <div className="xpay-cursor-pointer xpay-text-white" onClick={onClose}>
47
- <CloseIcon />
48
- </div>
49
- </div>
50
-
51
- <div className="xpay-flex xpay-flex-col xpay-w-full xpay-justify-center xpay-items-center xpay-mx-auto xpay-p-2 xpay-gap-4">
52
- <div>
53
- <SuccessIcon />
54
- </div>
55
- <div className="xpay-flex xpay-flex-col">
56
- <div>
57
- <p className="xpay-text-2xl xpay-font-bold xpay-leading-8 xpay-text-center xpay-text-white">
58
- Transaction success!
59
- </p>
60
- </div>
61
- {srcChain?.chainId !== dstChain?.chainId ? (
62
- <div>
63
- <p className="xpay-text-sm xpay-text-center xpay-text-white xpay-opacity-50">
64
- Approximated time of delivery:{" "}
65
- {isExpressDelivery ? "30 seconds" : "30 minutes"}
66
- </p>
67
- </div>
68
- ) : (
69
- <></>
70
- )}
71
- </div>
72
-
73
- <div className="xpay-flex xpay-gap-4 xpay-items-center">
74
- <div className="xpay-flex xpay-gap-2">
75
- <div className="xpay-w-10 xpay-h-10">
76
- {srcToken?.image ? (
77
- <img
78
- className="xpay-w-10 xpay-h-10"
79
- src={srcToken?.image}
80
- alt={srcToken?.name}
81
- />
82
- ) : (
83
- <UnknownTokenLogo
84
- tokenName={"?"}
85
- className="xpay-w-10 xpay-h-10"
86
- />
87
- )}
88
- </div>
89
- <div className="xpay-flex xpay-flex-col xpay-items-start">
90
- <div className="xpay-flex">{`${amount} ${srcToken?.symbol}`}</div>
91
- <div className="xpay-text-sm xpay-text-center xpay-text-white xpay-opacity-50">
92
- {srcChain?.displayName}
93
- </div>
94
- </div>
95
- </div>
96
-
97
- <div className="xpay-w-3.5 xpay-h-3.5">
98
- <ArrowRightIcon />
99
- </div>
100
-
101
- <div className="xpay-flex xpay-gap-2">
102
- <div className="xpay-w-10 xpay-h-10">
103
- {dstTokenToDisplay?.image ? (
104
- <img
105
- className="xpay-w-10 xpay-h-10"
106
- src={dstTokenToDisplay?.image}
107
- alt={dstTokenToDisplay?.name}
108
- />
109
- ) : (
110
- <UnknownTokenLogo
111
- tokenName={"?"}
112
- className="xpay-w-10 xpay-h-10"
113
- />
114
- )}
115
- </div>
116
- <div className="xpay-flex xpay-flex-col xpay-items-start">
117
- <div className="xpay-flex">
118
- {weiToHumanReadable({
119
- amount: route?.estAmountOut || "0",
120
- decimals: dstTokenToDisplay?.decimals || 18,
121
- precisionFractionalPlaces: 4,
122
- })}{" "}
123
- {dstTokenToDisplay?.symbol}
124
- </div>
125
- <div className="xpay-text-sm xpay-text-center xpay-text-white xpay-opacity-50">
126
- {dstChain?.displayName}
127
- </div>
128
- </div>
129
- </div>
130
- </div>
131
-
132
- <div>
133
- <a
134
- href={
135
- srcChain?.chainId !== dstChain?.chainId
136
- ? `${CCIP_EXPLORER}/tx/${txSuccessHash}`
137
- : `${
138
- supportedChains.find(
139
- (chain) => chain.chainId === srcChain?.chainId,
140
- )?.transactionExplorer
141
- }/${txSuccessHash}`
142
- }
143
- target="_blank"
144
- rel="noreferrer"
145
- className="xpay-flex xpay-items-center xpay-gap-2 xpay-font-bold xpay-no-underline xpay-cursor-pointer xpay-text-center"
146
- aria-label="Show the transaction in the chain explorer"
147
- >
148
- <p className="xpay-bg-gradient-to-r xpay-from-x_blue_light xpay-to-x_blue_dark xpay-bg-clip-text xpay-text-transparent xpay-underline">
149
- View details on Explorer
150
- </p>
151
- <div className="xpay-w-3.5 xpay-h-3.5 xpay-bg-gradient-to-r xpay-text-x_blue_dark">
152
- <ArrowUpRightIcon />
153
- </div>
154
- </a>
155
- </div>
156
- </div>
157
- </div>
158
- );
159
- };