@matchain/matchid-sdk-react 0.1.56-alpha.5 → 0.1.56-alpha.6
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/dist/api.js.map +1 -1
- package/dist/api.mjs +2 -2
- package/dist/{chunk-YR46VC65.mjs → chunk-KFB23MLQ.mjs} +2 -2
- package/dist/{chunk-YR46VC65.mjs.map → chunk-KFB23MLQ.mjs.map} +1 -1
- package/dist/{chunk-2SJCPZJQ.mjs → chunk-NYE6DBEZ.mjs} +2 -2
- package/dist/components.js +1 -1
- package/dist/components.js.map +1 -1
- package/dist/components.mjs +1 -1
- package/dist/hooks.js +1 -1
- package/dist/hooks.js.map +1 -1
- package/dist/hooks.mjs +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/ui.js +1 -1
- package/dist/ui.js.map +1 -1
- package/dist/ui.mjs +1 -1
- package/package.json +1 -1
- /package/dist/{chunk-2SJCPZJQ.mjs.map → chunk-NYE6DBEZ.mjs.map} +0 -0
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/api/index.ts","../src/hooks/api/bind.ts","../src/store/useLocalStore.ts","../src/api/request.ts","../src/config/env/index.ts","../src/store/index.ts","../src/utils/matchlog.ts","../src/api/index.ts","../src/hooks/useUserInfo.tsx","../src/MatchContext.tsx","../src/hooks/useMatchEvents.ts","../src/hooks/eventManager.ts","../src/utils/index.tsx","../src/hooks/useWallet.tsx","../src/store/useStore.ts","../src/context/ModalContext.tsx","../src/assets/icon/BackIcon.tsx","../src/assets/icon/CloseIcon.tsx","../src/assets/icon/XIcon.tsx","../src/assets/icon/GoogleIcon.tsx","../src/assets/icon/WalletIcon.tsx","../src/assets/icon/TelegramIcon.tsx","../src/assets/icon/EmailIcon.tsx","../src/assets/icon/ArrowRightIcon.tsx","../src/assets/icon/CloseRoundIcon.tsx","../src/assets/icon/LoadingIcon.tsx","../src/assets/icon/EmailLineIcon.tsx","../src/assets/icon/UnLoginIcon.tsx","../src/assets/icon/LoginIcon.tsx","../src/assets/icon/CheckRoundIcon.tsx","../src/assets/icon/PasswordRoundIcon.tsx","../src/assets/icon/CloseEyeIcon.tsx","../src/assets/icon/OpenEyeIcon.tsx","../src/assets/icon/DeleteRoundIcon.tsx","../src/assets/icon/FacebookIcon.tsx","../src/assets/icon/ArrowLeftIcon.tsx","../src/assets/icon/GithubIcon.tsx","../src/assets/icon/DiscordIcon.tsx","../src/assets/icon/CheckIcon.tsx","../src/assets/icon/CopyIcon.tsx","../src/assets/icon/LinkedinIcon.tsx","../src/assets/icon/YoutubeIcon.tsx","../src/assets/icon/BTCDarkIcon.tsx","../src/assets/icon/BTCLightIcon.tsx","../src/assets/icon/EVMDarkIcon.tsx","../src/assets/icon/EVMLightIcon.tsx","../src/assets/icon/SOLDarkIcon.tsx","../src/assets/icon/SOLLightIcon.tsx","../src/assets/icon/TRXDarkIcon.tsx","../src/assets/icon/TRXLightIcon.tsx","../src/assets/icon/ArrowDownIcon.tsx","../src/assets/icon/LeatherIcon.tsx","../src/assets/icon/UnisatIcon.tsx","../src/assets/icon/XverseIcon.tsx","../src/assets/icon/TronLinkIcon.tsx","../src/assets/icon/OKXIcon.tsx","../src/assets/icon/BitgetIcon.tsx","../src/assets/icon/TonDarkIcon.tsx","../src/assets/icon/TonLightIcon.tsx","../src/assets/icon/ErrorRoundIcon.tsx","../src/assets/icon/InfoLineIcon.tsx","../src/assets/icon/InfoRoundIcon.tsx","../src/assets/icon/TransferIcon.tsx","../src/assets/icon/ArrowSendIcon.tsx","../src/assets/icon/PhantomIcon.tsx","../src/assets/icon/MoreIcon.tsx","../src/assets/icon/CheckboxIcon.tsx","../src/assets/icon/CheckboxCheckedIcon.tsx","../src/assets/icon/InputLengthIcon.tsx","../src/ui/Button/index.tsx","../src/ui/Overlay/index.tsx","../src/ui/Drawer/index.tsx","../src/ui/Field/index.tsx","../src/ui/HashPanel/index.tsx","../src/hooks/useLayout.tsx","../src/ui/Modal/index.tsx","../src/components/EmailModal/index.tsx","../src/components/EmailModal/StepEmail.tsx","../src/ui/Input/index.tsx","../src/components/EmailModal/StepVerify.tsx","../src/ui/Popover/index.tsx","../src/components/LoginBox/index.tsx","../src/hooks/useConfig.tsx","../src/hooks/useAppConfig.ts","../src/components/LoginButton/index.tsx","../src/components/LoginPanel/index.tsx","../src/components/LoginModal/index.tsx","../src/components/UserPopover/index.tsx","../src/assets/icon/ProfileIcon.tsx","../src/components/UsernameModal/index.tsx","../src/components/EVMModal/index.tsx","../src/components/WalletModalContent/index.tsx","../src/hooks/useWalletBox.ts","../src/hooks/useEthersSigner.ts","../src/components/TRONModal/index.tsx","../src/hooks/useTRONWallet.ts","../src/components/TONModal/index.tsx","../src/components/BTCModal/index.tsx","../src/lib/btc/XverseAdapter.ts","../src/hooks/useBTCWallet.ts","../src/components/WalletModal/index.tsx","../src/components/AlphaAvatar/index.tsx","../src/components/WalletAsset/index.tsx","../src/components/TokenSend/index.tsx","../src/components/TokenDetail/index.tsx","../src/components/TokenSendList/index.tsx","../src/components/TransactionList/index.tsx","../src/store/useContractStore.ts","../src/hooks/useHash.ts","../src/ui/ModalDrawer/index.tsx","../src/ui/Switch/index.tsx","../src/ui/AlphaAvatar/index.tsx","../src/ui/Radio/index.tsx","../src/ui/Skeleton/index.tsx","../src/ui/Tabs/index.tsx","../src/ui/Lottie/index.tsx","../src/ui/Checkbox/index.tsx","../src/store/useTransactionStore.ts","../src/hooks/useCopyClipboard.ts","../src/context/ToastContext.tsx","../src/hooks/api/wallet.ts","../src/hooks/useMatchChain.tsx","../src/hooks/useMatchWallet.tsx","../src/components/ImportToken/index.tsx","../src/hooks/useIsContract.ts","../src/hooks/useReceipt.tsx","../src/hooks/useTransaction.tsx","../src/store/useModalStore.ts","../src/components/CEXBindModal/index.tsx","../src/context/BusinessProvider.tsx","../src/context/index.tsx","../src/hooks/useWalletInit.ts","../src/hooks/useInit.tsx","../src/config/chains/MatchMain.ts","../src/config/chains/MatchTest.ts","../src/hooks/api/poh.ts","../src/hooks/api/user.ts"],"sourcesContent":["export * as bind from \"./bind\";\nexport * as poh from \"./poh\";\nexport * as user from \"./user\";\nexport * as wallet from \"./wallet\";\nexport {isSuccess} from \"../../api/request\"","import {useQuery} from \"@tanstack/react-query\";\nimport useUserInfo from \"../useUserInfo\";\nimport type {UseQueryOptions} from \"@tanstack/react-query/src/types\";\nimport {BindInfoType, BindItemType} from \"../../types/types\";\nimport {getBindInfoApi, getBindListApi} from \"../../api\";\n\nexport {bindCexApi, unBindApi, unBindWalletApi} from \"../../api\";\n\nexport function useBindList(options?: Partial<Omit<UseQueryOptions<BindItemType[]>, 'queryKey' | 'queryFn'>>) {\n const {isLogin} = useUserInfo()\n return useQuery<BindItemType[]>({\n queryKey: ['bindList'],\n enabled: isLogin,\n queryFn: async () => {\n let res = await getBindListApi()\n return res.data\n },\n ...options\n })\n}\n\nexport function useBindInfo(options?: Partial<Omit<UseQueryOptions<BindInfoType>, 'queryKey' | 'queryFn'>>) {\n const {isLogin} = useUserInfo()\n return useQuery<BindInfoType>({\n queryKey: ['bindInfo'],\n enabled: isLogin,\n queryFn: async () => {\n let res = await getBindInfoApi()\n return res.data\n },\n ...options\n })\n}\n","import {create} from 'zustand';\nimport { devtools, persist } from 'zustand/middleware';\nimport {\n type IEnvConfigType,\n LocaleType,\n OverviewInfo,\n ThemeType,\n WalletAssetMergeType,\n WalletConfigType\n} from \"../types/types\";\nimport {getOverviewInfoApi} from \"../api\";\n\ninterface StoreState {\n appid:string\n token:string\n did:string\n mid:string\n theme:\"dark\"|\"light\"\n endpoints:IEnvConfigType['endpoints']\n\n setAppid: (appid: string) => void;\n setToken: (token: string) => void;\n setDid: (did: string) => void;\n setMid: (mid: string) => void;\n setEndpoints:(endpoints:IEnvConfigType['endpoints'])=>void\n\n logout: () => void;\n overview:OverviewInfo|null\n setOverview:(overview:OverviewInfo)=>void\n refreshOverview:()=>Promise<void>\n setTheme:(theme:\"dark\"|\"light\")=>void\n\n address:string\n setAddress:(address:string)=>void\n\n locale:LocaleType,\n setLocale:(locale:LocaleType)=>void\n\n wallet:WalletConfigType\n setWallet:(wallet:WalletConfigType)=>void\n\n chainId:number\n setChainId:(chainId:number)=>void\n\n assets:WalletAssetMergeType[]\n setAssets:(assets:WalletAssetMergeType[])=>void\n}\n\nconst persistedState = persist<StoreState>(\n set => ({\n appid: '',\n token:'',\n did:'',\n mid:'',\n overview:null,\n theme:'light',\n setOverview:(overview:OverviewInfo)=>set({\n overview,\n address:overview.address,\n did:overview.did,\n mid:overview.mid\n }),\n refreshOverview:async()=>{\n const res = await getOverviewInfoApi()\n if (res.data) {\n set({overview:res.data})\n set({address:res.data.address})\n set({did:res.data.did})\n set({mid:res.data.mid})\n }\n },\n endpoints:{\n back: \"https://api.matchid.ai/\",\n auth:\"https://auth.matchid.ai/\"\n },\n setDid: (did: string) => set({ did: did }),\n setToken: (token: string) => set({ token: token }),\n setAppid: (appid: string) => set({ appid: appid }),\n setMid: (mid: string) => set({ mid: mid }),\n logout: () => set({ token: '',did:'',mid:'',address:'',overview:null ,assets:[]}),\n setTheme:(theme:\"dark\"|\"light\")=>set({theme}),\n setEndpoints:(endpoints:IEnvConfigType['endpoints'])=>set({endpoints}),\n\n address:'',\n setAddress:(address:string)=>set({address}),\n\n locale:'en',\n setLocale:(locale:LocaleType)=>set({locale}),\n\n wallet:{\n type: \"UserPasscode\"\n },\n setWallet:(wallet:WalletConfigType)=>set({wallet}),\n\n chainId:698,\n setChainId:(chainId:number)=>set({chainId}),\n assets:[],\n setAssets:(assets:WalletAssetMergeType[])=>set({assets})\n\n\n }),\n { name: 'match-local' }\n);\n\nconst useLocalStore = create(devtools(persistedState));\n\nexport const localStore = useLocalStore;\n\nexport default useLocalStore;\n","import axios, {AxiosRequestConfig} from 'axios';\nimport {getAppid, getEndpoints, getLocale, getToken} from '../store';\nimport { localStore } from '../store/useLocalStore';\nimport matchlog from \"../utils/matchlog\";\nimport axiosRetry from \"axios-retry\";\n\nexport const SUCCESS_CODE = 0;\n\nexport const isSuccess = (res: { code: number; message: string; data?: any }) => {\n return res.code === SUCCESS_CODE;\n};\n\nexport interface MyResponseType<T> {\n code: number;\n data: T;\n message: string;\n success: boolean;\n fail: boolean;\n result: T;\n}\n\nconst instance = axios.create({\n timeout: 60000,\n validateStatus(status) {\n return status >= 200 && status <= 500;\n },\n});\n\n\n\nconst request = async <T = any>(config: AxiosRequestConfig): Promise<MyResponseType<T>> => {\n try {\n const endpoints = getEndpoints();\n const token = getToken()\n instance.defaults.baseURL = `${endpoints.back}`;\n\n instance.defaults.headers.common['Appid'] = getAppid()\n if(token){\n instance.defaults.headers.common['Authorization'] = token;\n }\n instance.defaults.headers.common['Accept-Language'] = getLocale()\n\n\n const {data} = await instance.request<MyResponseType<T>>(config);\n matchlog.log('api',data)\n if(data.code == 401001){\n localStore.getState().logout()\n throw new Error(\"Your session has expired, please log in again\")\n }\n // if (data.code !== 0) {\n // throw new Error(data.message);\n // }\n return data;\n } catch (err) {\n console.error('qwe-err', err);\n const message = 'Request Error';\n console.error(message);\n return {\n code: -1,\n data: null as any,\n message,\n success: false,\n fail: true,\n result: null as any,\n };\n }\n};\n\nconst retryInstance = axios.create({\n timeout: 60000,\n validateStatus(status) {\n return status >= 200 && status <= 500;\n },\n});\naxiosRetry(retryInstance, {\n retries: 3,\n retryDelay: (retryCount) => retryCount * 1000,\n shouldResetTimeout: true,\n retryCondition: (error) => {\n return (error!.response!.status >= 500 && error!.response!.status<600) || error.code === 'ECONNABORTED';\n },\n});\nexport const retryRequest = async <T = any>(config: AxiosRequestConfig): Promise<MyResponseType<T>> => {\n try {\n const endpoints = getEndpoints();\n const token = getToken()\n retryInstance.defaults.baseURL = `${endpoints.back}`;\n\n retryInstance.defaults.headers.common['Appid'] = getAppid()\n if(token){\n retryInstance.defaults.headers.common['Authorization'] = token;\n }\n retryInstance.defaults.headers.common['Accept-Language'] = getLocale()\n\n\n const {data} = await retryInstance.request<MyResponseType<T>>(config);\n matchlog.log('api',data)\n if(data.code == 401001){\n localStore.getState().logout()\n throw new Error(\"Your session has expired, please log in again\")\n }\n // if (data.code !== 0) {\n // throw new Error(data.message);\n // }\n return data;\n } catch (err) {\n console.error('qwe-err', err);\n const message = 'Request Error';\n console.error(message);\n return {\n code: -1,\n data: null as any,\n message,\n success: false,\n fail: true,\n result: null as any,\n };\n }\n};\n\nexport default request;","import type {IEnvConfigType} from \"../../types/types\";\n\nexport default {\n endpoints:{\n back: \"https://api.matchid.ai/\",\n auth:\"https://auth.matchid.ai/\"\n }\n} as IEnvConfigType","import { localStore } from './useLocalStore';\nimport DefaultEnv from '../config/env';\nexport const getEndpoints = ()=>{\n try {\n const store = localStore.getState();\n\n const env = store?.endpoints;\n\n if (env) {\n return env;\n } else {\n return DefaultEnv.endpoints\n }\n } catch (e) {\n return DefaultEnv.endpoints\n }\n}\n\nexport const getAppid = () => {\n try {\n const store = localStore.getState();\n const appid = store?.appid;\n if (appid) {\n return appid;\n } else {\n return '';\n }\n } catch (e) {\n return '';\n }\n}\n\nexport const getLocale = () => {\n try {\n const store = localStore.getState();\n const locale = store?.locale;\n if (locale) {\n return locale;\n } else {\n return 'en';\n }\n } catch (e) {\n return 'en';\n }\n}\nexport const getToken = () => {\n try {\n const store = localStore.getState();\n const token = store?.token;\n if (token) {\n return token;\n } else {\n return '';\n }\n } catch (e) {\n return '';\n }\n}","// src/utils/logger.ts\nconst matchDevExists = () => localStorage.getItem('matchid-sdk-react-debug') !== null;\n\nconst handler = {\n get(target: any, prop: string) {\n if (matchDevExists() && typeof target[prop] === 'function') {\n return target[prop].bind(console);\n }\n return () => {};\n }\n};\n\nconst matchlog = new Proxy(console, handler);\n\nexport default matchlog;","import request, {retryRequest} from \"./request\";\nimport {\n AppConfigType,\n BindInfoType,\n BindItemType,\n BindWalletParam,\n MetaPageType,\n OverviewInfo,\n PohItemType,\n PohZkpassParams,\n UserAssetToken,\n UserChainType,\n UserImportTokenType,\n UserTransactionNextPageParams,\n UserTransactionType,\n WalletAssetType,\n WalletChainType, WalletNFTType\n} from \"../types/types\";\n\nexport const getEmailCodeApi = (email: string) => {\n return request<any>({\n url: `/api/v1/email/code`,\n method: \"POST\",\n data: {email}\n });\n}\n\nexport const verifyEmailCodeApi = ({email, verification_key, verification_code}: {\n email: string,\n verification_key: string,\n verification_code: string\n}) => {\n return request<any>({\n url: `/api/v1/user/email/login`,\n method: \"POST\",\n data: {email, verification_key, verification_code}\n });\n}\n\n\nexport const getOverviewInfoApi = () => {\n return retryRequest<OverviewInfo>({\n url: `/api/v1/user/overview`,\n method: \"GET\",\n });\n}\nexport const toLogoutApi = () => {\n return retryRequest<any>({\n url: `/api/v1/user/logout`,\n method: \"POST\",\n });\n}\n\nexport const setUserNameApi = (data: any) => {\n return request({\n url: `/api/v1/user/name`,\n method: \"POSt\",\n data\n });\n}\n\nexport const getBindListApi = () => {\n return retryRequest<BindItemType[]>({\n url: `/api/v1/bind/list`,\n method: \"GET\",\n });\n}\n\nexport const getPohListApi = () => {\n return retryRequest<PohItemType[]>({\n url: `/api/v1/poh/list`,\n method: \"GET\",\n });\n}\n\nexport const getBindInfoApi = () => {\n return retryRequest<BindInfoType>({\n url: `/api/v1/bind`,\n method: \"GET\",\n });\n}\n\n\nexport const bindCexApi = (data: {\n cex: string,\n api_key: string,\n api_secret: string,\n api_passphrase?: string\n}) => {\n return request<any>({\n url: `/api/v1/cex/subscribe`,\n method: \"POST\",\n data\n });\n}\n\n\nexport const unBindApi = ({type}: { type: string }) => {\n return request<any>({\n url: `/api/v1/unbind`,\n method: \"POST\",\n data: {type}\n });\n}\n\nexport const unBindWalletApi = ({address}: { address: string }) => {\n return request<any>({\n url: `/api/v1/wallet/unbind`,\n method: \"POST\",\n data: {address}\n });\n}\n\nexport const verifyPohApi = ({\n taskId,\n schemaId,\n publicFields,\n allocatorAddress,\n publicFieldsHash,\n allocatorSignature,\n uHash,\n validatorAddress,\n validatorSignature\n }: PohZkpassParams) => {\n return request<any>({\n url: `/api/v1/poh/zkpass`,\n method: \"POST\",\n data: {\n taskId,\n schemaId,\n publicFields,\n allocatorAddress,\n publicFieldsHash,\n allocatorSignature,\n uHash,\n validatorAddress,\n validatorSignature\n }\n });\n}\n\nexport const chooseIdentityApi = ({identity}: { identity: string }) => {\n return request<any>({\n url: `/api/v1/user/choose/identity`,\n method: \"POST\",\n data: {identity}\n });\n}\n\nexport const mintPassportNftApi = () => {\n return request<any>({\n url: `/api/v1/mint/passport/nft`,\n method: \"POST\",\n });\n}\n\nexport const getAuthInfoApi = () => {\n return retryRequest<any>({\n url: `/api/v1/user/auth`,\n method: \"GET\",\n });\n}\n\nexport const getWalletNonceApi = (data: { address: string, type: string }) => {\n return retryRequest<any>({\n url: `/api/v1/login/wallet/init`,\n method: \"POST\",\n data: data\n });\n}\n\nexport const loginByWalletApi = ({\n type,\n address,\n signature,\n message,\n connector_type,\n wallet_client_type\n }: BindWalletParam) => {\n return request<any>({\n url: `/api/v1/login/wallet`,\n method: \"POST\",\n data: {type, address, signature, message, connector_type, wallet_client_type}\n });\n}\n\n\nexport const getWalletInitApi = (data: { address: string, type: string }) => {\n return retryRequest<any>({\n url: `/api/v1/wallet/init`,\n method: \"POST\",\n data,\n });\n}\n\nexport const toBindWalletApi = ({\n type,\n address,\n signature,\n message,\n connector_type,\n wallet_client_type\n }: BindWalletParam) => {\n return request<any>({\n url: `/api/v1/wallet/bind`,\n method: \"POST\",\n data: {type, address, signature, message, connector_type, wallet_client_type}\n });\n}\n\nexport const getAppConfigApi = () => {\n return retryRequest<AppConfigType>({\n url: `/api/v1/app/config`,\n method: \"GET\",\n });\n}\n\nexport const getUserChainListApi = () => {\n return request<UserChainType[]>({\n url: `/api/v1/user/chain/list`,\n method: \"GET\",\n });\n}\n\nexport const userImportTokenApi = (data: {\n chain_id: string,\n symbol: string,\n address: string,\n decimals: string,\n}) => {\n return request<any>({\n url: `/api/v1/user/import/token`,\n method: \"POST\",\n data\n });\n}\nexport const getUserImportTokenListApi = (data: {\n chain_id: string\n}) => {\n return request<UserImportTokenType[]>({\n url: `/api/v1/user/import/token/list`,\n method: \"POST\",\n data\n });\n}\n\nexport const getUserWalletAssetApi = (data: {\n chain_id: string\n}) => {\n return request<UserAssetToken[]>({\n url: `/api/v1/user/wallet/asset`,\n method: \"POST\",\n data\n });\n}\n\nexport const getUserWalletTransactionsApi = (data: {\n address?: string\n chain_id: string\n page?: string\n block_number?:number\n index?:number\n items_count?:number\n}) => {\n return request<{\n transactions: UserTransactionType[]\n next_page_params:UserTransactionNextPageParams\n }>({\n url: `/api/v1/user/wallet/transactions`,\n method: \"POST\",\n data\n });\n}\n\nexport const getWalletAssetListApi = (data: {\n chain_id: string\n address: string\n}) => {\n return request<{\n asset_list:WalletAssetType[]\n asset_total_balance:string\n }>({\n url: `/api/v1/wallet/asset`,\n method: \"POST\",\n data\n });\n}\n\nexport const getWalletListApi = (data: {\n page: number\n page_size: number\n}) => {\n return request<MetaPageType<{\n wallet_list:{\n address:string\n chain_network:string\n }[]\n mpc_address:string\n }>>({\n url: `/api/v1/wallet/list`,\n method: \"POST\",\n data\n });\n}\n\nexport const getWalletChainListApi = () => {\n return request<WalletChainType[]>({\n url: `/api/v1/wallet/chain`,\n method: \"POST\",\n });\n}\n\nexport const getWalletNftListApi = (data:{\n chain_id:string\n address:string\n})=>{\n return request<WalletNFTType[]>({\n url: `/api/v1/wallet/nfts`,\n method: \"POST\",\n data\n });\n}\n\nexport const tgAppLoginInitApi = ()=>{\n return retryRequest<{\n code:string\n login_url:string\n }>({\n url: `/api/v1/tgapp/login/init`,\n method: \"GET\",\n });\n}\n\nexport const getTgAppLoginStatus = (data:{\n code:string\n})=>{\n return retryRequest<{\n access_token:string\n token_type:string\n }>({\n url: `/api/v1/tgapp/login/status`,\n method: \"POST\",\n data\n });\n}\n\nexport const userInviteApi = (data:{\n invite_code:string\n})=>{\n return request<any>({\n url: `/api/v1/user/invite`,\n method: \"POST\",\n data\n });\n}\n","import useLocalStore from \"../store/useLocalStore\";\nimport {useMemo} from \"react\";\nimport {CEXType, ISocialLoginMethod, LoginMethodType} from \"../types/types\";\nimport {\n getAuthInfoApi,\n getEmailCodeApi,\n getOverviewInfoApi,\n tgAppLoginInitApi,\n toLogoutApi, userInviteApi,\n verifyEmailCodeApi\n} from \"../api\";\nimport {isSuccess} from \"../api/request\";\nimport {useMatch} from \"../MatchContext\";\nimport eventManager from \"./eventManager\";\nimport {encodeBase64, isInTgApp} from \"../utils\";\nimport matchlog from \"../utils/matchlog\";\nimport {\n useBTCModalStore,\n useCEXBindModalStore,\n useEVMModalStore,\n useTONModalStore,\n useTRONModalStore, useWalletModalStore\n} from \"../store/useModalStore\";\nimport {LOGIN_METHOD_MAP} from \"../config\";\nimport useStore from \"../store/useStore\";\nimport {useDownMd} from \"./useLayout\";\n\nexport default function useUserInfo() {\n const {\n appid,\n token,\n mid,\n did,\n logout: logoutStore,\n setOverview,\n overview,\n address,\n endpoints,\n locale,\n refreshOverview,\n } = useLocalStore();\n const {setTgAppAuthCode,emailLoginKey,setEmailLoginKey} = useStore()\n const isDownMd = useDownMd()\n const {events, login} = useMatch()\n const {open:EVMOpen} = useEVMModalStore()\n const {open: TRONOpen} = useTRONModalStore()\n const {open: TONOpen} = useTONModalStore()\n const {open: BTCOpen} = useBTCModalStore()\n const {open: CEXBindOpen} = useCEXBindModalStore()\n const walletModalStore = useWalletModalStore()\n\n const getRedirectUri = ()=>{\n return encodeURIComponent(window.location.href)\n }\n\n\n const isLogin = useMemo(() => !!token && !!overview, [token, overview])\n\n const logout = async () => {\n try {\n await toLogoutApi()\n } catch (err: any) {\n console.error('logout', err)\n }\n\n logoutStore()\n events && events!.onLogout && events!.onLogout()\n eventManager.emit('onLogout');\n }\n\n const loginByMethod = async (method: ISocialLoginMethod) => {\n const link = `${endpoints.back}api/v1/auth/${method == 'youtube' ? 'google' : method}?appid=${appid}&provider=${method == 'youtube' ? 'google' : method}&redirect=${encodeURIComponent(endpoints.auth + 'login/' + method)}&authorization=${new Date().getTime()}${method == \"youtube\" ? '&auth_type=youtube' : ''}`;\n matchlog.log('link', link)\n return window.open(\n link, // Replace with the actual authorization URL\n 'authWindow',\n 'width=800,height=600'\n );\n }\n\n const loginByTwitter = () => {\n return loginByMethod('twitter')\n }\n const loginByGoogle = () => {\n return loginByMethod('google')\n }\n\n const loginByWallet = async () => {\n // return EVMOpen('login')\n return window.open(`${endpoints.auth}login/wallet?appid=${appid}&locale=${locale}`)\n\n }\n const loginByTelegram = async () => {\n if (isInTgApp()) {\n //get auth code\n try {\n const res = await tgAppLoginInitApi()\n if (!isSuccess(res)) {\n throw new Error(res.message)\n }\n setTgAppAuthCode(res.data.code)\n const link = res.data.login_url + `?startapp=${res.data.code}_${appid}_${locale}`\n console.log('tgAppLoginInitLink', link)\n if (window.TelegramWebviewProxy) {\n console.log('in telegram webview')\n if (!window.Telegram) {\n throw new Error('Please import telegram-web-app.js first')\n }\n window.Telegram.WebApp.openTelegramLink(link)\n return\n }\n console.log('not in telegram webview')\n window.open(link)\n return\n\n\n } catch (e: any) {\n console.error('tgAppLoginInitApi', e)\n throw e\n }\n }\n\n return window.open(\n `${endpoints.auth}login/telegram?appid=${appid}&locale=${locale}`, // Replace with the actual authorization URL\n 'authWindow',\n 'width=800,height=600'\n );\n }\n\n const loginMethod = async (method: LoginMethodType | 'wallet', extra?: {\n [key: string]: any\n }) => {\n switch (method) {\n case \"wallet\":\n return walletModalStore.open(\"login\", extra?.methods)\n case \"evm\":\n return EVMOpen('login')\n // return window.open(`${endpoints.auth}login/wallet?appid=${appid}&locale=${locale}`)\n case \"sol\":\n if(isDownMd){\n return window.location.href = `${endpoints.auth}login/sol?appid=${appid}&locale=${locale}&redirect_uri=${getRedirectUri()}`\n }\n return window.open(`${endpoints.auth}login/sol?appid=${appid}&locale=${locale}`)\n case \"tron\":\n return TRONOpen('login')\n case \"ton\":\n return TONOpen('login')\n case \"btc\":\n return BTCOpen('login')\n case \"telegram\":\n return await loginByTelegram()\n case \"youtube\":\n case \"twitter\":\n case \"google\":\n case \"discord\":\n case \"github\":\n case \"linkedin\":\n case \"facebook\":\n return await loginByMethod(method)\n default:\n throw new Error('unsupported method')\n\n }\n }\n\n\n const getLoginEmailCode = async (email: string) => {\n const res = await getEmailCodeApi(email);\n if (isSuccess(res)) {\n setEmailLoginKey(res.data.key)\n // window.sessionStorage.setItem('loginkey', res.data.key as string)\n return res.data.key as string\n }\n throw new Error(res.message)\n }\n\n const loginByEmail = async ({\n email,\n code\n }: { email: string, code: string }) => {\n try {\n const obj = {\n email: email,\n verification_key: emailLoginKey,\n verification_code: code,\n }\n const res = await verifyEmailCodeApi(obj);\n if (res && res.data && isSuccess(res)) {\n await login({\n // mid: res.data.mid,\n token: `${res.data.token_type} ${res.data.access_token}`\n })\n return true;\n\n } else {\n throw new Error(res.message)\n }\n } catch (error) {\n console.error('loginByEmail', error);\n throw error\n }\n return false\n };\n\n\n const bindWallet = async () => {\n if (!token) {\n throw new Error('You must login first')\n }\n return window.open(`${endpoints.auth}bind/wallet?appid=${appid}&locale=${locale}&st=` + encodeURIComponent(encodeBase64(token)))\n }\n\n const bindTelegram = async () => {\n if (!token) {\n throw new Error('You must login first')\n }\n const authWindow = window.open(\n `${endpoints.auth}bind/telegram?appid=${appid}&locale=${locale}&st=` + encodeURIComponent(encodeBase64(token)), // Replace with the actual authorization URL\n 'authWindow',\n 'width=800,height=600'\n );\n }\n\n const auth = async () => {\n const res = await getAuthInfoApi()\n if (isSuccess(res)) {\n return res.data\n }\n throw new Error(res.message)\n }\n\n const bind = async (method: LoginMethodType | 'wallet', extra?: {\n [key: string]: any\n }) => {\n if (!token) {\n throw new Error('You must login first')\n }\n switch (method) {\n case \"wallet\":\n return walletModalStore.open(\"bind\", extra?.methods)\n case \"evm\":\n return EVMOpen('bind')\n // return window.open(`${endpoints.auth}bind/wallet?appid=${appid}&locale=${locale}&st=` + encodeURIComponent(encodeBase64(token)))\n case \"sol\":\n if(isDownMd){\n return window.location.href = `${endpoints.auth}bind/sol?appid=${appid}&locale=${locale}&st=${encodeURIComponent(encodeBase64(token))}&redirect_uri=${getRedirectUri()}`\n }\n return window.open(`${endpoints.auth}bind/sol?appid=${appid}&locale=${locale}&st=${encodeURIComponent(encodeBase64(token))}`)\n case \"tron\":\n return TRONOpen('bind')\n case \"ton\":\n return TONOpen('bind')\n case \"btc\":\n return BTCOpen('bind')\n case \"telegram\":\n return await bindTelegram()\n case \"twitter\":\n case \"google\":\n case \"discord\":\n case \"github\":\n case \"linkedin\":\n case \"facebook\":\n case \"youtube\":\n const link = `${endpoints.back}api/v1/auth/${method == 'youtube' ? 'google' : method}?appid=${appid}&provider=${method == 'youtube' ? 'google' : method}&redirect=${encodeURIComponent(endpoints.auth + 'bind/' + method)}&authorization=${token.includes(\"Bearer \") ? token.split(' ')[1] : token}${method == \"youtube\" ? '&auth_type=youtube' : ''}`;\n matchlog.log('link', link)\n return window.open(\n link,\n 'authWindow',\n 'width=800,height=600'\n );\n default:\n throw new Error('unsupported method')\n\n }\n }\n\n const bindCex = (type: CEXType) => {\n return CEXBindOpen(type)\n }\n\n const getAuthInfo = async (method: keyof typeof LOGIN_METHOD_MAP) => {\n // create a full screen iframe to get the auth info\n const element_id = 'auth_iframe'\n //if the iframe already exists, remove it\n if (document.getElementById(element_id)) {\n document.getElementById(element_id)!.remove()\n }\n const iframe = document.createElement('iframe')\n iframe.id = element_id\n iframe.src = `${endpoints.auth}auth?appid=${appid}&method=${method}&locale=${locale}&token=${encodeURIComponent(encodeBase64(token))}`\n iframe.style.width = '100vw'\n iframe.style.height = '100vh'\n iframe.style.position = 'fixed'\n iframe.style.top = '0'\n iframe.style.left = '0'\n iframe.style.zIndex = '9999'\n iframe.style.border = 'none'\n //@ts-ignore\n iframe.allowTransparency = 'true'\n document.body.appendChild(iframe)\n return new Promise((resolve, reject) => {\n const authMessageHandle = (event: MessageEvent) => {\n if (endpoints.auth.includes(event.origin)) {\n const res = event.data\n if (res.source == 'match-auth') {\n window.removeEventListener('message', authMessageHandle)\n if (res.status == 'success') {\n resolve({\n ...res.data,\n method: res.method,\n appid: res.appid,\n did\n })\n } else {\n reject(new Error(res.message))\n }\n\n iframe.remove()\n }\n }\n }\n window.addEventListener('message', authMessageHandle)\n })\n }\n\n const invite = async(invite_code:string)=>{\n return await userInviteApi({\n invite_code\n })\n }\n\n\n return {\n loginByMethod,\n loginByTelegram,\n loginByTwitter,\n loginByGoogle,\n loginByWallet,\n loginByEmail,\n\n bindWallet,\n bindTelegram,\n\n\n token,\n mid,\n did,\n address,\n isLogin,\n logout,\n getLoginEmailCode,\n refreshOverview,\n overview,\n bindCex,\n username: overview?.username || '',\n auth,\n\n login: loginMethod,\n bind,\n\n getAuthInfo,\n invite\n }\n}","// src/MatchContext.tsx\nimport React, {createContext, useContext, ReactNode, useEffect} from 'react';\nimport Providers from './context';\nimport {IEnvConfigType, IMatchEvents, LocaleType, WalletConfigType} from \"./types/types\";\nimport useWalletInit from \"hooks/useWalletInit\"\nimport useInit from \"./hooks/useInit\";\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query';\nimport {IntlProvider} from 'react-intl';\nimport {messages} from \"./i18n\"\nimport {getDefaultConfig, RainbowKitProvider} from \"@rainbow-me/rainbowkit\";\nimport {\n bitgetWallet,\n injectedWallet,\n metaMaskWallet,\n okxWallet,\n walletConnectWallet\n} from \"@rainbow-me/rainbowkit/wallets\";\nimport {arbitrum, base, bsc, mainnet, optimism, polygon} from \"wagmi/chains\";\nimport {matchMain} from \"./config/chains/MatchMain\";\nimport {matchTest} from \"./config/chains/MatchTest\";\nimport {WagmiProvider} from \"wagmi\";\n\nconst queryClient = new QueryClient();\nexport const wagmiConfig = getDefaultConfig({\n appName: \"MatchID\",\n projectId: \"9ac6ea7e07860f04616fb311b447dee9\",\n wallets: [\n {\n groupName: \"Recommended\",\n wallets: [\n metaMaskWallet,\n walletConnectWallet,\n okxWallet,\n bitgetWallet,\n injectedWallet,\n ],\n },\n ],\n chains: [mainnet, polygon, optimism, arbitrum, base, matchMain, matchTest, bsc],\n});\ntype MatchContextType = {\n appid: string;\n events?: IMatchEvents;\n login: (data: { token: string }) => Promise<void>;\n theme: \"light\" | \"dark\";\n locale?: LocaleType\n} & Partial<IEnvConfigType>\n\nexport const MatchContext = createContext<MatchContextType | undefined>(undefined);\n\nexport const MatchProvider: React.FC<{\n children: ReactNode;\n appid: string;\n events?: IMatchEvents;\n theme?: \"light\" | \"dark\",\n endpoints?: IEnvConfigType['endpoints']\n locale?: LocaleType\n wallet: WalletConfigType\n}> = ({\n children,\n appid,\n events,\n theme = \"light\",\n endpoints,\n locale,\n wallet\n }) => {\n\n const {login, endpoints: realEndPoints, locale: realLocale} = useInit({\n theme,\n appid,\n events,\n endpoints,\n locale\n })\n\n // matchlog.log('config', {\n // appid,\n // events,\n // theme,\n // endpoints,\n // locale,\n // wallet\n // })\n //\n\n useWalletInit({\n config: wallet,\n })\n\n return (\n <IntlProvider locale={realLocale} messages={messages[realLocale]}>\n <WagmiProvider config={wagmiConfig}>\n <QueryClientProvider client={queryClient}>\n <MatchContext.Provider\n value={{\n appid,\n endpoints: realEndPoints,\n events,\n login,\n theme,\n locale: realLocale\n }}\n >\n <Providers>{children}</Providers>\n </MatchContext.Provider>\n </QueryClientProvider>\n </WagmiProvider>\n </IntlProvider>\n\n );\n};\n\nexport const useMatch = () => {\n const context = useContext(MatchContext);\n\n if (context === undefined) {\n throw new Error('useMatch must be used within a MatchProvider');\n }\n return context;\n};","// src/hooks/useMatchEvents.ts\nimport { useEffect } from \"react\";\nimport eventManager from \"./eventManager\";\nimport {IMatchEvents} from \"../types/types\";\n\n\nexport default function useMatchEvents(handlers: IMatchEvents) {\n useEffect(() => {\n Object.entries(handlers).forEach(([event, handler]) => {\n if (handler) {\n eventManager.on(event, handler);\n }\n });\n\n return () => {\n Object.entries(handlers).forEach(([event, handler]) => {\n if (handler) {\n eventManager.off(event, handler);\n }\n });\n };\n }, [handlers]);\n}\n","// src/hooks/eventManager.ts\ntype EventCallback = (...args: any[]) => void;\n\nclass EventManager {\n private listeners: Record<string, Set<EventCallback>> = {};\n\n on(event: string, callback: EventCallback) {\n if (!this.listeners[event]) {\n this.listeners[event] = new Set();\n }\n this.listeners[event].add(callback);\n }\n\n off(event: string, callback: EventCallback) {\n if (this.listeners[event]) {\n this.listeners[event].delete(callback);\n if (this.listeners[event].size === 0) {\n delete this.listeners[event];\n }\n }\n }\n\n emit(event: string, ...args: any[]) {\n if (this.listeners[event]) {\n this.listeners[event].forEach(callback => callback(...args));\n }\n }\n}\n\nconst eventManager = new EventManager();\n\nexport default eventManager;\n","import moment from 'moment';\n\nexport const getVersion = (): string => {\n return \"0.0.2\";\n};\n\nexport function encodeBase64(input: string) {\n return btoa(unescape(encodeURIComponent(input)));\n}\n\nexport function decodeBase64(input: string) {\n return decodeURIComponent(escape(atob(input)));\n}\n\nexport const isValidEmail = (email: string) => {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)\n}\nexport const isValidUsername = (username: string) => {\n //8-32 alpha number - _\n return /^[a-zA-Z0-9_-]+$/.test(username)\n}\n\nexport const deepMerge = (target: any, source: any): any => {\n for (const key in source) {\n if (source[key] instanceof Object && key in target) {\n target[key] = deepMerge(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n }\n return target;\n};\n\nexport function truncateAddress(address: string, startLen = 4, endLen = 4): string {\n if (address.length <= startLen + endLen) {\n return address;\n }\n const start = address.slice(0, startLen);\n const end = address.slice(-endLen);\n return `${start}...${end}`;\n}\n\n\nexport function firstUpperCase(str: string): string {\n return str.toString()[0].toUpperCase() + str.toString().slice(1);\n}\n\nexport function getAppClientId() {\n return \"react-sdk-\" + getVersion()\n}\n\n\nfunction convertScientificToDecimal(num: number) {\n let str = num.toFixed(12)\n str = str.replace(/0+$/, '')\n str = str.replace(/\\.$/, '')\n return str\n}\n\ninterface NumberFormatterProps {\n value: number | string | undefined\n prefix?: string\n suffix?: string\n separator?: boolean\n fixNum?: number //number >= 1 fix num\n tFixNum?: number //number < 1 fix num\n intClassName?: string\n decimalClassName?: string\n prefixClassName?: string\n className?: string\n}\n\nexport const NumberFormatter: React.FC<NumberFormatterProps> = ({\n value,\n prefix = '',\n suffix = '',\n separator = true,\n fixNum = 2,\n tFixNum = 4,\n intClassName = \"\",\n decimalClassName = \"\",\n prefixClassName = \"\",\n className = \"\"\n }) => {\n const numberValue =\n typeof value === 'number'\n ? convertScientificToDecimal(value)\n : value\n ? value\n : '0'\n\n const [intPart, decimalPart] = numberValue.toString().split('.')\n\n const intFormat = separator\n ? intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n : intPart\n\n if (Math.abs(parseFloat(numberValue)) >= 1) {\n return (\n <span className={className}>\n {prefix && <span className={prefixClassName}>{prefix}</span>}\n <span className={intClassName}>{intFormat}</span>\n {decimalPart ? (\n <span className={decimalClassName}>\n .{decimalPart.substring(0, fixNum)}\n </span>\n ) : (\n ''\n )}\n {suffix}\n </span>\n )\n }\n\n if (decimalPart) {\n let zeroCount = 0\n for (let i = 0; i < decimalPart.length; i++) {\n if (decimalPart[i] === '0') {\n zeroCount++\n } else {\n break\n }\n }\n if (zeroCount < tFixNum) {\n return (\n <span className={className}>\n {prefix && <span className={prefixClassName}>{prefix}</span>}\n <span className={intClassName}>{intFormat}</span>\n <span className={decimalClassName}>\n .{decimalPart.substring(0, tFixNum)}\n </span>\n {suffix}\n </span>\n )\n }\n return (\n <span className={className}>\n {prefix && <span className={prefixClassName}>{prefix}</span>}\n <span className={intClassName}>{intFormat}</span>\n <span className={decimalClassName}>\n .0<sub>{zeroCount}</sub>\n {decimalPart?.substring(zeroCount, zeroCount + tFixNum - 2)}\n </span>\n {suffix}\n </span>\n )\n }\n return (\n <span className={className}>\n {prefix && <span className={prefixClassName}>{prefix}</span>}\n <span className={intClassName}>{intPart}</span>\n {suffix}\n </span>\n )\n}\n\nexport function formatAddress(address: string, pre = 4, after = 5) {\n return `${address.substring(0, pre)}...${address.substring(address.length - after, address.length)}`\n}\n\nexport const formatDate = (value: any, formatString = 'YYYY-MM-DD HH:mm:ss') => {\n if (value) {\n return moment.unix(value).format(formatString)\n }\n return '--'\n}\nexport const isInTgApp = () => {\n return !!(window.TelegramWebviewProxy)\n}\n\nexport function bytesToBase64(bytes: Uint8Array) {\n const binString = String.fromCodePoint(...bytes);\n return btoa(binString);\n}","import useLocalStore from \"../store/useLocalStore\";\nimport {getVersion} from \"../utils\";\nimport {\n Account, Chain, createPublicClient,\n encodeFunctionData,\n EncodeFunctionDataParameters,\n Hex, http,\n SignableMessage,\n TransactionSerializable,\n WalletClientConfig\n} from 'viem';\nimport useStore from \"../store/useStore\";\nimport {ChainType, RecoveryType} from \"../types/mpc\";\nimport {toAccount} from \"viem/accounts\";\nimport {createWalletClient} from \"viem\";\nimport {useEffect, useMemo, useState} from \"react\";\nimport {retryMessage} from \"../utils/wallet\";\nimport {Hash} from \"viem/types/misc\";\nimport {SendTransactionParameters, encodeDeployData, DeployContractParameters, WriteContractParameters} from \"viem\";\nimport type {Abi, Address} from \"abitype\";\nimport matchlog from \"../utils/matchlog\";\nimport {useModal} from \"../context/ModalContext\";\nimport {HashPanel} from \"../ui\";\nimport useTransactionStore from \"../store/useTransactionStore\";\n\ntype isRecoveredType = () => Promise<boolean>;\ntype signMessageType = (params: { message: SignableMessage, chainType?: ChainType }) => Promise<Hex>;\ntype signTransactionType = (params: {\n transaction: TransactionSerializable,\n chainType?: ChainType\n chain: {\n id: number,\n name: string,\n nativeCurrency: {\n name: string\n symbol: string\n decimals: number\n },\n rpcUrls: {\n [key: string]: any\n }\n }\n}) => Promise<`0x02${string}` | `0x01${string}` | `0x03${string}` | `0x04${string}` | import(\"viem\").TransactionSerializedLegacy>;\ntype SendTransactionReturnType = Hash\ntype SendTransactionParametersType = Omit<SendTransactionParameters, 'account'>\ntype SendTransactionType = (\n transaction: SendTransactionParametersType\n // chainType?: ChainType\n // chainId?: number\n) => Promise<SendTransactionReturnType>\ntype DeployContractReturnType = SendTransactionReturnType\ntype DeployContractType = <const abi extends Abi | readonly unknown[]>(\n parameters: DeployContractParameters<abi>\n) => Promise<DeployContractReturnType>;\ntype WriteContractParametersType = Omit<WriteContractParameters, 'account' | 'chain'> & {\n chain?: Chain\n}\ntype WriteContractReturnType = SendTransactionReturnType\ntype WriteContractType = (params: WriteContractParametersType) => Promise<WriteContractReturnType>\n\ninterface UseWalletReturnType {\n walletReady: boolean\n isRecovered: isRecoveredType\n signMessage: signMessageType\n signTransaction: signTransactionType\n address: string;\n evmAccount: Account | undefined;\n createWalletClient: (parameters: Omit<WalletClientConfig, 'account'>) => Omit<\n ReturnType<typeof createWalletClient>, 'sendTransaction' | 'deployContract' | 'writeContract'> &\n {\n sendTransaction: SendTransactionType,\n deployContract: DeployContractType\n writeContract: WriteContractType\n } | undefined\n // exportWallet:()=>Promise<void>\n}\n\nconst AppClientId = \"react-sdk-\" + getVersion()\n\nexport default function useWallet(): UseWalletReturnType {\n const {address, wallet: walletConfig} = useLocalStore();\n const {walletReady} = useStore()\n const modal = useModal()\n const {addTransaction} = useTransactionStore()\n\n const isRecovered: isRecoveredType = async () => {\n const res = await window.matchProvider.waitUntilWalletMessage({\n method: 'isRecovered'\n })\n return res.isRecovered\n }\n\n const signMessage: signMessageType = async ({\n message,\n chainType = ChainType.Ethereum\n }) => {\n try {\n const res = await window.matchProvider.waitUntilWalletMessage({\n method: 'signMessage',\n data: {\n message,\n chainType\n }\n })\n\n return res.message\n } catch (error: any) {\n console.error('sdk.wallet.message', error)\n throw error\n }\n\n }\n\n const signTransaction: signTransactionType = async ({\n transaction,\n chainType = ChainType.Ethereum,\n chain\n }) => {\n try {\n const res = await window.matchProvider.waitUntilWalletMessage({\n method: 'signTransaction',\n data: {\n transaction,\n chainType,\n chain\n }\n })\n return res.message\n } catch (error: any) {\n console.error('sdk.wallet.transaction', error)\n throw error\n }\n }\n\n const evmAccount = useMemo(() => {\n try{\n return address ? toAccount({\n address: address as `0x${string}`,\n async signMessage({message}) {\n return await signMessage({\n message,\n chainType: ChainType.Ethereum\n })\n },\n async signTransaction(transaction, options) {\n //@ts-ignore\n const {account, chain, ...restTransaction} = transaction;\n console.log('qwe-sign-transaction', restTransaction, options)\n return await signTransaction({\n transaction: {\n ...restTransaction as TransactionSerializable,\n },\n chainType: ChainType.Ethereum,\n chain: {\n id: chain?.id || restTransaction.chainId,\n name: chain?.name,\n nativeCurrency: {\n name: chain?.nativeCurrency?.name || 'ETH',\n symbol: chain?.nativeCurrency?.symbol || 'ETH',\n decimals: chain?.nativeCurrency?.decimals || 18,\n },\n rpcUrls: chain?.rpcUrls\n }\n })\n },\n async signTypedData(typedData) {\n return '0x'\n },\n }) : undefined\n }catch(error){\n console.error(`qwe-evm-account-error ${address}`,error)\n return undefined\n }\n\n }, [address])\n\n\n useEffect(() => {\n matchlog.log('qwe-evmAccount', evmAccount)\n }, [evmAccount]);\n\n\n // const exportWallet = async ()=>{\n // await window.matchProvider.waitUntilWalletMessage({\n // method: 'exportWallet',\n // data: {\n // address\n // }\n // })\n // }\n\n const realCreateWalletClient = (parameters: Omit<WalletClientConfig, 'account'>) => {\n if (!evmAccount) {\n return\n }\n // if ('chain' in parameters) {\n // retryMessage({\n // method: 'addChain',\n // data: {\n // chain: parameters.chain,\n // create: true\n // }\n // })\n // }\n\n const obj = createWalletClient({\n ...parameters,\n account: evmAccount as Account\n })\n const sendTransaction: SendTransactionType = async (transaction) => {\n\n\n const {chain, ...restTransaction} = transaction\n const chainId = chain ? chain.id : await obj.getChainId()\n const _chain = chain || obj.chain\n const transactionId = Date.now().toString() + Math.random().toString().slice(6)\n //prepare transaction\n window.matchProvider.transactionMessageIntervalMap[transactionId] = {\n transaction,\n func: async () => {\n try {\n const {\n chain,\n account,\n ...prepareTransactionRequest\n // @ts-ignore\n } = await obj.prepareTransactionRequest(window.matchProvider.transactionMessageIntervalMap[transactionId].transaction)\n\n window.matchProvider.sendWalletMessage({\n method: 'prepareTransactionRequest',\n data: {\n prepareTransactionRequest,\n transactionId,\n }\n })\n } catch (error) {\n console.error(error)\n }\n\n },\n interval: setInterval(() => {\n window.matchProvider.transactionMessageIntervalMap[transactionId].func()\n }, 10000)\n }\n\n try {\n\n const {\n chain,\n account,\n ...prepareTransactionRequest\n // @ts-ignore\n } = await obj.prepareTransactionRequest(transaction)\n const {serializedTransaction} = await window.matchProvider.waitUntilWalletMessage({\n method: 'sendTransaction',\n data: {\n transactionId,\n transaction: {\n ...restTransaction\n },\n chainType: ChainType.Ethereum,\n chain: {\n id: chainId,\n name: _chain?.name,\n nativeCurrency: _chain?.nativeCurrency,\n rpcUrls: _chain?.rpcUrls\n },\n prepareTransactionRequest\n }\n })\n //send transaction\n try{\n const txHash = await obj.sendRawTransaction({\n serializedTransaction\n })\n addTransaction({\n chainId:chainId,\n hash:txHash,\n info:{\n from:evmAccount.address,\n to:restTransaction.to as Address,\n value:(restTransaction.value||0).toString(),\n input:restTransaction.data as Hash,\n timestamp:Math.floor(Date.now()/1000).toString(),\n hash:txHash,\n source:'local',\n },\n address:evmAccount.address\n\n })\n\n modal.show((props)=>{\n return <HashPanel isOpen onClose={props.close} zIndex={props.zIndex} hash={txHash} chain={_chain}/>\n })\n\n return txHash\n }catch(error:any){\n modal.show((props)=>{\n return <HashPanel isOpen onClose={props.close} zIndex={props.zIndex} error={typeof error=='string'?error :(error.details||error.message)} chain={_chain}/>\n })\n throw error\n }\n\n\n } catch (error: any) {\n console.error('matchid-send-error', error)\n\n throw error\n }finally {\n clearInterval(window.matchProvider.transactionMessageIntervalMap[transactionId].interval)\n delete window.matchProvider.transactionMessageIntervalMap[transactionId]\n }\n\n }\n\n const deployContract: DeployContractType = async <const abi extends Abi | readonly unknown[]>(parameters: DeployContractParameters<abi>) => {\n const {abi, args, bytecode, ...request} =\n parameters as DeployContractParameters\n const calldata = encodeDeployData({abi, args, bytecode});\n return await sendTransaction({\n\n ...request,\n data: calldata,\n\n } as SendTransactionParametersType);\n\n };\n\n const writeContract: WriteContractType = async (parameters) => {\n const {abi, address, args, dataSuffix, functionName, ...request} =\n parameters as WriteContractParameters\n const data = encodeFunctionData({\n abi,\n args,\n functionName,\n } as EncodeFunctionDataParameters)\n return await sendTransaction({\n data: `${data}${dataSuffix ? dataSuffix.replace('0x', '') : ''}`,\n to: address,\n ...request,\n } as SendTransactionParametersType)\n }\n\n return {\n ...obj,\n sendTransaction,\n deployContract,\n writeContract,\n }\n }\n return {\n walletReady,\n evmAccount,\n address,\n signMessage,\n signTransaction,\n isRecovered,\n createWalletClient: realCreateWalletClient,\n // exportWallet\n };\n}\n","import {create} from 'zustand';\n\ninterface StoreState {\n walletReady: boolean\n setWalletReady: (inited: boolean) => void,\n tgAppAuthCode: string\n setTgAppAuthCode: (code: string) => void,\n emailLoginKey: string\n setEmailLoginKey: (key: string) => void,\n\n}\n\nconst useStore = create<StoreState>(set => ({\n walletReady: false,\n setWalletReady: (inited) => set({walletReady: inited}),\n tgAppAuthCode: '',\n setTgAppAuthCode: (code) => set({tgAppAuthCode: code}),\n emailLoginKey: '',\n setEmailLoginKey: (key) => set({emailLoginKey: key}),\n}));\n\nexport default useStore;\n","import React, {useState, useCallback, createContext, useContext, ReactNode, useEffect, useRef} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ModalDrawer } from \"ui\";\n\ninterface ModalProps {\n close: () => void;\n zIndex: number;\n}\n\ninterface ModalContextType {\n show: (content: React.FC<ModalProps>, index?: number) => void;\n open: (props: {\n title: ReactNode,\n content: React.ComponentType<{ close: () => void, zIndex: number }>,\n index?: number\n }) => void;\n}\n\ninterface ModalState {\n modals: Array<{\n visible: boolean;\n index: number;\n zIndex: number;\n content: React.FC<ModalProps>;\n close: () => void;\n }>;\n highestZIndex: number;\n}\n\nconst ModalContext = createContext<ModalContextType | null>(null);\n\nexport function ModalProvider({ children }: { children: ReactNode }) {\n const [modalState, setModalState] = useState<ModalState>({\n modals: [],\n highestZIndex: 100,\n });\n const highestIndexRef = useRef(100); // 记录当前的最高 index\n\n const getNextIndex = useCallback(() => {\n highestIndexRef.current += 1;\n return highestIndexRef.current;\n }, []);\n\n\n const closeModal = useCallback((index: number) => {\n // console.log(\"closeModal\", index);\n setModalState(prevState => ({\n modals: prevState.modals.filter(modal => modal.index !== index),\n highestZIndex: prevState.highestZIndex,\n }));\n }, []);\n\n // useEffect(() => {\n // console.log(\"modalState\", modalState);\n // }, [modalState]);\n\n const show = useCallback((content: React.FC<ModalProps>, index?: number) => {\n setModalState(prevState => {\n const modalIndex = index ?? getNextIndex();\n const newZIndex = prevState.highestZIndex + 1;\n return {\n modals: [...prevState.modals, {\n visible: true,\n index: modalIndex,\n zIndex: newZIndex,\n content: content,\n close: () => closeModal(modalIndex),\n }],\n highestZIndex: newZIndex,\n };\n });\n }, [getNextIndex, closeModal]);\n\n const open = useCallback((props: {\n title: ReactNode;\n content: React.ComponentType<{ close: () => void, zIndex: number }>;\n index?: number;\n onBack?: () => void;\n }) => {\n setModalState(prevState => {\n const modalIndex = props.index ?? getNextIndex();\n const newZIndex = prevState.highestZIndex + 1;\n return {\n modals: [...prevState.modals, {\n visible: true,\n index: modalIndex,\n zIndex: newZIndex,\n close: () => closeModal(modalIndex),\n content: ({ close, zIndex }) => <ModalDrawer showClose isOpen onClose={close} title={props.title} zIndex={zIndex} onBack={props.onBack}>\n <props.content close={close} zIndex={zIndex} />\n </ModalDrawer>,\n }],\n highestZIndex: newZIndex,\n };\n });\n }, [getNextIndex, closeModal]);\n\n const modalElements = modalState.modals.map(modal =>\n modal.visible ? (\n createPortal(\n <modal.content key={modal.index} zIndex={modal.zIndex} close={modal.close} />,\n document.body\n )\n ) : null\n )\n\n\n return (\n <ModalContext.Provider value={{ show, open }}>\n {children}\n {modalElements}\n </ModalContext.Provider>\n );\n}\n\nexport function useModal(): ModalContextType {\n const context = useContext(ModalContext);\n if (!context) {\n throw new Error(\"useModal must be used within a ModalProvider\");\n }\n return context;\n}\n","import {CSSProperties} from \"react\";\n\nexport default function BackIcon({\n color = \"#000\",\n size = 24,\n className,\n style\n }: {\n color?: string,\n size?: number,\n style?: CSSProperties\n className?: string\n}) {\n return (\n <svg className={className} style={style} width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.2917 25.2926C11.1988 25.3855 11.1251 25.4958 11.0748 25.6172C11.0245 25.7386 10.9987 25.8687 10.9987 26.0001C10.9987 26.1315 11.0245 26.2616 11.0748 26.383C11.1251 26.5044 11.1988 26.6147 11.2917 26.7076C11.3846 26.8005 11.4949 26.8742 11.6163 26.9245C11.7377 26.9747 11.8678 27.0006 11.9992 27.0006C12.1306 27.0006 12.2607 26.9747 12.3821 26.9245C12.5035 26.8742 12.6138 26.8005 12.7067 26.7076L22.7067 16.7076C22.7997 16.6147 22.8734 16.5044 22.9238 16.383C22.9741 16.2616 23 16.1315 23 16.0001C23 15.8687 22.9741 15.7385 22.9238 15.6171C22.8734 15.4957 22.7997 15.3854 22.7067 15.2926L12.7067 5.29257C12.5191 5.10493 12.2646 4.99951 11.9992 4.99951C11.7338 4.99951 11.4794 5.10493 11.2917 5.29257C11.1041 5.48021 10.9987 5.7347 10.9987 6.00007C10.9987 6.26543 11.1041 6.51993 11.2917 6.70757L20.5855 16.0001L11.2917 25.2926Z\"\n fill={color}/>\n </svg>\n )\n}","import {CSSProperties} from \"react\";\n\nexport default function CloseIcon({\n color = \"#000\",\n size = 24,\n style\n }: {\n color?: string,\n size?: number,\n style?: CSSProperties\n\n}) {\n return <svg style={style} width={size} height={size} viewBox=\"0 0 29 29\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1 1L14.5 14.5M28 28L14.5 14.5M14.5 14.5L1 28L28 1\" stroke={color} strokeWidth=\"2\"/>\n </svg>\n}","\nexport default function XIcon({size=40}:{\n size?:number\n}) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"black\"/>\n <path\n d=\"M16 10H9L17.2609 21.0145L9.44995 29.9999H12.1L18.4883 22.651L24 30H31L22.3917 18.5223L29.8001 10H27.1501L21.1643 16.8858L16 10ZM25 28L13 12H15L27 28H25Z\"\n fill=\"white\"/>\n </svg>\n\n}","\nexport default function GoogleIcon({size=40}:{\n size?:number\n}) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"#F8F8F8\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M31.52 20.2729C31.52 19.422 31.4436 18.6038 31.3018 17.8184H20V22.4602H26.4582C26.18 23.9602 25.3345 25.2311 24.0636 26.082V29.0929H27.9418C30.2109 27.0038 31.52 23.9274 31.52 20.2729Z\"\n fill=\"#4285F4\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M20 32.0003C23.24 32.0003 25.9564 30.9257 27.9418 29.093L24.0636 26.0821C22.9891 26.8021 21.6145 27.2275 20 27.2275C16.8745 27.2275 14.2291 25.1166 13.2855 22.2803H9.27637V25.3894C11.2509 29.3112 15.3091 32.0003 20 32.0003Z\"\n fill=\"#34A853\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M13.2855 22.2804C13.0455 21.5604 12.9091 20.7913 12.9091 20.0004C12.9091 19.2095 13.0455 18.4404 13.2855 17.7204V14.6113H9.27636C8.46364 16.2313 8 18.0641 8 20.0004C8 21.9368 8.46364 23.7695 9.27636 25.3895L13.2855 22.2804Z\"\n fill=\"#FBBC05\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M20 12.7727C21.7618 12.7727 23.3436 13.3782 24.5873 14.5673L28.0291 11.1255C25.9509 9.18909 23.2345 8 20 8C15.3091 8 11.2509 10.6891 9.27637 14.6109L13.2855 17.72C14.2291 14.8836 16.8745 12.7727 20 12.7727Z\"\n fill=\"#EA4335\"/>\n </svg>\n\n}","export default function WalletIcon({\n size = 40,\n }: {\n size?: number\n\n}) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"url(#paint0_linear_412_1774)\"/>\n <path\n d=\"M32.3335 19.1112V17.3333C32.3335 15.1242 30.5426 13.3333 28.3335 13.3333H25.6668M32.3335 19.1112H25.1112C23.2089 19.1112 21.6668 20.6533 21.6668 22.5556C21.6668 24.4579 23.2089 26 25.1112 26H32.3335M32.3335 19.1112C33.0699 19.1112 33.6668 19.7081 33.6668 20.4445V24.6667C33.6668 25.403 33.0699 26 32.3335 26M32.3335 26V28C32.3335 30.2091 30.5426 32 28.3335 32H11.0002C8.79102 32 7.00016 30.2091 7.00016 28V17.3333C7.00016 15.5917 8.11324 14.1101 9.66683 13.5609M25.6668 13.3333H11.0002C10.5326 13.3333 10.0839 13.4135 9.66683 13.5609M25.6668 13.3333V11.75C25.6668 9.91548 23.8575 8.62884 22.1247 9.2311L9.66683 13.5609\"\n stroke=\"white\" strokeWidth=\"1.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <circle cx=\"26.1668\" cy=\"22.8335\" r=\"2\" fill=\"white\"/>\n <defs>\n <linearGradient id=\"paint0_linear_412_1774\" x1=\"20\" y1=\"0\" x2=\"20\" y2=\"40\" gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#FFB950\"/>\n <stop offset=\"0.475\" stopColor=\"#FF7A60\"/>\n <stop offset=\"1\" stopColor=\"#FF3C4A\"/>\n </linearGradient>\n </defs>\n </svg>\n}","export default function TelegramIcon({\n size = 40,\n }: {\n size?: number\n}) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"#28A7E8\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M9.65904 18.6099C16.1373 15.7874 20.4571 13.9267 22.6186 13.0277C28.7899 10.4608 30.0723 10.0149 30.9081 10.0002C31.0919 9.99692 31.503 10.0425 31.7692 10.2585C31.994 10.4409 32.0559 10.6874 32.0855 10.8603C32.1151 11.0333 32.1519 11.4273 32.1226 11.7351C31.7882 15.249 30.3411 23.7762 29.605 27.7118C29.2935 29.3771 28.6801 29.9354 28.0863 29.9901C26.7958 30.1088 25.8159 29.1372 24.566 28.3179C22.6101 27.0358 21.5052 26.2377 19.6067 24.9867C17.4127 23.5408 18.835 22.7462 20.0853 21.4475C20.4126 21.1076 26.0985 15.9358 26.2085 15.4667C26.2223 15.408 26.2351 15.1893 26.1051 15.0738C25.9752 14.9583 25.7834 14.9978 25.645 15.0292C25.4489 15.0737 22.3244 17.1389 16.2715 21.2247C15.3847 21.8337 14.5814 22.1304 13.8616 22.1149C13.0682 22.0977 11.5419 21.6663 10.4073 21.2974C9.0156 20.8451 7.90953 20.6059 8.00585 19.8376C8.05601 19.4374 8.60708 19.0282 9.65904 18.6099Z\"\n fill=\"white\"/>\n </svg>\n\n}","export default function EmailIcon({\n size = 40,\n }: {\n size?: number\n\n}) {\n return <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"url(#paint0_linear_124_10994)\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M30.8867 12.5448C30.9585 12.4862 31 12.3997 31 12.3085C31 12.1381 30.8581 12 30.683 12H9.49205C9.2203 12 9 12.2144 9 12.4789C9 12.6212 9.06508 12.7562 9.17759 12.8472L19.5082 21.2008C19.7333 21.3828 20.06 21.3821 20.2842 21.199L30.8867 12.5448ZM9.99246 15.2938C9.59792 14.9748 9 15.2478 9 15.7471V27.9107C9 28.2362 9.27109 28.5 9.6055 28.5H30.3945C30.7289 28.5 31 28.2362 31 27.9107V15.5103C31 15.0098 30.3994 14.7372 30.0054 15.0588L20.353 22.9375C20.0642 23.1732 19.7375 23.1739 19.5124 22.9919L9.99246 15.2938Z\"\n fill=\"white\"/>\n <defs>\n <linearGradient id=\"paint0_linear_124_10994\" x1=\"20\" y1=\"0\" x2=\"20\" y2=\"40\" gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#FFB950\"/>\n <stop offset=\"0.475\" stopColor=\"#FF7A60\"/>\n <stop offset=\"1\" stopColor=\"#FF3C4A\"/>\n </linearGradient>\n </defs>\n </svg>\n}","import {IconProps} from \"types/types\";\n\nexport default function ArrowRightIcon({\n color = \"#000\",\n size = 20,\n className,\n style\n }: IconProps) {\n return <svg className={className} style={style} width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M11.4733 3.97314L10.7367 4.70971L15.3734 9.34641L3.15374 9.34641L3.15374 10.385L15.3734 10.385L10.7367 15.0217L11.4733 15.7583L17.3658 9.8657L11.4733 3.97314Z\"\n fill={color}/>\n </svg>\n\n}","import {IconProps} from \"types/types\";\n\nexport default function CloseRoundIcon({size=30,...props}:IconProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 30 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"30\" height=\"30\" rx=\"15\" fill=\"#F9F9F9\"/>\n <path d=\"M10.7574 10.7573L19.2426 19.2426\" stroke=\"#6E6E6E\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n <path d=\"M19.2426 10.7573L10.7574 19.2426\" stroke=\"#6E6E6E\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n\n}","import React from 'react';\n\ninterface LoadingIconProps {\n size?: number;\n className?: string;\n color?: string;\n rotate?: boolean;\n}\n\nconst LoadingIcon: React.FC<LoadingIconProps> = ({ size = 22, className=\"\",color=\"white\",rotate=false }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 22 22\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className+\" \"+(rotate ? 'matchid-rotate' : '')}\n >\n <path d=\"M11 1V3.5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path opacity=\"0.3\" d=\"M3.92834 3.92871L5.69977 5.70017\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path opacity=\"0.4\" d=\"M1 11H3.5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path opacity=\"0.5\" d=\"M3.92834 18.0722L5.69977 16.3008\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path opacity=\"0.6\" d=\"M11 21V18.5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path opacity=\"0.7\" d=\"M18.0715 18.0722L16.3 16.3008\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path opacity=\"0.8\" d=\"M21 11H18.5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path opacity=\"0.9\" d=\"M18.0715 3.92871L16.3 5.70017\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport default LoadingIcon;","import {IconProps} from \"../../types/types\";\n\nexport default function EmailLineIcon({\n size=24,\n color=\"black\",\n ...props\n }:IconProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M3 8.00049L10.8906 13.2609C11.5624 13.7088 12.4376 13.7088 13.1094 13.2609L21 8.00049M5 19.0005H19C20.1046 19.0005 21 18.1051 21 17.0005V7.00049C21 5.89592 20.1046 5.00049 19 5.00049H5C3.89543 5.00049 3 5.89592 3 7.00049V17.0005C3 18.1051 3.89543 19.0005 5 19.0005Z\"\n stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n\n}","import React from 'react';\nimport {IconProps} from \"../../types/types\";\n\nconst UnLoginIcon: React.FC<IconProps> = ({ size=32, color = 'white',...props }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" {...props}>\n <path\n d=\"M24 14L26 12M24 14L22 12M24 14L22 16M24 14L26 16M18 12C18 14.2091 16.2091 16 14 16C11.7909 16 10 14.2091 10 12C10 9.79086 11.7909 8 14 8C16.2091 8 18 9.79086 18 12ZM10 19H18C20.2091 19 22 20.7909 22 23C22 23.5523 21.5523 24 21 24H7C6.44772 24 6 23.5523 6 23C6 20.7909 7.79086 19 10 19Z\"\n stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nexport default UnLoginIcon;","import React from 'react';\nimport {IconProps} from \"../../types/types\";\n\nconst LoginIcon: React.FC<IconProps> = ({size = 32, color = 'white', ...props}) => (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <rect width=\"32\" height=\"32\" rx=\"16\"/>\n <path\n d=\"M22.5 14L24 15.5L27 12.5M19 11C19 13.2091 17.2091 15 15 15C12.7909 15 11 13.2091 11 11C11 8.79086 12.7909 7 15 7C17.2091 7 19 8.79086 19 11ZM11 18H19C21.2091 18 23 19.7909 23 22C23 22.5523 22.5523 23 22 23H8C7.44772 23 7 22.5523 7 22C7 19.7909 8.79086 18 11 18Z\"\n stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n\n);\n\nexport default LoginIcon;","import {IconProps} from \"../../types/types\";\n\nexport default function CheckRoundIcon({\n size,\n color=\"#2CBF68\",\n ...props\n }:Omit<IconProps, 'width'|'height'>) {\n return <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <g clipPath=\"url(#clip0_418_7699)\">\n <path\n d=\"M14.6668 8.00016C14.6668 11.6821 11.6821 14.6668 8.00016 14.6668C4.31826 14.6668 1.3335 11.6821 1.3335 8.00016C1.3335 4.31826 4.31826 1.3335 8.00016 1.3335C11.6821 1.3335 14.6668 4.31826 14.6668 8.00016Z\"\n fill={color} stroke={color} strokeLinecap=\"round\"/>\n <path\n d=\"M10.6867 5.97994C10.882 6.1752 10.882 6.49179 10.6867 6.68705L7.35339 10.0204C7.15813 10.2156 6.84155 10.2156 6.64628 10.0204L5.31295 8.68705C5.11769 8.49179 5.11769 8.1752 5.31295 7.97994C5.50821 7.78468 5.8248 7.78468 6.02006 7.97994L6.99984 8.95972L8.48973 7.46983L9.97962 5.97994C10.1749 5.78468 10.4915 5.78468 10.6867 5.97994Z\"\n fill=\"white\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_418_7699\">\n <rect width=\"16\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n\n}","export default function PasswordRoundIcon() {\n return <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"0.5\" y=\"0.5\" width=\"39\" height=\"39\" rx=\"7.5\" fill=\"white\"/>\n <rect x=\"0.5\" y=\"0.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"black\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M19.7673 16.1137C19.962 13.9479 21.7831 12.25 24 12.25C26.3472 12.25 28.25 14.1528 28.25 16.5C28.25 18.8472 26.3472 20.75 24 20.75C23.488 20.75 22.9987 20.6598 22.5461 20.495C21.9175 20.2662 21.1115 20.3279 20.5486 20.8908L19.2626 22.1768C19.2157 22.2237 19.1521 22.25 19.0858 22.25H18C17.3096 22.25 16.75 22.8096 16.75 23.5V24.25H15.5C14.8096 24.25 14.25 24.8096 14.25 25.5V26.5C14.25 26.6381 14.1381 26.75 14 26.75H12C11.8619 26.75 11.75 26.6381 11.75 26.5V23.9538C11.75 23.8817 11.7811 23.8131 11.8354 23.7656L19.1524 17.3632C19.5404 17.0238 19.7275 16.556 19.7673 16.1137ZM24 10.75C20.9997 10.75 18.5369 13.0473 18.2733 15.9794C18.2614 16.1115 18.2107 16.1941 18.1646 16.2344L10.8476 22.6368C10.4678 22.9691 10.25 23.4491 10.25 23.9538V26.5C10.25 27.4665 11.0335 28.25 12 28.25H14C14.9665 28.25 15.75 27.4665 15.75 26.5V25.75H17C17.6904 25.75 18.25 25.1904 18.25 24.5V23.75H19.0858C19.5499 23.75 19.995 23.5656 20.3232 23.2374L21.6092 21.9514C21.6738 21.8868 21.8277 21.8298 22.033 21.9045C22.6476 22.1283 23.3104 22.25 24 22.25C27.1756 22.25 29.75 19.6756 29.75 16.5C29.75 13.3244 27.1756 10.75 24 10.75ZM25 16.5C25.5523 16.5 26 16.0523 26 15.5C26 14.9477 25.5523 14.5 25 14.5C24.4477 14.5 24 14.9477 24 15.5C24 16.0523 24.4477 16.5 25 16.5Z\"\n fill=\"black\"/>\n </svg>\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function CloseEyeIcon({\n size = 20,\n color = '#6E6E6E'\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M9.15132 12.5568V11.5464C8.21031 11.4949 7.28023 11.3193 6.38524 11.024L6.04233 11.9579C6.00626 12.0669 5.94867 12.1676 5.87299 12.2539C5.79731 12.3403 5.70508 12.4106 5.60174 12.4607C5.4984 12.5108 5.38607 12.5396 5.27139 12.5455C5.15671 12.5514 5.04201 12.5342 4.93409 12.4949C4.82617 12.4557 4.72722 12.3952 4.6431 12.317C4.55898 12.2389 4.49139 12.1446 4.44435 12.0399C4.3973 11.9351 4.37175 11.822 4.36921 11.7072C4.36667 11.5924 4.38719 11.4783 4.42955 11.3715L4.80788 10.3268C4.04603 9.88461 3.32634 9.37345 2.65789 8.79975C2.54358 8.70488 2.42928 8.61687 2.32184 8.52772C2.1442 8.38554 2.03031 8.17862 2.00523 7.95247C1.98015 7.72633 2.04593 7.49948 2.18811 7.32184C2.33028 7.1442 2.5372 7.03031 2.76335 7.00523C2.98949 6.98015 3.21634 7.04593 3.39398 7.18811C3.50828 7.27955 3.62258 7.37099 3.73689 7.47043C5.46065 9.00826 7.68996 9.85815 10 9.85815C12.31 9.85815 14.5393 9.00826 16.2631 7.47043C16.3774 7.37099 16.4917 7.27955 16.606 7.18811C16.694 7.11771 16.7949 7.06533 16.9031 7.03395C17.0114 7.00257 17.1247 6.99281 17.2367 7.00523C17.3486 7.01765 17.4571 7.052 17.5558 7.10632C17.6545 7.16065 17.7415 7.23388 17.8119 7.32184C17.8823 7.4098 17.9347 7.51077 17.9661 7.61897C17.9974 7.72717 18.0072 7.8405 17.9948 7.95247C17.9824 8.06445 17.948 8.17288 17.8937 8.27158C17.8394 8.37028 17.7661 8.45732 17.6782 8.52772L17.3421 8.79975C16.6737 9.37354 15.954 9.88471 15.1921 10.3268L15.5705 11.3715C15.6128 11.4783 15.6333 11.5924 15.6308 11.7072C15.6283 11.822 15.6027 11.9351 15.5557 12.0399C15.5086 12.1446 15.441 12.2389 15.3569 12.317C15.2728 12.3952 15.1738 12.4557 15.0659 12.4949C14.958 12.5342 14.8433 12.5514 14.7286 12.5455C14.6139 12.5396 14.5016 12.5108 14.3983 12.4607C14.2949 12.4106 14.2027 12.3403 14.127 12.2539C14.0513 12.1676 13.9937 12.0669 13.9577 11.9579L13.6148 11.024C12.7198 11.3193 11.7897 11.4949 10.8487 11.5464V12.5568C10.8487 12.7842 10.7584 13.0022 10.5976 13.163C10.4368 13.3238 10.2188 13.4141 9.99143 13.4141C9.76407 13.4141 9.54602 13.3238 9.38526 13.163C9.22449 13.0022 9.13417 12.7842 9.13417 12.5568H9.15132Z\"\n fill={color}/>\n </svg>\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function OpenEyeIcon({\n size = 20,\n color = '#6E6E6E'\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10 6.4543C11.3373 6.44986 12.6486 6.82287 13.7834 7.53047C14.9181 8.23806 15.8301 9.25151 16.4145 10.4543C15.2145 12.9052 12.7564 14.4543 10 14.4543C7.24364 14.4543 4.78545 12.9052 3.58545 10.4543C4.1699 9.25151 5.08191 8.23806 6.21664 7.53047C7.35136 6.82287 8.66274 6.44986 10 6.4543ZM10 4.99976C6.36364 4.99976 3.25818 7.26157 2 10.4543C3.25818 13.647 6.36364 15.9088 10 15.9088C13.6364 15.9088 16.7418 13.647 18 10.4543C16.7418 7.26157 13.6364 4.99976 10 4.99976ZM10 8.63612C10.4822 8.63617 10.9446 8.82774 11.2855 9.16871C11.6265 9.50968 11.818 9.97212 11.818 10.4543C11.818 10.9365 11.6265 11.3989 11.2855 11.7399C10.9446 12.0809 10.4822 12.2724 10 12.2725C9.51782 12.2724 9.0554 12.0809 8.71447 11.7399C8.37353 11.3989 8.18199 10.9365 8.18199 10.4543C8.18199 9.97212 8.37353 9.50968 8.71447 9.16871C9.0554 8.82774 9.51782 8.63617 10 8.63612ZM10 7.18157C8.19636 7.18157 6.72727 8.65066 6.72727 10.4543C6.72727 12.2579 8.19636 13.727 10 13.727C11.8036 13.727 13.2727 12.2579 13.2727 10.4543C13.2727 8.65066 11.8036 7.18157 10 7.18157Z\"\n fill={color}/>\n </svg>\n\n}","import {IconProps} from \"../../types/types\";\n\nexport default function DeleteRoundIcon({height = 21,width=20, color = \"var(--matchid-error-color)\",...props}:IconProps) {\n return <svg width={width} height={height} viewBox=\"0 0 20 21\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <rect y=\"0.5\" width=\"20\" height=\"20\" rx=\"10\" fill={color}/>\n <path d=\"M7.17139 7.67188L12.8282 13.3287\" stroke=\"white\" strokeLinecap=\"round\"/>\n <path d=\"M12.8286 7.67188L7.17176 13.3287\" stroke=\"white\" strokeLinecap=\"round\"/>\n </svg>\n\n}","export default function FacebookIcon({\n size = 40\n }: {\n size?: number | string\n}) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"#1877F2\"/>\n <path\n d=\"M27.7852 28.9688L28.6719 23.1875H23.125V19.4375C23.125 17.8555 23.8984 16.3125 26.3828 16.3125H28.9062V11.3906C28.9062 11.3906 26.6172 11 24.4297 11C19.8594 11 16.875 13.7695 16.875 18.7813V23.1875H11.7969V28.9688H16.875V42.9453C17.8945 43.1055 18.9375 43.1875 20 43.1875C21.0625 43.1875 22.1055 43.1055 23.125 42.9453V28.9688H27.7852Z\"\n fill=\"white\"/>\n\n </svg>\n\n}","import {IconProps} from \"types/types\";\n\nexport default function ArrowLeftIcon({\n color = \"#000\",\n width = 24,\n height = 25,\n ...props\n }: IconProps) {\n return <svg width={width} height={height} {...props} viewBox=\"0 0 24 25\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M10.2322 5.26777L11.1161 6.15165L5.55207 11.7157H20.2157L20.2157 12.962L5.55207 12.962L11.1161 18.526L10.2322 19.4099L3.16117 12.3388L10.2322 5.26777Z\"\n fill={color}/>\n </svg>\n\n}","export default function GithubIcon({\n size = 40\n }: {\n size?: number | string\n}) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"black\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M19.6836 7C16.434 7.00169 13.2909 8.15263 10.8165 10.247C8.34197 12.3414 6.69741 15.2427 6.17684 18.4321C5.65627 21.6215 6.29363 24.8911 7.97496 27.6561C9.6563 30.4211 12.272 32.5013 15.3542 33.5248C16.0343 33.651 16.2904 33.2295 16.2904 32.8712C16.2904 32.5128 16.2768 31.4738 16.2723 30.3379C12.4642 31.1606 11.6596 28.731 11.6596 28.731C11.0385 27.1533 10.1409 26.7386 10.1409 26.7386C8.89876 25.8957 10.2338 25.9115 10.2338 25.9115C11.6097 26.0084 12.3328 27.3156 12.3328 27.3156C13.5523 29.3958 15.5356 28.7941 16.3153 28.4425C16.4377 27.5613 16.7936 26.9618 17.1857 26.6214C14.1438 26.2789 10.9478 25.1114 10.9478 19.8961C10.929 18.5436 11.4338 17.2356 12.3577 16.2428C12.2172 15.9002 11.748 14.5164 12.4914 12.6367C12.4914 12.6367 13.6407 12.2716 16.2564 14.0318C18.5 13.4217 20.8672 13.4217 23.1108 14.0318C25.7243 12.2716 26.8712 12.6367 26.8712 12.6367C27.617 14.5119 27.1478 15.8957 27.0072 16.2428C27.9341 17.2358 28.4399 18.546 28.4194 19.9007C28.4194 25.1272 25.2166 26.2789 22.1701 26.6147C22.6597 27.0384 23.0972 27.8655 23.0972 29.1367C23.0972 30.9577 23.0814 32.4227 23.0814 32.8712C23.0814 33.234 23.3284 33.6577 24.022 33.5248C27.1047 32.5012 29.7206 30.4206 31.4019 27.6551C33.0832 24.8896 33.7202 21.6196 33.1991 18.4299C32.6779 15.2402 31.0325 12.3389 28.5572 10.2449C26.0819 8.15081 22.9381 7.00062 19.6881 7H19.6836Z\"\n fill=\"white\"/>\n <path\n d=\"M11.1789 26.543C11.1495 26.6106 11.0407 26.6309 10.9523 26.5836C10.8639 26.5362 10.7982 26.4483 10.8299 26.3785C10.8616 26.3086 10.9682 26.2906 11.0566 26.3379C11.145 26.3852 11.2129 26.4754 11.1789 26.543Z\"\n fill=\"white\"/>\n <path\n d=\"M11.7339 27.1582C11.687 27.1817 11.6333 27.1883 11.582 27.1768C11.5308 27.1652 11.4851 27.1364 11.4529 27.0951C11.3645 27.0004 11.3463 26.8697 11.4143 26.8111C11.4823 26.7525 11.6048 26.7796 11.6932 26.8742C11.7816 26.9689 11.8019 27.0996 11.7339 27.1582Z\"\n fill=\"white\"/>\n <path\n d=\"M12.2738 27.9394C12.1899 27.998 12.0471 27.9394 11.9678 27.8222C11.9459 27.8012 11.9284 27.776 11.9165 27.7481C11.9046 27.7202 11.8984 27.6902 11.8984 27.6599C11.8984 27.6296 11.9046 27.5996 11.9165 27.5718C11.9284 27.5439 11.9459 27.5187 11.9678 27.4976C12.0517 27.4413 12.1945 27.4976 12.2738 27.6126C12.3531 27.7275 12.3554 27.8808 12.2738 27.9394Z\"\n fill=\"white\"/>\n <path\n d=\"M13.0055 28.6975C12.9307 28.7809 12.7789 28.7584 12.6542 28.6457C12.5295 28.533 12.5001 28.3797 12.5749 28.2986C12.6497 28.2175 12.8015 28.24 12.9307 28.3505C13.0599 28.4609 13.0849 28.6164 13.0055 28.6975Z\"\n fill=\"white\"/>\n <path\n d=\"M14.0325 29.1386C13.9985 29.2445 13.8444 29.2919 13.6902 29.2468C13.5361 29.2017 13.4341 29.0755 13.4636 28.9673C13.493 28.8591 13.6494 28.8095 13.8058 28.8591C13.9622 28.9087 14.062 29.0282 14.0325 29.1386Z\"\n fill=\"white\"/>\n <path\n d=\"M15.1525 29.216C15.1525 29.3264 15.0256 29.421 14.8624 29.4233C14.6992 29.4256 14.5654 29.3354 14.5654 29.225C14.5654 29.1145 14.6924 29.0199 14.8556 29.0176C15.0188 29.0154 15.1525 29.1033 15.1525 29.216Z\"\n fill=\"white\"/>\n <path\n d=\"M16.1947 29.0423C16.2151 29.1527 16.1018 29.2677 15.9386 29.2947C15.7754 29.3218 15.6326 29.2564 15.6122 29.1482C15.5918 29.0401 15.7096 28.9229 15.8683 28.8936C16.027 28.8643 16.1743 28.9319 16.1947 29.0423Z\"\n fill=\"white\"/>\n\n </svg>\n\n}","export default function DiscordIcon({\n size=40\n }:{\n size?: number | string\n}) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"#5865F2\"/>\n <path\n d=\"M29.7032 10.8237C27.9186 9.97958 26.0048 9.35768 24.0039 9.00149C23.9674 8.99462 23.931 9.0118 23.9123 9.04616C23.6661 9.4974 23.3935 10.0861 23.2026 10.5488C21.0505 10.2167 18.9094 10.2167 16.8014 10.5488C16.6104 10.0758 16.3279 9.4974 16.0807 9.04616C16.0619 9.01295 16.0255 8.99577 15.9891 9.00149C13.9892 9.35654 12.0755 9.97844 10.2898 10.8237C10.2743 10.8306 10.261 10.842 10.2523 10.8569C6.62229 16.4471 5.62789 21.9 6.11571 27.2852C6.11792 27.3116 6.13226 27.3368 6.15213 27.3528C8.54708 29.1658 10.867 30.2664 13.1438 30.996C13.1803 31.0075 13.2189 30.9937 13.2421 30.9628C13.7806 30.2046 14.2607 29.4052 14.6724 28.5645C14.6967 28.5153 14.6735 28.4569 14.6238 28.4374C13.8623 28.1396 13.1372 27.7765 12.4397 27.3642C12.3845 27.331 12.3801 27.2497 12.4309 27.2107C12.5776 27.0974 12.7245 26.9794 12.8646 26.8603C12.89 26.8385 12.9253 26.8339 12.9551 26.8477C17.5375 29.0043 22.4985 29.0043 27.0268 26.8477C27.0566 26.8328 27.0919 26.8374 27.1184 26.8591C27.2586 26.9783 27.4054 27.0974 27.5533 27.2107C27.604 27.2497 27.6007 27.331 27.5455 27.3642C26.848 27.7845 26.1229 28.1396 25.3603 28.4362C25.3106 28.4557 25.2885 28.5153 25.3128 28.5645C25.7333 29.404 26.2134 30.2034 26.742 30.9616C26.7641 30.9937 26.8038 31.0075 26.8403 30.996C29.1282 30.2664 31.4481 29.1658 33.843 27.3528C33.864 27.3368 33.8772 27.3127 33.8794 27.2864C34.4633 21.0604 32.9016 15.6523 29.7396 10.858C29.7319 10.842 29.7186 10.8306 29.7032 10.8237ZM15.3567 24.0062C13.9771 24.0062 12.8403 22.7005 12.8403 21.0971C12.8403 19.4937 13.955 18.188 15.3567 18.188C16.7694 18.188 17.8951 19.5051 17.873 21.0971C17.873 22.7005 16.7583 24.0062 15.3567 24.0062ZM24.6605 24.0062C23.281 24.0062 22.1442 22.7005 22.1442 21.0971C22.1442 19.4937 23.2589 18.188 24.6605 18.188C26.0732 18.188 27.199 19.5051 27.1769 21.0971C27.1769 22.7005 26.0732 24.0062 24.6605 24.0062Z\"\n fill=\"white\"/>\n </svg>\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function CheckIcon({\n size=20,\n color=\"black\",\n ...props\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path d=\"M5 9.99996L8.33333 13.3333L15 6.66663\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\"\n strokeLinejoin=\"round\"/>\n </svg>\n\n}","import React from \"react\";\nimport {IconSizeColorProps} from \"./types\";\n\nexport default function CopyIcon({size = 20, color = 'black', ...props}: IconSizeColorProps) {\n\n return (\n <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M4.16673 12.5009C3.24625 12.5009 2.50006 11.7547 2.50006 10.8342V4.16752C2.50006 3.24705 3.24625 2.50085 4.16673 2.50085H10.8334C11.7539 2.50085 12.5001 3.24705 12.5001 4.16752M9.16673 17.5009H15.8334C16.7539 17.5009 17.5001 16.7547 17.5001 15.8342V9.16752C17.5001 8.24705 16.7539 7.50086 15.8334 7.50086H9.16673C8.24625 7.50086 7.50006 8.24705 7.50006 9.16752V15.8342C7.50006 16.7547 8.24625 17.5009 9.16673 17.5009Z\"\n stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n\n </svg>\n )\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function LinkedinIcon({\n size=40,\n ...props\n }:IconSizeColorProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"#0A66C2\"/>\n <path\n d=\"M29.376 9H10.624C10.1933 9 9.78023 9.1711 9.47567 9.47567C9.1711 9.78023 9 10.1933 9 10.624V29.376C9 29.8067 9.1711 30.2198 9.47567 30.5243C9.78023 30.8289 10.1933 31 10.624 31H29.376C29.8067 31 30.2198 30.8289 30.5243 30.5243C30.8289 30.2198 31 29.8067 31 29.376V10.624C31 10.1933 30.8289 9.78023 30.5243 9.47567C30.2198 9.1711 29.8067 9 29.376 9ZM15.5572 27.7413H12.2496V17.2347H15.5572V27.7413ZM13.9011 15.7788C13.5259 15.7766 13.1598 15.6634 12.8488 15.4534C12.5379 15.2434 12.2962 14.946 12.1541 14.5987C12.0121 14.2514 11.9761 13.8699 12.0507 13.5022C12.1253 13.1345 12.3072 12.7971 12.5733 12.5326C12.8395 12.2682 13.178 12.0885 13.5462 12.0163C13.9144 11.944 14.2957 11.9825 14.642 12.1267C14.9884 12.271 15.2842 12.5147 15.4923 12.8269C15.7003 13.1392 15.8111 13.5061 15.8108 13.8813C15.8144 14.1324 15.7673 14.3818 15.6724 14.6144C15.5776 14.847 15.4368 15.0582 15.2586 15.2352C15.0804 15.4123 14.8684 15.5517 14.6351 15.6451C14.4019 15.7384 14.1523 15.7839 13.9011 15.7788ZM27.7489 27.7504H24.4428V22.0106C24.4428 20.3178 23.7232 19.7953 22.7943 19.7953C21.8135 19.7953 20.851 20.5347 20.851 22.0533V27.7504H17.5433V17.2424H20.7242V18.6983H20.7669C21.0863 18.0521 22.2046 16.9475 23.9111 16.9475C25.7567 16.9475 27.7504 18.0429 27.7504 21.2513L27.7489 27.7504Z\"\n fill=\"white\"/>\n </svg>\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function YoutubeIcon({ size=40,...props}: IconSizeColorProps) {\n return (\n <svg width={size} height={size} {...{props}} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"#FF0000\"/>\n <path\n d=\"M33.9855 13.1304C33.656 11.9065 32.691 10.9415 31.4671 10.612C29.231 10 20.287 10 20.287 10C20.287 10 11.3429 10 9.10689 10.5884C7.9065 10.9179 6.91794 11.9065 6.58843 13.1304C6 15.3664 6 20.0032 6 20.0032C6 20.0032 6 24.6636 6.58843 26.876C6.91794 28.1 7.88296 29.065 9.10689 29.3945C11.3664 30.0065 20.287 30.0065 20.287 30.0065C20.287 30.0065 29.231 30.0065 31.4671 29.418C32.691 29.0885 33.656 28.1235 33.9855 26.8996C34.5739 24.6636 34.5739 20.0268 34.5739 20.0268C34.5739 20.0268 34.5975 15.3664 33.9855 13.1304Z\"\n fill=\"white\"/>\n <path d=\"M17.439 24.2867L24.8767 20.003L17.439 15.7192V24.2867Z\" fill=\"#FF0000\"/>\n </svg>\n );\n}","import {IconSizeProps} from \"./types\";\n\nexport default function BTCDarkIcon({size = 40, ...props}: IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M28.763 17.1292C29.1611 14.4674 27.1346 13.0365 24.3634 12.082L25.2624 8.47628L23.0675 7.92936L22.1923 11.4402C21.6153 11.2962 21.0227 11.1606 20.4338 11.0262L21.3152 7.49223L19.1217 6.94531L18.2222 10.5499C17.7447 10.4411 17.2757 10.3337 16.8207 10.2205L16.8232 10.2091L13.7964 9.45329L13.2125 11.7976C13.2125 11.7976 14.841 12.1709 14.8067 12.1939C15.6955 12.4157 15.8562 13.0041 15.8295 13.4704L14.8055 17.5782C14.8667 17.5937 14.9461 17.6162 15.0337 17.6514C14.9604 17.6332 14.8825 17.6134 14.8017 17.594L13.3663 23.3484C13.2577 23.6185 12.982 24.0237 12.3606 23.8698C12.3826 23.9017 10.7653 23.4717 10.7653 23.4717L9.67554 25.9842L12.5319 26.6962C13.0632 26.8295 13.584 26.9689 14.0968 27.1L13.1885 30.7471L15.3809 31.294L16.2803 27.6857C16.8793 27.8483 17.4605 27.9982 18.0295 28.1396L17.1331 31.731L19.3281 32.2779L20.2363 28.6376C23.9791 29.346 26.7934 29.0604 27.9779 25.675C28.9324 22.9494 27.9304 21.3773 25.9613 20.3521C27.3955 20.0213 28.4758 19.0781 28.7638 17.1295L28.7631 17.129L28.763 17.1292ZM23.7481 24.1614C23.0698 26.887 18.4807 25.4136 16.9929 25.0441L18.1982 20.2124C19.6859 20.5838 24.4571 21.3188 23.7482 24.1614H23.7481ZM24.4269 17.0897C23.8082 19.569 19.9886 18.3094 18.7496 18.0006L19.8424 13.6184C21.0814 13.9273 25.0715 14.5037 24.4271 17.0897H24.4269Z\"\n fill=\"black\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function BTCLightIcon({size = 40, ...props}: IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M28.763 17.1292C29.1611 14.4674 27.1346 13.0365 24.3634 12.082L25.2624 8.47628L23.0675 7.92936L22.1923 11.4402C21.6153 11.2962 21.0227 11.1606 20.4338 11.0262L21.3152 7.49223L19.1217 6.94531L18.2222 10.5499C17.7447 10.4411 17.2757 10.3337 16.8207 10.2205L16.8232 10.2091L13.7964 9.45329L13.2125 11.7976C13.2125 11.7976 14.841 12.1709 14.8067 12.1939C15.6955 12.4157 15.8562 13.0041 15.8295 13.4704L14.8055 17.5782C14.8667 17.5937 14.9461 17.6162 15.0337 17.6514C14.9604 17.6332 14.8825 17.6134 14.8017 17.594L13.3663 23.3484C13.2577 23.6185 12.982 24.0237 12.3606 23.8698C12.3826 23.9017 10.7653 23.4717 10.7653 23.4717L9.67554 25.9842L12.5319 26.6962C13.0632 26.8295 13.584 26.9689 14.0968 27.1L13.1885 30.7471L15.3809 31.294L16.2803 27.6857C16.8793 27.8483 17.4605 27.9982 18.0295 28.1396L17.1331 31.731L19.3281 32.2779L20.2363 28.6376C23.9791 29.346 26.7934 29.0604 27.9779 25.675C28.9324 22.9494 27.9304 21.3773 25.9613 20.3521C27.3955 20.0213 28.4758 19.0781 28.7638 17.1295L28.7631 17.129L28.763 17.1292ZM23.7481 24.1614C23.0698 26.887 18.4807 25.4136 16.9929 25.0441L18.1982 20.2124C19.6859 20.5838 24.4571 21.3188 23.7482 24.1614H23.7481ZM24.4269 17.0897C23.8082 19.569 19.9886 18.3094 18.7496 18.0006L19.8424 13.6184C21.0814 13.9273 25.0715 14.5037 24.4271 17.0897H24.4269Z\"\n fill=\"white\"/>\n\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function EVMDarkIcon({ size=40,...props}: IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M20.5956 14.6424L25.0599 7.49951L29.5242 14.6424H20.5956Z\" fill=\"#6E6E6E\"/>\n <path d=\"M11.667 14.6424L16.1313 7.49951L20.5956 14.6424H11.667Z\" fill=\"#6E6E6E\"/>\n <path d=\"M25.0597 7.50021L20.5954 14.6431L16.1311 7.50021H25.0597Z\" fill=\"black\"/>\n <path d=\"M20.5956 14.6423L16.1313 21.7852L11.667 14.6423H20.5956Z\" fill=\"black\"/>\n <path d=\"M20.5952 25.3567L16.1309 32.4995L11.6666 25.3567H20.5952Z\" fill=\"#6E6E6E\"/>\n <path d=\"M29.5243 25.3567L25.06 32.4995L20.5957 25.3567H29.5243Z\" fill=\"#6E6E6E\"/>\n <path d=\"M16.1315 32.5008L20.5958 25.3579L25.06 32.5008H16.1315Z\" fill=\"black\"/>\n <path d=\"M20.5956 25.3572L25.0599 18.2144L29.5242 25.3572H20.5956Z\" fill=\"black\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function EVMLightIcon({ size=40,...props}: IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M20.5955 14.6424L25.0597 7.49951L29.524 14.6424H20.5955Z\" fill=\"#D9D9D9\"/>\n <path d=\"M11.6667 14.6424L16.131 7.49951L20.5953 14.6424H11.6667Z\" fill=\"#EFEFEF\"/>\n <path d=\"M25.0596 7.50021L20.5953 14.6431L16.131 7.50021H25.0596Z\" fill=\"white\"/>\n <path d=\"M20.5955 14.6423L16.1312 21.7852L11.6669 14.6423H20.5955Z\" fill=\"white\"/>\n <path d=\"M20.595 25.3567L16.1307 32.4995L11.6664 25.3567H20.595Z\" fill=\"#D9D9D9\"/>\n <path d=\"M29.5242 25.3567L25.0599 32.4995L20.5956 25.3567H29.5242Z\" fill=\"#EFEFEF\"/>\n <path d=\"M16.1313 32.5008L20.5956 25.3579L25.0599 32.5008H16.1313Z\" fill=\"white\"/>\n <path d=\"M20.5955 25.3572L25.0597 18.2144L29.524 25.3572H20.5955Z\" fill=\"white\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function SOLDarkIcon({ size=40,...props}: IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12.1242 24.7415C12.265 24.6007 12.4586 24.5186 12.6639 24.5186H31.2841C31.6243 24.5186 31.7945 24.9292 31.5539 25.1697L27.8757 28.848C27.7349 28.9888 27.5413 29.0709 27.3359 29.0709H8.71576C8.3755 29.0709 8.20537 28.6603 8.4459 28.4198L12.1242 24.7415Z\"\n fill=\"black\"/>\n <path\n d=\"M12.1243 11.0081C12.271 10.8673 12.4646 10.7852 12.664 10.7852H31.2842C31.6245 10.7852 31.7946 11.1958 31.5541 11.4363L27.8758 15.1146C27.735 15.2554 27.5414 15.3375 27.3361 15.3375H8.71588C8.37562 15.3375 8.20549 14.9269 8.44602 14.6864L12.1243 11.0081Z\"\n fill=\"black\"/>\n <path\n d=\"M27.8757 17.8299C27.7349 17.6891 27.5413 17.6069 27.3359 17.6069H8.71576C8.3755 17.6069 8.20537 18.0176 8.4459 18.2581L12.1242 21.9364C12.265 22.0772 12.4586 22.1593 12.6639 22.1593H31.2841C31.6243 22.1593 31.7945 21.7487 31.5539 21.5081L27.8757 17.8299Z\"\n fill=\"black\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function SOLLightIcon({size = 40, ...props}: IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12.1239 24.7415C12.2647 24.6007 12.4583 24.5186 12.6636 24.5186H31.2838C31.6241 24.5186 31.7942 24.9292 31.5537 25.1697L27.8754 28.848C27.7346 28.9888 27.541 29.0709 27.3357 29.0709H8.71551C8.37526 29.0709 8.20513 28.6603 8.44565 28.4198L12.1239 24.7415Z\"\n fill=\"white\"/>\n <path\n d=\"M12.1242 11.0081C12.2708 10.8673 12.4644 10.7852 12.6639 10.7852H31.2841C31.6243 10.7852 31.7945 11.1958 31.5539 11.4363L27.8757 15.1146C27.7349 15.2554 27.5413 15.3375 27.3359 15.3375H8.71576C8.3755 15.3375 8.20537 14.9269 8.4459 14.6864L12.1242 11.0081Z\"\n fill=\"white\"/>\n <path\n d=\"M27.8754 17.8299C27.7346 17.6891 27.541 17.6069 27.3357 17.6069H8.71551C8.37526 17.6069 8.20513 18.0176 8.44565 18.2581L12.1239 21.9364C12.2647 22.0772 12.4583 22.1593 12.6636 22.1593H31.2838C31.6241 22.1593 31.7942 21.7487 31.5537 21.5081L27.8754 17.8299Z\"\n fill=\"white\"/>\n\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function TRXDarkIcon({size=40,...props}: IconSizeProps) {\n return (\n <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\">\n <mask id=\"mask0_1215_64214\" style={{ maskType: \"alpha\" }} maskUnits=\"userSpaceOnUse\" x=\"6\" y=\"6\" width=\"28\"\n height=\"28\">\n <rect x=\"6.66663\" y=\"6.6665\" width=\"26.6667\" height=\"26.6667\" fill=\"url(#pattern0_1215_64214)\"/>\n </mask>\n <g mask=\"url(#mask0_1215_64214)\">\n <rect x=\"6.66663\" y=\"6.6665\" width=\"26.6667\" height=\"26.6667\" fill=\"black\"/>\n </g>\n <defs>\n <pattern id=\"pattern0_1215_64214\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\n <use xlinkHref=\"#image0_1215_64214\" transform=\"scale(0.01)\"/>\n </pattern>\n <image id=\"image0_1215_64214\" width=\"100\" height=\"100\"\n xlinkHref=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGk2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OTc3NywgMjAyMy8wNi8yNS0yMzo1NzoxNCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjMgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDI1LTAxLTE0VDExOjA4OjEyKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNS0wMS0xNFQxMToxMToyMSswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNS0wMS0xNFQxMToxMToyMSswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDBiNDhmNDgtN2IwNi00N2E2LWI0ZGItYzk3NTdmN2U0OWY0IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOmRjOGI3N2Y3LWRlYzYtNGJkYS04ZjExLTUwYjdkZjdjOWY4YiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmRjOGI3N2Y3LWRlYzYtNGJkYS04ZjExLTUwYjdkZjdjOWY4YiI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZGM4Yjc3ZjctZGVjNi00YmRhLThmMTEtNTBiN2RmN2M5ZjhiIiBzdEV2dDp3aGVuPSIyMDI1LTAxLTE0VDExOjA4OjEyKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMyAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NThjMzllN2EtNDZkYi00N2UzLTgyMjYtMTZkNTZkNTc1NmViIiBzdEV2dDp3aGVuPSIyMDI1LTAxLTE0VDExOjEwOjExKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MDBiNDhmNDgtN2IwNi00N2E2LWI0ZGItYzk3NTdmN2U0OWY0IiBzdEV2dDp3aGVuPSIyMDI1LTAxLTE0VDExOjExOjIxKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5guAj8AAAWbElEQVR4nO2de5xdRZHHv9VnZpJgwICILBDCAiEQXqviBgVBEBQE84EFUcBsQCJE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\"/>\n </defs>\n </svg>\n\n )\n}","import {IconSizeProps} from \"./types\";\n\nexport default function TRXLightIcon({size= 40, ...props}: IconSizeProps) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\">\n <mask id=\"mask0_1215_64378\" style={{\n maskType: \"alpha\"\n }} maskUnits=\"userSpaceOnUse\" x=\"6\" y=\"6\" width=\"28\"\n height=\"28\">\n <rect x=\"6.66675\" y=\"6.6665\" width=\"26.6667\" height=\"26.6667\" fill=\"url(#pattern0_1215_64378)\"/>\n </mask>\n <g mask=\"url(#mask0_1215_64378)\">\n <rect x=\"6.66675\" y=\"6.6665\" width=\"26.6667\" height=\"26.6667\" fill=\"white\"/>\n </g>\n <defs>\n <pattern id=\"pattern0_1215_64378\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\n <use xlinkHref=\"#image0_1215_64378\" transform=\"scale(0.01)\"/>\n </pattern>\n <image id=\"image0_1215_64378\" width=\"100\" height=\"100\"\n xlinkHref=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGk2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OTc3NywgMjAyMy8wNi8yNS0yMzo1NzoxNCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjMgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDI1LTAxLTE0VDExOjA4OjEyKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNS0wMS0xNFQxMToxMToyMSswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNS0wMS0xNFQxMToxMToyMSswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDBiNDhmNDgtN2IwNi00N2E2LWI0ZGItYzk3NTdmN2U0OWY0IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOmRjOGI3N2Y3LWRlYzYtNGJkYS04ZjExLTUwYjdkZjdjOWY4YiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmRjOGI3N2Y3LWRlYzYtNGJkYS04ZjExLTUwYjdkZjdjOWY4YiI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZGM4Yjc3ZjctZGVjNi00YmRhLThmMTEtNTBiN2RmN2M5ZjhiIiBzdEV2dDp3aGVuPSIyMDI1LTAxLTE0VDExOjA4OjEyKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMyAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NThjMzllN2EtNDZkYi00N2UzLTgyMjYtMTZkNTZkNTc1NmViIiBzdEV2dDp3aGVuPSIyMDI1LTAxLTE0VDExOjEwOjExKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MDBiNDhmNDgtN2IwNi00N2E2LWI0ZGItYzk3NTdmN2U0OWY0IiBzdEV2dDp3aGVuPSIyMDI1LTAxLTE0VDExOjExOjIxKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5guAj8AAAWbElEQVR4nO2de5xdRZHHv9VnZpJgwICILBDCAiEQXqviBgVBEBQE84EFUcBsQCJEYZWPiIqoIIov2AUVZBNAHmGJ8lwjIsQooiAfjLJRQ0iAhCTkDQkIhMfMPV37R59z7zn3dJ9778ydyUX9fT4Fk/Poru7qrqqurtNXVBUAekZ0I+ZsRM5FdSXwF4SnsboIWISYVaDrgZdBgOS9KhR3vRkIqE0el/z1QrkldaiClPy7KaT1SfjfKplqPe3UDM8ixeckfSZpt6bPpc8K9L4EQFemoPMR+TKqBngz8C+1FwF4BlgCLAUWJrQcWAasbKrt/0BDSHWGDB+5ANU9Wny/F1gBPAU8ATwGLAYexwmuL1DtP2ZIwxmiuhJkj/IOKaAH2Dmh9ybXKsCLwGpgAW4mLQbm4wT3HGBbqeTvCTWBoDNBJgCbt6HMLRMaX3dvFfAI8CSwAGQhTt2tAV4eYL1/E8jMELkH0T+BHNjiLGkF2znKqZZ1OPW2DHQBsAg3kxbj7NbfFTJGXVcBM5xAhhTbJPSvmWsbgWeBp4E/4GzTk8n/1zCII2ZTo2bUe0YCjEZ0IbBZC2X04ezCm4CozfxlEQN/xTkP84ElqC5AZBFOSC+gGr/ejXpGIG9I712ByJm5SsrRC3wVWA3yQdBxONU0qtkCBohenDv+JKrzEHkUp/JWOp6Iy1/vVIF0j0gLfC9G5rSoFJYCn0Z1FiIjQXYCHYPqHoiMB3ZC2ANl25ZK7T9exQnjaZwLvgCn8p5IKCOkThVIT1VLjUBkDsi7PKq6glNRIzydAKpXIvIf1VbV1gXDELbCsj3CW4G9gXHAHrhF6HBvee2Fxam8dThb9AdgIeijwEqQje6ZjhFIpo9FLgC50Nss1asQeSNwUqDhc4CPAU8XmLL1bZHNUd0NYXdgV2BPYCzwFpyhH0yblKIPp+KSWaSPAY+BrACeAX110whkWG6Q7gXRfcDW+ZoFVB8GewRiLgU5ze/wyDLQE0EfqnHka4sksyj3cuRUHmNAdwH2A9kNdAwwmtzaaVCxCieopcA84M/ActClIK/mnhwCgQDmNpDjinwKaHwcIneA+QHoJwINehX4JOh1jj8DUi88r0AyjFbVRzfo1sC2KGMR2TsR1m441TcywEM7YYENwFqcPboBuNOxOShGvdCmiUT2TlRM/rIAOhe1B4LpBf0sYi4JLw3028AXagKxgKmV1ZxAan9XG6MAw0G2AR3vZhH7gL4N+CdgK1xoZzDxQ+AsVF+psd42gbyhvrIejPwFdDcvK2oPBe5DBYyciHAlypZ+vvVW1HwC0fVtFkjmXqoWFWA7hN0Q2QXV8bhZtCOwPU5QbYT8BrVHAUmPDp5AQOTzGP1WYPDfjnI8qmAEhAmo3gKyY4DxBaBHg32qJpAi77UWpDeqLco821Ag7p8i2X+PAkaj7IhzHN4K7I6wKzpgIT2M6onAU4MrEHQcxswHujwqaTXKBOBp0rKtjna2hf38fMsasB8HuStfTcq0TRg1mRvVFmWe7ZdA8kU6vAHYCtUxCHuDjMNFvEfhFrc7+NvhxWJUj0Fkfr5R9FMgPb6lgALRNYgJeFNcgOpFgJslVkFkFDANOKGE+XOA/8pVk2Va6ntv0ARSe0cyD6n2IHIXcHhJG3xYCRwBzO+vQGq6Q8RDBoS7A64twAdAnSRtuuHE86AfBr5dElf6T+AKCrorhRJ2EgYLiWBVRyHcQUgYwSYBItsjcjfwzv5yUesQDZHOAh4svqoAE0COrY3ebCfqF1CdQjiWdCbwS9zaohzNx9WaR7XMXNkHIfIIyFHh97gfZF6wTNXRwCzg/f1hKzBCc6iA/tp/S0A4ErHOpa26tVVci3IC8Hyg7PcADwD7l7PQLoGUzrxjQX4O/HP4ffkpcATYY3ER5xC2RuQ24KBWOcyorBJCr8UtiOqggJyEsnsyOpyOrBYIwB3AgbitXB92RLgX+EjzHPdDQLb0tbOB2yjfdrgUmIhb8C4F3ocbTH4oI4GfUNvabgpNqCxAeQrh1/4iJILomDwztl7NPIrqwcCvAnxsATIT4YLm2NYGMkkYt741Tg4G5EqMXIYEtUUF4Uzg3Lrrq3E29Dcl5Y/CDciJpVxkUNwPCT7JAYRHxCo0Hke6OEpeQEzegxIZBlwOMjXYo8IslNNwO4YO2WyStKw04Fe9l/XEMh6YoTawJHNddTtEfgS8u6TV61A92UW/q5VTaxSgtgeR68GcWD5K9ASQW5v3shpBmQf8X+DudmCOc8Wl5B2arwGfAL0oOHKVicBsSnW5/8UWMBaR2ZQL44/AobjodRl6cZHvaaXTUWQGwvGNGGteILAR5apgnSIno4Yc2SCDF2D1JNz+ig9vBX4DHNkCf83iAyC/RmTP8CN6O8pBKI/673vbNRX4VrhIGQZyK8jpZcxlbIg2Q79EWRNg6J2I7l/1tqpeVxAzUX0fLtHOhx2Au3HucRuggCRRAt0u6Eqrfge3qPWkJaWqKqFiN5wHfM7fP0kfGjMNkVCEPCOQqClagjAzUNZIhA977xRiVVXcBxwAzA0xiFtAXhMsoWnIZSDTg+UIr4CeAXwepPlEPknVc1XAl6D6qeDzqiDmBwif9anZVlRWinsyvm09jkV0x8IskVKvaDlwBMLPg0+InIbwU1x8qVW8EZiJcHYJE+tRORKYnq8XFxJqGtXyv4/qyeScnPrn5BKQL9fz1Kzbm125zybobckYlIO96q7c6G5AdSKq3w1OBOUonF3Zp6ygOuyMcxDK1ji/Q/UA0PtrnlMLNfjg4mg3g34At24JPCcXIXIxmV3QfggEkjB7qJJTQYd7XwxOLMAZ+LNBP03Y2O8C/I5mFpHCOxEeRHMJeHXQW3ELvEW1WGVO/bSCUbgY1mTgYuA2kK9TmoakgHwK0VOrbIe3cEuxGUQLCcWhNH47LofXD4mSNmfWF/nF3lGI3ELZylm5COECb8a7MhmR74FuUdKGb4Ce79Yk5MdXNepMnXlAQEbhcg12RnQ8ylhc9sy45Hp3SZ0hzOG1jYdDLmGgJZv5MugMMF8sjiYBok+jdnLwbbVgTNlA/BluDXAjbt+8COEruBlzBi71NMUFCBeWFN4LdgoqMxpkORpc9ssOuDXRnsBewK64ZMBh7QmxCaAvVP/lyctqFuOTLEEfVqP6dlx4IcCH5Ffg9eEQd30H4GbKF3DzcEG8F4HrcSojAJ2Pyr8jmixwqzajG2EcTsC74LL2x1JNDm8ptbZ5iIDyGKqT6d04F3IC8ee+NSjxFsR8yDsalS+hcnH569lYk1cggA4DfggSygMD5zavx20OhTAd5NxkNO4N7IubfW+jpm7eyIDd62aRqMS4ciTW3kPc664WUklbKlOOR+RW7z3lflTeU/5+UwJJL1wEfLl1JgGXvnMlyNagE3GjfjA73uIGyGa4beIijIFKfB624lb3bREIdCPyK8TzCYMIWHsMLgRdjtSzKRcIwCnAVbSeehpemg4UjvUXcLkFK4GniHUWwkZEZgFFx8IYgOupVE7FJk5YIpCBZgH2Affi+8jHdcExoI0F4nFnArgedBnI7RBKOQpW0A5swCXJLQGWoSwBXYTIapT1IM8DMWg3IrfjE4YYsPogce9ZaJGtAdoQAHZCzO9wyWn16EXjfUFDm1N5RlMXFEIzJLmk+yDmJtC9+8t0CV7BOQhrER5Hk29RkCfALgV5Dhe11lpIX9I4VeIycxciRxXjZQIiK4krB2P7FucCJYUZ0p8gCoCyFHgI+LfiTekBeV9TAmlNq/wZ5xbfiduN7A/SD1PX4j7tfhyXy7s82ZBbQaMpm2aqKFRVjzGXg3qEAQh92MoU0MWhDs/YkIF4dmYCRh/En62+EOK34UZeAySqS6mbISF1JtNdBLek34RelBW4bddFqD6GyFJcys4q3CaUzX9ejUeLCoX0fRe1SP6OwUTnYKJLvREJV/5UbGUaKjUBpijMEI8+ax46D3gIkQM9I2N31ByJ28psVE5t1OVmi5e3kcDeRWEowExEHkB1KSpP4j65e57gd/P9gK3WlbBoJiLmUu/MMBHEfd+j0jetKvhA+D+jsgb06fhrqEwj9MGoyMexzQgks02b62gv8yMSN7a+jA2gnyO8zzJApN5gzra9nSi6xq+mDCh3Ye1n3MxJ95T9EyB7tMZAOX0Ap5OLxl2YAOwL8qfyIiQJQPbR2J7IZkj0Fs+N1SCD8817NXKd/C0GIhkFMgP3JVgdiwIaL8DaKSBxrU3httUsi9WB0lJUb/BWpmyJ4cTSVCMhs1CMyO/P+0jG4D3kQNeBvuI6L9ju1qDqbERxBnQh5haUPbweFbLeJWHL2mb9lX6G30Nk70R40V+VHAmVN7mcgL4Sit3Ia0yhD0hXkzoQBdXXD9gYT1pTGoe7DNXDvXW4hfEZoH9OXmiquuYS5Zol+D3WBjavdB+Qw2oZKeUFNYGiinAIJPS1goSH2LeVkYy+KDoLY87yO38GbPxV4t7bia0TqlVn3EMDLEGDZOt+EPI/wUaKmQTS3VgYTU1H/6cCyrrAppqfLU8BaAXiSs1mZN81Bkz0QUx0mXcnVATU3oTqhS0MrlrxuYLaQjoT9y14saFwlFtdl3V06u01tCOB/XVd7srwkDY6QyAGW0meq+cr7adod0x0NarFsJNz2X+Lxmf0V1VmlottMSIAFuRqf3UCYj5abhvStWUFt/sZIt3aW4Vb7DWJzAi2cWIv6q7nHx8F3Iy1Hu9OAFmO2lMYgJfX34BJA9gf4824UEA+BLpFE4ItQw9uI6keGxHzPBIRpozrqTYzKwof0Rch0Q9xSXyee/Ri49NQXVLz8FozwNB6olyTZJej9rpAA3dA5QxsXZZja7QjfqP+HKovNMdjDLavGMIICsNciphj/Ys/gbhyDtbOqc0yWrS9gyoQQJkVHunmaDdCS6h8QG0NDPMUvBphXeMBKWR6LSQAR6YLTPcUjDknGKOy8eVYe0X9aO8PMka9bJr3h8wcQonKRt+NsYcHjW/2yBE/tsG/SbUG5KWm1EOaWdIIwsEY893gzBC5F/jsAOVQhcn/2Xbyx68UwSW+9Rej8UeWn208e8V9D1meI5ZAxiNyM2qLoXC3dlhEpfdkrI2rrnV/KUF2h6T9pPENuCP7PG2VUzG6G0bxUnmi9jaB60vKXnJIhVE2pBVgS0x0A4jHvRaAl6j0TSKO19c6dEDeKTAobm+OXsZ92OmBbAFyaGmfhHkPrNJlXcOQi8b4D0VNBJR+SGOiaxH2C2w0QaVvKqpzs6vsdiBTWisuWgukehVoIL9VzkB1s3AucFAiO/nL02cbj0LfdUt1DWQi6Or5BiJhj0r1fNBARGJgGCQvK0fzUbm3WLWCyL4g+3sFKUFPy+CfIS/hzl4MQKhFbEst8FSQ84LCgOtAv9EuI16P9gYXg06NXuGtXRHETPXPrCBTW+I/W/hFSgWi1EIiIcjhIN8r2YJ9gLhvKja5b6R9lGCQVur10D8C84qbYOrcSmRsC4WlGYb1eBllg19bZT2rlIc6FSaMI+q6Dm+ytIDqcuLKFKC3XKgDQ5v3Q4L0HKozA+3YhmA+rrewt+A/YmkD6PNh25H9U2v2QrpAukciZgbY7b1sCK+i9qOgfo+xjRiEaG+A4CegRZWigJH3I7K5J5TvozfhP5hsWbiZSbwqVYU2bXpiyKOeq0He4d31EwNqT0f1tw1sT1swFEY9pUXAz71796r7oXpYYVs4Df7lyPpmB8Ba/2Awbm/DNz2dN/dN0I947xsDNv4Wfb0zqtFgaweHCgIZCqjeQPY4vDxOKH7B69VxO/tfl7V+56Bw1EcNUTQZY74Q9KhsfBtqzxuCiVHFUAvkftz3HEWIfARhn7xQBJcYk6XIs0oXwK4sxsS0tvOXZwTQQxAz3cm87r5ba8x1Rryhm9xWDJ0NSUl1up8VAeTDRXtc7y6pJ5ShFmSNx9+u9aUYiLpc9LZr+PYYcw1qe/yzUFahnITIX4dSGJCbISWR1/bSz/Du6im4j3J6an2aVV0K6Fagvu8aK2DX5uoRdYY81c+pkyAynCi6EczOXlWFKDb+OOiTDfpuUDD4oZMiPQPy/QA/OyHmJDSiRokn5GgkIr6t22dRluajIYljkHMiFITpaHyod2aIAfQz2MrdbqMpcUiaS0saGBUEMhSVVivXX4D4P31WcypWqJIqaCWlzXE/i1GPpxB5Iaca43RbNi1XwXRdgJhJfi0loPYHqL18qNVUFkPp9mbpj6C3eTkS3R+jh7hT6jLG2fXim/GvQdY7Adfbj6qaAuREkAuDHpXIbFTP3oSyAIbay8rj7sD1Hkg2r4SkM9MNr9CZwLoqkTSgbr1QNeIRdA+bQFfXVd40IOdoLKTSNxlr+4jtUA/OnBe4KYw6SY7UDOCRonoQEI5HdDRWa53mKLQxlc90z2cc7gpyE974l4DIRuLKFCq9a7B9NVU31FQUSL2/OSR0BwWFroCMATmsyBfbevV7mq2IUBWiw3BEZqC6q19VAXF8GvBgVdX5IglDiIwNMUNPVm/A/chKESKnE8mIfEyL7YsCBJDVVONUGZVjov/GmP297zgjfjGqP97UdiOLodkPCdMKVP+3yJYCsj/uo/4UPbijLjywy0hTRUWd7Yi6zgeZHFhrAGYG8CW/gDcdMh/sDMWP2figV+MNvyvAJ9H4wSTPtwdRn0CeQcyLoFTPjo+6JwFf9280GVD7MJXXplarESX5dnyTowO4kLnA7IDuPghNM0x0S/wHmK0HNrpRr4C8B2VayRbsMqydhI1fJt27T+3PJiWHmkCq4eUhp15U7wyolh2Q7uSHAOLt8P+SzhrQF9EKiNkW0zUddIRXFSkV4srpoE+0O1ukXdjUNiQZHHoX7oSEIkSPTjJCtsCXHCfyDGJehQhM148QxoaNuE5FdbbXU+sQdMowWQF6T6Cj3oX7bCz23ld93NmO6DJIjheshwgo38Qdmd7R6BSBgOqNSO0grzrsiVaVfQYCqo+g9mhEz/YLw4DqHcS9X3TbuLYm206iBNmf7y7rrqHAXBfjkkM89z6KO82tj1xWiK4HDkCi48JG3M5D448NBsODgQa/sDPUkA9holv8Bt6LivNZ6S4MKBdqWUfcdwiwILtv3ZGoFI5n6ghD90uUp2nmR14cfL+NRdKWmDiehLKgM5rWHDpNIBvAXovIhQPSoGLAVs6j77XQ+qZjsamDi0VSfoIGNq+agbMb30ftJZ0xxlpD5nimTrAhCSS6EZFJLTsabq1xL9ZOBO0lbubMlA6BdWOwc9zeHGzgm5ISOCO+ENVTQHpfN4KoQ+Zk634f8TcI0BEQ/R5kr+ZmiYDwArZyGDb9pQWl6S9sOwHJDOmkdUgWr6A6G5G9Gj4pyX/iyplU+ubmfs3gdWbQYeiy31sn7FWgf23cBAFb+QqqN7kQumf5+zrCpsjLapaeBB4u5V4ErN6CtV/rfxd0Fkz+zw4jJZB2Ck5o5mGQU16vs8GHgR6kPNh4CGQ1aN2xgQLCCuLXTkbkFZe/9fpVU1l03sIwT6tQnZHj2BnqXuLKx8Aurm3Tagdo2QFQQSC+343qCLL3JQzW/mfjz6D2F38LM6IeAz2Mf2hgzByE9yZnC1+Kjc91m1Id5aoPDH1tPUh5kGH1O0TyDtAfU/xN2r8p/D/fSXmV5PvMHAAAAABJRU5ErkJggg==\"/>\n </defs>\n</svg>\n\n}","import {IconProps} from \"./types\";\n\nexport default function ArrowDownIcon({width=20,height=21,color=\"black\",...props}:IconProps) {\n return <svg width={width} height={height} viewBox=\"0 0 20 21\" fill=\"none\" {...props} xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5 7.5L9.29289 11.7929C9.68342 12.1834 10.3166 12.1834 10.7071 11.7929L15 7.5\" stroke={color}\n strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function LeatherIcon({\n size=128,\n ...props\n }:IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"128\" height=\"128\" rx=\"26.8387\" fill=\"#12100F\"/>\n <path\n d=\"M74.9171 52.7114C82.4766 51.5408 93.4087 43.5804 93.4087 37.3761C93.4087 35.5031 91.8968 34.2154 89.6871 34.2154C85.5004 34.2154 78.4061 40.5368 74.9171 52.7114ZM39.911 83.4991C30.0256 83.4991 29.2115 93.3324 39.0969 93.3324C43.5163 93.3324 48.8661 91.5764 51.6573 88.4157C47.5868 84.9038 44.2141 83.4991 39.911 83.4991ZM102.829 79.2848C103.41 95.7907 95.0369 105.039 80.8484 105.039C72.4748 105.039 68.2881 101.878 59.333 96.0249C54.681 101.176 45.8423 105.039 38.5154 105.039C13.2785 105.039 14.3252 72.8463 40.0273 72.8463C45.3771 72.8463 49.9128 74.2511 55.7277 77.88L59.5656 64.4177C43.7489 60.0864 35.8405 47.9118 43.6326 30.4693H56.1929C49.215 42.0586 53.9832 51.6578 62.822 52.7114C67.5903 35.7372 77.8246 22.509 91.4316 22.509C99.1074 22.509 105.155 27.5428 105.155 36.6737C105.155 51.3066 86.0819 63.2471 71.6607 64.4177L65.7295 85.3721C72.4748 93.2153 91.199 100.824 91.199 79.2848H102.829Z\"\n fill=\"#F5F1ED\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function UnisatIcon({\n size=64,\n ...props\n }:IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 51 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n preserveAspectRatio=\"xMidYMid meet\">\n <g clipPath=\"url(#clip0_13_4)\">\n <path\n d=\"M35.9736 5.75869L49.326 18.7667C50.4626 19.8716 51.022 20.9896 51.0044 22.1162C50.9868 23.2428 50.4978 24.2697 49.5419 25.2013C48.5419 26.1763 47.4626 26.6703 46.3084 26.6919C45.1542 26.7093 44.0088 26.1633 42.8722 25.0584L29.2159 11.7557C27.6652 10.2435 26.1674 9.17318 24.7269 8.54488C23.2863 7.91658 21.7709 7.81692 20.185 8.25023C18.5947 8.67921 16.8899 9.78415 15.0617 11.5607C12.5419 14.0176 11.3392 16.3228 11.4626 18.4764C11.5859 20.6299 12.837 22.8658 15.2115 25.1754L28.978 38.5907C30.1278 39.7086 30.6916 40.8265 30.674 41.9358C30.6564 43.0494 30.163 44.0764 29.1894 45.0253C28.2203 45.9699 27.1498 46.4639 25.9868 46.5029C24.8238 46.5419 23.6652 46.0003 22.5198 44.8823L9.1674 31.8743C6.9956 29.7598 5.42731 27.7579 4.46256 25.8686C3.4978 23.9794 3.13657 21.8432 3.38767 19.46C3.61234 17.4191 4.27753 15.4432 5.38767 13.528C6.49339 11.6127 8.0793 9.65416 10.1366 7.64793C12.5859 5.26039 14.9251 3.43182 17.1542 2.15788C19.3789 0.883949 21.533 0.177652 23.6123 0.0303266C25.696 -0.116999 27.7489 0.290313 29.7797 1.25226C31.8106 2.21421 33.8723 3.71347 35.9692 5.75869H35.9736Z\"\n fill=\"url(#paint0_linear_13_4)\"/>\n <path\n d=\"M15.0264 58.2456L1.67842 45.2376C0.541857 44.1283 -0.0176143 43.0147 6.80917e-06 41.8881C0.017628 40.7615 0.506615 39.7346 1.46256 38.8029C2.46256 37.828 3.54186 37.334 4.69604 37.3123C5.85023 37.295 6.9956 37.8366 8.13217 38.9459L21.7841 52.2486C23.3392 53.7608 24.8326 54.8311 26.2731 55.4594C27.7137 56.0877 29.2291 56.183 30.8194 55.754C32.4097 55.3251 34.1145 54.2201 35.9427 52.4392C38.4626 49.9823 39.6652 47.6771 39.5419 45.5236C39.4185 43.37 38.1674 41.1341 35.793 38.8203L28.4582 31.7356C27.3084 30.6177 26.7445 29.4997 26.7621 28.3905C26.7797 27.2769 27.2731 26.2499 28.2467 25.301C29.2159 24.3563 30.2864 23.8624 31.4493 23.8234C32.6123 23.7844 33.7709 24.326 34.9163 25.444L41.8326 32.1213C44.0044 34.2358 45.5727 36.2377 46.5375 38.127C47.5022 40.0162 47.8634 42.1524 47.6123 44.5356C47.3877 46.5765 46.7225 48.5524 45.6123 50.4677C44.5066 52.3829 42.9207 54.3415 40.8634 56.3477C38.4141 58.7352 36.0749 60.5638 33.8458 61.8377C31.6167 63.1117 29.4626 63.8223 27.3789 63.9696C25.2952 64.117 23.2423 63.7096 21.2115 62.7477C19.1806 61.7857 17.1189 60.2865 15.022 58.2413L15.0264 58.2456Z\"\n fill=\"url(#paint1_linear_13_4)\"/>\n <path\n d=\"M23.3524 24.6814C26.0603 24.6814 28.2555 22.5222 28.2555 19.8586C28.2555 17.1951 26.0603 15.0359 23.3524 15.0359C20.6445 15.0359 18.4493 17.1951 18.4493 19.8586C18.4493 22.5222 20.6445 24.6814 23.3524 24.6814Z\"\n fill=\"url(#paint2_radial_13_4)\"/>\n </g>\n <defs>\n <linearGradient id=\"paint0_linear_13_4\" x1=\"47.1299\" y1=\"13.3372\" x2=\"5.9782\" y2=\"31.9299\"\n gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#201C1B\"/>\n <stop offset=\"0.36\" stopColor=\"#77390D\"/>\n <stop offset=\"0.67\" stopColor=\"#EA8101\"/>\n <stop offset=\"1\" stopColor=\"#F4B852\"/>\n </linearGradient>\n <linearGradient id=\"paint1_linear_13_4\" x1=\"5.01376\" y1=\"51.203\" x2=\"52.8347\" y2=\"36.7334\"\n gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#1F1D1C\"/>\n <stop offset=\"0.37\" stopColor=\"#77390D\"/>\n <stop offset=\"0.67\" stopColor=\"#EA8101\"/>\n <stop offset=\"1\" stopColor=\"#F4FB52\"/>\n </linearGradient>\n <radialGradient id=\"paint2_radial_13_4\" cx=\"0\" cy=\"0\" r=\"1\" gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"translate(23.3524 19.863) scale(4.90308 4.82275)\">\n <stop stopColor=\"#F4B852\"/>\n <stop offset=\"0.33\" stopColor=\"#EA8101\"/>\n <stop offset=\"0.64\" stopColor=\"#77390D\"/>\n <stop offset=\"1\" stopColor=\"#211C1D\"/>\n </radialGradient>\n <clipPath id=\"clip0_13_4\">\n <rect width=\"51\" height=\"64\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function XverseIcon({\n size=57,\n ...props\n}:IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <clipPath id=\"clip0_10280_371492\">\n <rect id=\"svg_1\" fill=\"white\" height=\"57\" width=\"57\"/>\n </clipPath>\n </defs>\n <g>\n <title>background</title>\n <rect fill=\"none\" id=\"canvas_background\" height=\"66\" width=\"66\" y=\"-1\" x=\"-1\"/>\n </g>\n <g>\n <title>Layer 1</title>\n <rect id=\"svg_5\" height=\"64\" width=\"64\" rx=\"8\" strokeWidth=\"0\" stroke=\"#000\" fill=\"#000000\"/>\n <g stroke=\"null\" id=\"svg_2\" clipPath=\"url(#clip0_10280_371492)\">\n <path stroke=\"null\" id=\"svg_3\" fill=\"white\"\n d=\"m55.71197,55.048143l0,-8.673641c0,-0.343903 -0.136738,-0.671922 -0.380462,-0.915647l-36.905562,-36.905697c-0.243724,-0.243716 -0.571743,-0.380378 -0.915647,-0.380378l-8.673498,0c-0.428207,0 -0.776699,0.348492 -0.776699,0.776699l0,8.058523c0,0.343987 0.136662,0.671922 0.380378,0.915647l13.247168,13.247168c0.30289,0.302974 0.30289,0.794877 0,1.097852l-13.399773,13.39979c-0.145772,0.14573 -0.227773,0.343903 -0.227773,0.548884l0,8.830801c0,0.427946 0.348492,0.776724 0.776699,0.776724l14.493044,0c0.428198,0 0.776724,-0.348778 0.776724,-0.776724l0,-5.20242c0,-0.20498 0.081942,-0.403153 0.227756,-0.548884l7.188436,-7.18852c0.302974,-0.30289 0.794961,-0.30289 1.097852,0l13.33827,13.338438c0.243724,0.243724 0.571743,0.380462 0.915647,0.380462l8.058447,0c0.428282,0 0.77664,-0.348862 0.77664,-0.776724l0.002353,-0.002353z\"/>\n <path stroke=\"null\" id=\"svg_4\" fill=\"#EE7A30\"\n d=\"m36.37884,19.659638l7.259032,0c0.430467,0 0.781262,0.350795 0.781262,0.781262l0,7.259032c0,0.697051 0.842782,1.045493 1.334768,0.551237l9.958152,-9.974036c0.145562,-0.145814 0.22784,-0.343987 0.22784,-0.551237l0,-8.735034c0,-0.430484 -0.348778,-0.781245 -0.781346,-0.781245l-8.864838,-0.011388c-0.20725,0 -0.405423,0.081992 -0.553506,0.227764l-9.914869,9.89896c-0.491987,0.491903 -0.143461,1.334684 0.551237,1.334684l0.002269,0z\"/>\n </g>\n </g>\n </svg>\n}","import {IconSizeProps} from \"./types\";\n\nexport default function TronLinkIcon({\n size = 64,\n ...props\n }: IconSizeProps) {\n return <img width={size} height={size} {...props}\n src={\"data:image/png;base64,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\"}/>\n}","import {IconSizeProps} from \"./types\";\n\nexport default function OKXIcon({\n size,\n ...props\n }:IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"32\" height=\"32\" rx=\"8\" fill=\"black\"/>\n 、\n <path\n d=\"M19.2942 22.407C19.2942 23.2925 19.2911 24.1781 19.2955 25.0636C19.2976 25.4945 19.4269 25.6328 19.8455 25.6339C21.5935 25.6383 23.3416 25.6384 25.0896 25.6339C25.5146 25.6328 25.6832 25.4672 25.6842 25.0515C25.6885 23.315 25.6886 21.5785 25.6843 19.842C25.6833 19.3997 25.5196 19.2446 25.0741 19.2441C23.3376 19.242 21.601 19.242 19.8645 19.244C19.4101 19.2445 19.2976 19.3566 19.2952 19.8194C19.2905 20.6819 19.2938 21.5445 19.2942 22.407ZM12.6556 22.424C12.6556 21.5501 12.6583 20.6762 12.6546 19.8024C12.6525 19.3268 12.5669 19.2443 12.0829 19.2438C10.3697 19.2421 8.65638 19.2421 6.94314 19.2439C6.42514 19.2445 6.31525 19.3521 6.3145 19.8724C6.31179 21.5857 6.31204 23.299 6.31462 25.0122C6.31538 25.5045 6.43653 25.6328 6.92244 25.6341C8.6472 25.6385 10.372 25.6383 12.0967 25.6339C12.5353 25.6328 12.6526 25.5118 12.6545 25.08C12.6585 24.1948 12.6557 23.3094 12.6556 22.424ZM15.9764 19.0941C16.8734 19.0941 17.7704 19.0978 18.6673 19.0924C19.0566 19.0901 19.1441 19.0064 19.1449 18.6285C19.1486 16.8346 19.1488 15.0406 19.1441 13.2466C19.1432 12.8835 19.0237 12.7611 18.6696 12.7602C16.8872 12.7558 15.1047 12.7556 13.3222 12.7604C12.926 12.7614 12.8077 12.8857 12.8071 13.2813C12.8041 15.0523 12.8044 16.8232 12.807 18.5942C12.8076 19.0143 12.8873 19.0914 13.32 19.0933C14.2054 19.0973 15.0909 19.0945 15.9764 19.0941ZM22.4747 12.6043C23.3598 12.6043 24.2449 12.6072 25.1299 12.603C25.5607 12.601 25.6838 12.4801 25.6847 12.0453C25.6885 10.3212 25.6883 8.59705 25.6849 6.87292C25.684 6.43534 25.5643 6.31476 25.1319 6.31394C23.3503 6.31073 21.5687 6.31073 19.7871 6.31419C19.3808 6.31501 19.2959 6.39972 19.2952 6.79884C19.2922 8.55746 19.2921 10.3161 19.2952 12.0747C19.2961 12.5188 19.3803 12.6017 19.8197 12.6035C20.7046 12.6072 21.5897 12.6046 22.4747 12.6043ZM9.50353 12.6045C10.3886 12.6045 11.2738 12.6076 12.1589 12.6032C12.5708 12.6011 12.6533 12.5235 12.6541 12.1217C12.6578 10.3514 12.6576 8.58119 12.6544 6.81093C12.6536 6.3916 12.5726 6.31438 12.1395 6.31369C10.3808 6.31092 8.62202 6.3106 6.86322 6.31394C6.42621 6.31476 6.31519 6.42923 6.3145 6.87254C6.31173 8.60831 6.31198 10.3441 6.31437 12.0799C6.31494 12.5096 6.40588 12.6004 6.84811 12.603C7.73327 12.6081 8.61844 12.6045 9.50353 12.6045Z\"\n fill=\"white\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function BitgetIcon({\n size=40,\n ...props\n }:IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"#00F0FF\"/>\n <rect x=\"4\" y=\"4\" width=\"32\" height=\"32\" fill=\"url(#pattern0_401_564)\"/>\n <defs>\n <pattern id=\"pattern0_401_564\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\n <use xlinkHref=\"#image0_401_564\" transform=\"scale(0.0005)\"/>\n </pattern>\n <image id=\"image0_401_564\" width=\"2000\" height=\"2000\"\n xlinkHref=\"data:image/png;base64,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\"/>\n </defs>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function TonLightIcon({size = 40, ...props}: IconSizeProps) {\n return (\n <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\">\n <path stroke=\"null\" id=\"svg_2\" fill=\"black\"\n d=\"m28.551235,7.336842l-17.103441,0c-3.144714,0 -5.137911,3.392209 -3.555804,6.134509l10.555606,18.295835c0.688817,1.19463 2.41502,1.19463 3.103838,0l10.557753,-18.295835c1.57996,-2.737917 -0.413237,-6.134509 -3.555804,-6.134509l-0.002147,0zm-10.112226,18.943687l-2.298831,-4.449093l-5.546854,-9.920635c-0.36592,-0.634971 0.086046,-1.448654 0.852323,-1.448654l6.991215,0l0,15.820529l0.002147,-0.002147zm10.962403,-14.371875l-5.544707,9.924928l-2.298831,4.446947l0,-15.820529l6.991215,0c0.766277,0 1.218244,0.813683 0.852323,1.448654z\"/>\n </svg>\n\n )\n}","import {IconSizeProps} from \"./types\";\n\nexport default function TonLightIcon({size = 40, ...props}: IconSizeProps) {\n return (\n <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\">\n <path stroke=\"null\" id=\"svg_2\" fill=\"white\"\n d=\"m28.551235,7.336842l-17.103441,0c-3.144714,0 -5.137911,3.392209 -3.555804,6.134509l10.555606,18.295835c0.688817,1.19463 2.41502,1.19463 3.103838,0l10.557753,-18.295835c1.57996,-2.737917 -0.413237,-6.134509 -3.555804,-6.134509l-0.002147,0zm-10.112226,18.943687l-2.298831,-4.449093l-5.546854,-9.920635c-0.36592,-0.634971 0.086046,-1.448654 0.852323,-1.448654l6.991215,0l0,15.820529l0.002147,-0.002147zm10.962403,-14.371875l-5.544707,9.924928l-2.298831,4.446947l0,-15.820529l6.991215,0c0.766277,0 1.218244,0.813683 0.852323,1.448654z\"/>\n </svg>\n\n )\n}","import {IconProps} from \"../../types\";\nimport {IconSizeColorProps} from \"./types\";\n\nexport default function ErrorRoundIcon({\n size,\n color=\"#F14141\",\n ...props\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12Z\"\n fill={color}/>\n <path\n d=\"M8.96967 8.96967C9.26256 8.67678 9.73744 8.67678 10.0303 8.96967L12 10.9394L13.9697 8.96969C14.2626 8.6768 14.7374 8.6768 15.0303 8.96969C15.3232 9.26258 15.3232 9.73746 15.0303 10.0304L13.0607 12L15.0303 13.9696C15.3232 14.2625 15.3232 14.7374 15.0303 15.0303C14.7374 15.3232 14.2625 15.3232 13.9696 15.0303L12 13.0607L10.0304 15.0303C9.73746 15.3232 9.26258 15.3232 8.96969 15.0303C8.6768 14.7374 8.6768 14.2626 8.96969 13.9697L10.9394 12L8.96967 10.0303C8.67678 9.73744 8.67678 9.26256 8.96967 8.96967Z\"\n fill=\"white\"/>\n </svg>\n\n}","import {IconProps} from \"../../types/types\";\n\nexport default function InfoLineIcon({\n size,\n color='#6E6E6E',\n ...props\n }:Omit<IconProps, 'width'|'height'>) {\n return <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <g clipPath=\"url(#clip0_418_7746)\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M7.99984 0.666504C3.94975 0.666504 0.666504 3.94975 0.666504 7.99984C0.666504 12.0499 3.94975 15.3332 7.99984 15.3332C12.0499 15.3332 15.3332 12.0499 15.3332 7.99984C15.3332 3.94975 12.0499 0.666504 7.99984 0.666504ZM1.99984 7.99984C1.99984 4.68613 4.68613 1.99984 7.99984 1.99984C11.3135 1.99984 13.9998 4.68613 13.9998 7.99984C13.9998 11.3135 11.3135 13.9998 7.99984 13.9998C4.68613 13.9998 1.99984 11.3135 1.99984 7.99984ZM8.6665 7.33317C8.6665 6.96498 8.36803 6.6665 7.99984 6.6665C7.63165 6.6665 7.33317 6.96498 7.33317 7.33317V11.3332C7.33317 11.7014 7.63165 11.9998 7.99984 11.9998C8.36803 11.9998 8.6665 11.7014 8.6665 11.3332V7.33317ZM7.99984 5.33317C8.36803 5.33317 8.6665 5.03469 8.6665 4.6665C8.6665 4.29831 8.36803 3.99984 7.99984 3.99984C7.63165 3.99984 7.33317 4.29831 7.33317 4.6665C7.33317 5.03469 7.63165 5.33317 7.99984 5.33317Z\"\n fill={color}/>\n </g>\n <defs>\n <clipPath id=\"clip0_418_7746\">\n <rect width=\"16\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function InfoRoundIcon({\n size = 16,\n color = '#F14141',\n ...props\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"8\" fill={color}/>\n <path d=\"M8 4V8.8\" stroke=\"white\" strokeWidth=\"1.2\" strokeLinecap=\"round\"/>\n <circle cx=\"8.0002\" cy=\"11.2004\" r=\"0.8\" fill=\"white\"/>\n </svg>\n\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function TransferIcon({size=40,...props}:IconSizeProps) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" {...props} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"2\" width=\"36\" height=\"36\" rx=\"18\" fill=\"white\"/>\n <rect x=\"2\" y=\"2\" width=\"36\" height=\"36\" rx=\"18\" stroke=\"#F8F8F8\" strokeWidth=\"4\"/>\n <path d=\"M18.666 12.8913L18.666 26.2246L14.666 21.6413\" stroke=\"black\" strokeWidth=\"1.4\" strokeLinecap=\"round\"\n strokeLinejoin=\"round\"/>\n <path d=\"M22.2217 12.8913L22.2217 26.2246L26.2217 21.6413\" stroke=\"black\" strokeWidth=\"1.4\"\n strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function ArrowSendIcon({\n size=34,\n color=\"#6E6E6E\",\n ...props\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 34 34\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path d=\"M22.6567 11.313L11.343 22.6267M22.6567 11.313L22.6567 19.7982M22.6567 11.313L14.1714 11.313\"\n stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function PhantomIcon({\n size=128,\n ...props\n }:IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#ab9ff2\"\n d=\"m53.520552,86.603299c-5.9423,9.106 -15.8999,20.63 -29.1497,20.63c-6.2636,0 -12.2864,-2.578 -12.2866,-13.779c-0.0005,-28.5271 38.946,-72.687 75.0825,-72.6876c20.557,-0.0004 28.749,14.2625 28.749,30.4597c0,20.7903 -13.491,44.5629 -26.901,44.5629c-4.256,0 -6.344,-2.337 -6.344,-6.043c0,-0.967 0.16,-2.015 0.482,-3.143c-4.578,7.816 -13.411,15.07 -21.6822,15.07c-6.0227,0 -9.074,-3.788 -9.0741,-9.107c0,-1.934 0.4015,-3.948 1.1241,-5.963zm26.8222,-43.9027c-3.271,0.0058 -5.501,2.7849 -5.494,6.7495c0.007,3.9646 2.247,6.8152 5.518,6.8095c3.192,-0.0057 5.421,-2.8641 5.414,-6.8288c-0.007,-3.9646 -2.246,-6.7358 -5.438,-6.7302zm17.351,-0.0189c-3.271,0.0058 -5.501,2.7849 -5.494,6.7495c0.007,3.9646 2.246,6.8152 5.518,6.8095c3.192,-0.0056 5.421,-2.8641 5.414,-6.8288c-0.007,-3.9646 -2.246,-6.7358 -5.438,-6.7302z\"\n clipRule=\"evenodd\" fillRule=\"evenodd\"/>\n\n </svg>\n}","import {IconHWColorProps} from \"./types\";\n\nexport default function MoreIcon({\n width=\"11\",\n height=\"3\",\n color=\"black\",\n ...props\n }:IconHWColorProps) {\n return <svg xmlns=\"http://www.w3.org/2000/svg\" width={width} height={height} viewBox=\"0 0 11 3\" fill=\"none\" {...props}>\n <path\n d=\"M2.3335 1.33325C2.3335 1.88554 1.88578 2.33325 1.3335 2.33325C0.781211 2.33325 0.333496 1.88554 0.333496 1.33325C0.333496 0.780967 0.781211 0.333252 1.3335 0.333252C1.88578 0.333252 2.3335 0.780967 2.3335 1.33325Z\"\n fill={color}/>\n <path\n d=\"M6.3335 1.33325C6.3335 1.88554 5.88578 2.33325 5.3335 2.33325C4.78121 2.33325 4.3335 1.88554 4.3335 1.33325C4.3335 0.780967 4.78121 0.333252 5.3335 0.333252C5.88578 0.333252 6.3335 0.780967 6.3335 1.33325Z\"\n fill={color}/>\n <path\n d=\"M10.3335 1.33325C10.3335 1.88554 9.88578 2.33325 9.3335 2.33325C8.78121 2.33325 8.3335 1.88554 8.3335 1.33325C8.3335 0.780967 8.78121 0.333252 9.3335 0.333252C9.88578 0.333252 10.3335 0.780967 10.3335 1.33325Z\"\n fill={color}/>\n </svg>\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function CheckboxIcon({\n size=16,\n color=\"#E3E3E3\",\n ...props\n}:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 16 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <rect x=\"2.08203\" y=\"2.58325\" width=\"11.8333\" height=\"11.8333\" rx=\"3.25\" stroke={color} strokeWidth=\"1.5\"/>\n </svg>\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function CheckboxCheckedIcon({\n size=16,\n color=\"#FC802D\",\n ...props\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 16 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <rect x=\"1.33203\" y=\"1.83325\" width=\"13.3333\" height=\"13.3333\" rx=\"4\" fill={color}/>\n <path\n d=\"M5.96094 7.63565L7.23226 8.90697L9.87499 6.26424C10.113 6.02621 10.4989 6.02621 10.737 6.26424C10.975 6.50227 10.975 6.8882 10.737 7.12623L7.80211 10.0611C7.48739 10.3758 6.97714 10.3758 6.66242 10.0611L5.09896 8.49764C4.86093 8.25961 4.86093 7.87368 5.09896 7.63565C5.33699 7.39762 5.72291 7.39762 5.96094 7.63565Z\"\n fill=\"white\"/>\n </svg>\n\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function InputLengthIcon({\n size=12,\n color=\"#B6B6B6\",\n ...props\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M1.10097 12L12 1.10097L10.899 0L0 10.899L1.10097 12ZM7.19277 11.4594L11.6684 6.98378L10.5675 5.88281L6.0918 10.3585L7.19277 11.4594Z\"\n fill={color}/>\n </svg>\n\n}","import {LoadingIcon} from \"assets/icon\";\nimport {ButtonProps} from \"../../types/types\";\n\nexport default function Button({\n size = \"df\",\n disabled = false,\n loading = false,\n children,\n onClick,\n highlight = false,\n block = false,\n type = \"button\",\n rounded = true,\n className = '',\n style = {},\n dataset = {}\n }: ButtonProps & { dataset?: { [key: string]: string } }) {\n\n const onAction = () => {\n if (!disabled && !loading) {\n onClick && onClick()\n }\n }\n return <button\n type={type}\n className={`${className} matchid-btn ${'matchid-btn-' + size} ${highlight ? \"matchid-btn-highlight\" : ''} ${loading ? \"matchid-btn-loading\" : ''} ${block ? \"matchid-btn-block\" : ''} ${rounded ? \"matchid-btn-rounded\" : ''}`}\n disabled={disabled || loading}\n style={{\n ...style\n }}\n onClick={onAction}\n {...dataset}\n >\n {\n loading ?\n <LoadingIcon className=\"matchid-btn-loading-icon\" color=\"var(--matchid-btn-loading-color)\"/> :\n children\n }\n </button>\n}","import React, {PropsWithChildren, useEffect} from \"react\";\n\nexport default function Overlay({\n isOpen = false,\n children,\n zIndex = 100,\n }: {\n isOpen?: boolean\n zIndex?: number\n} & PropsWithChildren) {\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"\";\n }\n\n return () => {\n document.body.style.overflow = \"\";\n };\n }, [isOpen]);\n return isOpen ? <div\n className=\"matchid-overlay\"\n style={{\n zIndex\n }}\n >\n {children}\n </div> : <></>\n}","import React, {PropsWithChildren} from \"react\";\nimport Overlay from \"../Overlay\";\nimport {CloseRoundIcon} from \"assets/icon\";\nimport {DrawerProps} from \"../../types\";\nimport ArrowLeftIcon from \"../../assets/icon/ArrowLeftIcon\";\n\nexport default function Drawer({\n children,\n showClose = true,\n onClose,\n isOpen = false,\n title,\n zIndex = 100,\n onBack\n }: DrawerProps) {\n\n if (!isOpen) {\n return <></>\n }\n\n\n return <Overlay isOpen={isOpen} zIndex={zIndex}>\n <div className={\"matchid-drawer\"}>\n <div className={`matchid-drawer-header matchid-flex`}>\n <div className={`matchid-drawer-header-content matchid-flex`}>\n {onBack && <ArrowLeftIcon height={25} width={24} className=\"matchid-drawer-header-back\" onClick={onBack}/>}\n {title}\n </div>\n {\n showClose && <CloseRoundIcon className={\"matchid-drawer-header-close\"} onClick={onClose}/>\n }\n </div>\n\n {children}\n </div>\n </Overlay>\n}","import {PropsWithChildren, ReactNode} from \"react\";\n\nexport default function Field({\n label,\n children,\n error,\n required,\n className=''\n }:{\n label: ReactNode,\n error?: ReactNode,\n required?: boolean\n className?: string\n\n}&PropsWithChildren){\n return <div className={`matchid-field-box ${className}`}>\n <div className=\"matchid-field-label\">{required&&<span className={\"matchid-field-required\"}>*</span>}{label}</div>\n {children}\n {error && <div className=\"matchid-field-error\">{error}</div>}\n </div>\n\n}","import {\n Hash,\n Chain,\n} from \"viem\";\nimport {useEffect, useState} from \"react\";\nimport ModalDrawer from \"../ModalDrawer\";\nimport Button from \"../Button\";\nimport {Lottie} from \"../../ui\";\nimport {successImg, failImg, confirmImg,pendingImg} from \"assets/lottie\";\nimport useHash from \"../../hooks/useHash\";\n\ntype statusType = 'pending' | 'success' | 'fail' | 'confirm'\ntype HashPanelProps = {\n hash?: Hash | null,\n chain?: Chain | null,\n isOpen: boolean,\n onClose: () => void\n zIndex?: number,\n error?: string\n}\n\nfunction HashPanel({\n hash,\n chain,\n isOpen,\n onClose,\n zIndex,\n error\n }: HashPanelProps) {\n const [status, setStatus] = useState<statusType>('confirm')\n\n const statusMaps: Record<statusType, {\n text: string;\n color: string\n lottie?: any\n }> = {\n 'confirm': {\n text: 'Confirming...',\n color: '#FC802D',\n lottie: confirmImg\n },\n 'pending': {\n lottie: pendingImg,\n text: 'Pending...',\n color: '#FC802D'\n },\n 'success': {\n text: 'Successful!',\n color: '#2CBF68',\n lottie: successImg\n },\n 'fail': {\n text: 'Failed!',\n color: '#F14141',\n lottie: failImg\n }\n }\n\n const statusValue = error ? statusMaps.fail : statusMaps[status]\n const [shouldRefetch, setShouldRefetch] = useState(true)\n\n useEffect(() => {\n if (hash) {\n setShouldRefetch(true)\n setStatus('pending')\n } else {\n setStatus('confirm')\n }\n }, [hash])\n const hashQuery = useHash({\n hash,\n chain,\n refetchInterval: shouldRefetch ? 3000 : false\n })\n useEffect(() => {\n if (hashQuery.data == 1 || hashQuery.data == -1) {\n setShouldRefetch(false)\n }\n if (hashQuery.data == 1) {\n setStatus('success')\n } else if (hashQuery.data == -1) {\n setStatus('fail')\n } else if (hashQuery.data == 0) {\n setStatus('pending')\n }\n }, [hashQuery.data]);\n\n const link = chain ? `${chain?.blockExplorers?.default.url}/tx/${hash}` : '';\n\n return <ModalDrawer isOpen={isOpen}\n showClose\n onClose={onClose}\n zIndex={zIndex}\n title={\n <div className={\"matchid-hashpanel-header\"}\n style={{\n color: statusValue.color\n }}>{statusValue.text}</div>\n }\n >\n <div className=\"matchid-hashpanel-box\">\n <div className=\"matchid-hashpanel-content\">\n <div className={`matchid-hashpanel-status`} style={{\n color: statusValue.color\n }}>{statusValue.text}</div>\n {\n statusValue.lottie && <Lottie animationData={statusValue.lottie} style={{\n width: \"96px\",\n height: \"96px\",\n }}/>\n }\n\n {hash && <div className=\"matchid-hashpanel-hash\">\n Hash:<a href={link} target=\"_blank\">{hash}</a>\n </div>}\n {error && <div className=\"matchid-hashpanel-text\">\n {error}\n </div>}\n </div>\n <Button onClick={onClose} size=\"lg\" block>Back</Button>\n </div>\n </ModalDrawer>\n}\n\nexport default function (props: HashPanelProps) {\n return props.isOpen && <HashPanel {...props}/>\n\n}","import { useState ,useEffect} from \"react\";\n\nexport function useDownMd(): boolean {\n const [isBelowMd, setIsBelowMd] = useState(window.matchMedia('(max-width: 767px)').matches);\n\n useEffect(() => {\n const handleResize = () => {\n setIsBelowMd(window.matchMedia('(max-width: 767px)').matches);\n };\n\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return isBelowMd;\n}","import React, {PropsWithChildren, useEffect, useState} from \"react\";\nimport {ModalProps, ModalWithHeaderProps} from \"../../types\";\nimport ArrowLeftIcon from \"../../assets/icon/ArrowLeftIcon\";\nimport {CloseRoundIcon} from \"../../assets/icon\";\nimport {useDownMd} from \"../../hooks/useLayout\";\nimport Overlay from \"../Overlay\";\nimport { Button } from \"components\";\nimport { useIntl } from \"react-intl\";\n\nexport default function Modal({\n children,\n isOpen,\n width = 480,\n zIndex = 100,\n className = ''\n }: ModalProps) {\n\n return <Overlay isOpen={isOpen} zIndex={zIndex}>\n <div className={`matchid-modal ${className}`} style={{\n width\n }}>\n <div className=\"matchid-modal-mobile-header\"></div>\n {children}\n </div>\n </Overlay>\n}\n\nexport function ModalWithHeader({\n children,\n onBack,\n onClose,\n title,\n showBorder = true,\n showClose = true,\n ...props\n\n }: ModalWithHeaderProps) {\n const isDownMd = useDownMd()\n return <Modal {...props}>\n <div className={`matchid-modal-header ${showBorder ? 'matchid-modal-header-border' : ''}`}>\n <div className=\"matchid-modal-header-content\">\n {\n onBack &&\n <ArrowLeftIcon height={isDownMd ? 20 : 25} width={isDownMd ? 20 : 24} className=\"matchid-modal-header-back\" onClick={onBack}/>\n }\n <span className=\"matchid-modal-header-title\">{title}</span>\n </div>\n {onClose &&\n <CloseRoundIcon size={isDownMd ? 24 : 30} className=\"matchid-modal-header-close\" onClick={onClose}/>}\n </div>\n {children}\n </Modal>\n\n}\n\nexport function ConfirmModal({\n title,\n children,\n onClose,\n onConfirm,\n isOpen,\n confirmText,\n zIndex=100\n }: {\n title?: string\n onClose: () => void,\n onConfirm: () => Promise<void>,\n isOpen: boolean,\n confirmText?: React.ReactNode,\n zIndex?:number\n} & PropsWithChildren) {\n const intl = useIntl()\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n useEffect(() => {\n if (isOpen) {\n setError('')\n setLoading(false)\n }\n }, [isOpen]);\n const onSubmit = async () => {\n setError('')\n setLoading(true)\n try {\n await onConfirm()\n } catch (e: any) {\n setError(e.message)\n console.error(e)\n } finally {\n setLoading(false)\n }\n }\n\n return <ModalWithHeader isOpen={isOpen} onClose={onClose} title={title} zIndex={zIndex}>\n <div className=\"matchid-confirm-modal\">\n <div className=\"matchid-w-full\">{children}</div>\n {error && <div className={`matchid-error`}>{error}</div>}\n <Button size={\"lg\"} onClick={onSubmit} loading={loading} block highlight>{confirmText ?? intl.formatMessage({\n id:\"Confirm\"\n })}</Button>\n </div>\n </ModalWithHeader>\n}","import {useEffect, useState} from \"react\";\nimport {ModalWithHeader} from \"../../ui/Modal\";\nimport StepEmail from \"./StepEmail\";\nimport StepVerify from \"./StepVerify\";\nimport {EmailModalProps} from \"../../types/types\";\nimport {useIntl} from \"react-intl\";\n\nexport default function EmailModal({\n isOpen = false,\n width = 480,\n onClose,\n onBack,\n onLogin\n }: EmailModalProps) {\n const [step, setStep] = useState<\"input\" | \"verify\">(\"input\")\n const [emailVal, setEmailVal] = useState('')\n const intl = useIntl()\n\n useEffect(() => {\n if (!isOpen) {\n setStep('input')\n setEmailVal('')\n }\n }, [isOpen])\n\n return <ModalWithHeader\n isOpen={isOpen}\n width={width}\n onClose={onClose}\n title={intl.formatMessage({\n id:\"email\"\n })}\n onBack={step == 'verify' ? () => setStep(\"input\") : onBack}\n >\n {\n step === \"input\" ? <StepEmail email={emailVal} onContinue={(email) => {\n setEmailVal(email)\n setStep(\"verify\")\n }}/> : <StepVerify email={emailVal} onSuccess={onLogin}/>}\n </ModalWithHeader>\n}","import {useEffect, useMemo, useState} from \"react\";\nimport {isValidEmail} from \"utils\";\nimport Button from \"../../ui/Button\";\nimport Input from \"../../ui/Input\";\nimport Field from \"../../ui/Field\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nexport default function StepEmail(props: {\n email: string\n onContinue: (email: string) => void\n}) {\n const intl = useIntl()\n const [emailVal, setEmailVal] = useState('')\n useEffect(() => {\n if (props.email) {\n setEmailVal(props.email)\n }\n }, []);\n\n const canContinue = useMemo(() => {\n return isValidEmail(emailVal)\n }, [emailVal])\n\n const onContinue = async () => {\n props.onContinue(emailVal)\n }\n\n return <div className=\"matchid-email-email-box\">\n <Field label={intl.formatMessage({\n id:\"emailAddress\"\n })}>\n <Input\n placeholder={intl.formatMessage({\n id:\"emailAddressPlaceholder\"\n })}\n onChange={e => setEmailVal(e.target.value)}\n value={emailVal}\n />\n </Field>\n\n <Button disabled={!canContinue} style={{\n marginTop:\"64px\"\n }} onClick={onContinue} size={\"lg\"} block highlight><FormattedMessage id={\"continue\"}/></Button>\n\n </div>\n}\n","import {InputProps} from \"types/types\";\nimport {DeleteRoundIcon, CloseEyeIcon, OpenEyeIcon, InputLengthIcon} from \"assets/icon\";\nimport {PropsWithChildren, useEffect, useRef, useState} from \"react\";\nimport {useDownMd} from \"../../hooks/useLayout\";\n\nexport default function Input({\n onChange,\n type,\n after,\n showLength = false,\n showClear = true,\n className = '',\n rows = 1,\n maxRows = 4,\n children,\n ...props\n }: InputProps & PropsWithChildren) {\n const [inputType, setInputType] = useState(type)\n const isDownMd = useDownMd()\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n useEffect(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.height = 'auto';\n const lineHeight = 24;\n const maxHeight = lineHeight * 4;\n textarea.style.height = Math.min(textarea.scrollHeight, maxHeight) + 'px';\n }\n }, [props.value]);\n return <div\n className={`matchid-input-box matchid-input-${type} ${props.value && props.value.length > 0 ? 'matchid-input-has-content' : ''} ${className}`}\n style={{\n // @ts-ignore\n '--max-rows': maxRows\n }}\n >\n {children ?? (type == \"textarea\" ?\n <textarea rows={1} onChange={onChange} {...props} className=\"matchid-input-field\" ref={textareaRef} style={{\n maxHeight: maxRows * 24 + 'px'\n }}/> :\n <input type={inputType} onChange={onChange} {...props} className=\"matchid-input-field\"/>)}\n {\n type != \"textarea\" && showClear && props.value && props.value.length > 0\n && <div className=\"matchid-input-delete-icon\" onClick={(e) => {\n if (onChange) {\n onChange({target: {value: ''}});\n }\n }}>\n <DeleteRoundIcon height={isDownMd ? 16 : 21} width={isDownMd ? 16 : 20}\n color=\"var(--matchid-input-delete-icon-color)\"/>\n </div>\n }\n {\n type === 'password' && <div className=\"matchid-input-eye-icon\" onClick={() => {\n setInputType(inputType === 'password' ? 'text' : 'password')\n }}>\n {\n inputType === 'password' ? <CloseEyeIcon size={isDownMd ? 16 : 20}/> :\n <OpenEyeIcon size={isDownMd ? 16 : 20}/>\n }\n </div>\n }\n {\n showLength && props.maxLength && <div className={`matchid-input-length`}>\n <span>{props.value!.length || 0}/{props.maxLength}</span>\n <InputLengthIcon color={'var(--icon-color)'}/>\n </div>\n }\n {\n after\n }\n </div>\n\n}","import useUserInfo from \"../../hooks/useUserInfo\";\nimport {useEffect, useMemo, useRef, useState} from \"react\";\nimport Button from \"../../ui/Button\";\nimport {EmailLineIcon} from \"assets/icon\";\nimport Input from \"../../ui/Input\";\nimport Field from \"../../ui/Field\";\nimport {EMAIL_CODE_LENGTH, EMAIL_INTERVAL} from \"../../config\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport {useDownMd} from \"../../hooks/useLayout\";\n\nexport default function StepVerify(props: {\n email: string\n onSuccess?: () => void\n}) {\n const intl = useIntl()\n const {getLoginEmailCode, loginByEmail} = useUserInfo()\n const [error, setError] = useState('')\n const [code, setCode] = useState('')\n const [sending, setSending] = useState(false)\n const [submitting, setSubmitting] = useState(false)\n const sendTimeRef = useRef(0)\n const [sendBtnText, setSendBtnText] = useState(intl.formatMessage({\n id: \"send\"\n }))\n const intervalTime = EMAIL_INTERVAL\n const codeLength = EMAIL_CODE_LENGTH\n const intervalRef = useRef<NodeJS.Timeout | null>(null);\n const isDownMd = useDownMd()\n\n const onSend = async () => {\n if (sendTimeRef.current > 0) {\n return\n }\n try {\n setError(\"\")\n setSending(true)\n await getLoginEmailCode(props.email)\n sendTimeRef.current = intervalTime\n setSendBtnText(`${sendTimeRef.current}s`)\n intervalRef.current = setInterval(() => {\n sendTimeRef.current--;\n setSendBtnText(`${sendTimeRef.current}s`)\n if (sendTimeRef.current <= 0) {\n setSendBtnText(intl.formatMessage({\n id: \"resend\"\n }))\n clearInterval(intervalRef.current!);\n setSending(false);\n }\n }, 1000);\n } catch (err: any) {\n console.error(\"Send email error\", err)\n setError(intl.formatMessage({\n id: \"sendCodeErrorTip\",\n }, {error: err.message}))\n setSending(false)\n }\n\n }\n useEffect(() => {\n onSend()\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n }\n }, []);\n const canContinue = useMemo(() => {\n return code.length === codeLength\n }, [code])\n\n const onContinue = async () => {\n if (submitting) {\n return\n }\n try {\n setError(\"\")\n setSubmitting(true)\n const res = await loginByEmail({\n email: props.email,\n code\n })\n if (res) {\n props.onSuccess && props.onSuccess()\n }\n setSubmitting(false)\n\n } catch (err: any) {\n console.error(\"Verify email code error\", err)\n setError(err.message)\n setSubmitting(false)\n }\n }\n\n return <div className=\"matchid-email-verify-box\">\n <div className=\"matchid-email-verify-header\">\n <div className=\"matchid-email-verify-header-icon\"><EmailLineIcon size={isDownMd ? 19:24}/></div>\n <div className=\"matchid-email-verify-header-content\">\n <div className=\"matchid-email-verify-header-value\">{props.email}</div>\n <div className=\"matchid-email-verify-header-tips\"><FormattedMessage id=\"sendEmailTips\"/></div>\n </div>\n </div>\n <Field label={intl.formatMessage({\n id:\"verificationCode\"\n })} error={error}>\n <Input\n placeholder={intl.formatMessage({\n id:\"codePlaceholder\"\n })}\n className={\"matchid-email-verify-field\"}\n maxLength={codeLength}\n onChange={e => setCode(e.target.value)}\n value={code}\n after={<Button\n highlight\n disabled={sending}\n style={{\n height: '100%',\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n borderTopRightRadius: 'inherit',\n borderBottomRightRadius: 'inherit',\n width: \"80px\"\n }}\n onClick={onSend}>{sendBtnText}</Button>}\n >\n\n </Input>\n </Field>\n\n <Button disabled={!canContinue} loading={submitting} highlight block size=\"lg\" onClick={onContinue}><FormattedMessage id={\"continue\"}/></Button>\n </div>\n}","import {useState} from \"react\";\nimport {PopoverProps} from \"../../types/types\";\n\nexport default function Popover({\n children,\n content,\n position = \"right\",\n type = \"hover\",\n className = \"\",\n gap = '20px'\n }: PopoverProps) {\n const [active, setActive] = useState(false)\n return children && <div\n onClick={() => {\n if (type == 'click') {\n setActive(!active)\n }\n }}\n className={`matchid-popover-box matchid-popover-${position} matchid-popover-${type} ${className} ${type == 'click' && active ? 'matchid-popover-click-active' : ''}`}>\n {children}\n <div style={{\n paddingTop: gap\n }} className={`matchid-popover-area`}>\n <div className={`matchid-popover-content`}>\n {content}\n </div>\n </div>\n </div>\n\n}","import useUserInfo from \"hooks/useUserInfo\";\nimport {LoginBoxProps, OtherLoginMethodType} from \"types/types\";\nimport React, {PropsWithChildren, useMemo, useState} from \"react\";\nimport {\n EmailIcon,\n GoogleIcon,\n TelegramIcon,\n WalletIcon,\n XIcon,\n ArrowRightIcon,\n GithubIcon,\n DiscordIcon,\n LinkedinIcon,\n FacebookIcon,\n ArrowDownIcon,\n EVMDarkIcon,\n EVMLightIcon,\n SOLDarkIcon,\n SOLLightIcon,\n YoutubeIcon,\n BTCDarkIcon,\n BTCLightIcon,\n TRXDarkIcon, TRXLightIcon, TonDarkIcon, TonLightIcon\n} from \"assets/icon\";\nimport EmailModal from \"../EmailModal\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport {useDownMd} from \"../../hooks/useLayout\";\nimport {DEFAULT_WALLET_METHODS, useWalletConfig, WALLET_METHODS} from \"../../hooks/useConfig\";\nimport useAppConfig from \"../../hooks/useAppConfig\";\n\nexport const RecommendItem = ({\n icon,\n name,\n onClick,\n showChildren = false,\n children,\n footer\n }: {\n icon: React.ReactNode,\n name: string,\n onClick: () => void,\n showChildren?: boolean\n footer?: React.ReactNode\n} & PropsWithChildren) => {\n return <div className=\"matchid-login-recommend-method\">\n <div className=\"matchid-login-recommend-method-item\" onClick={onClick}>\n <div className=\"matchid-login-recommend-method-content\">\n <div className=\"matchid-login-recommend-method-icon\">\n {icon}\n </div>\n <span className=\"matchid-login-recommend-method-name\">{name}</span>\n </div>\n {\n footer ? footer : children ? <ArrowDownIcon\n className={`matchid-login-recommend-method-arrow ${showChildren ? 'matchid-login-recommend-method-arrow-active' : ''}`}\n size={20}\n color={\"var(--matchid-arrow-color)\"}/> :\n <ArrowRightIcon className=\"matchid-login-recommend-method-arrow\" size={20}\n color={\"var(--matchid-arrow-color)\"}/>\n }\n\n </div>\n {children && <div\n className={`matchid-login-recommend-method-popover ${showChildren ? 'matchid-login-recommend-method-popover-active' : ''}`}>\n {children}\n </div>}\n </div>\n}\nexport default function LoginBox({\n recommendMethods,\n methods ,\n walletMethods ,\n inModal = false\n }: LoginBoxProps) {\n\n const config = useAppConfig()\n const methodConfig = useMemo(()=>{\n if(recommendMethods||methods||walletMethods){\n return {\n recommendMethods:recommendMethods?recommendMethods:(walletMethods?['wallet']:[]),\n methods:methods||[],\n walletMethods:walletMethods||[]\n }\n }\n if(!config.platform){\n return {\n recommendMethods:[],\n methods:[],\n walletMethods:[]\n }\n }\n const platform = config.platform.map(p=>{\n // @ts-ignore\n if(p=='x'||p=='X'){\n return 'twitter'\n }\n return p.toLowerCase()\n })\n console.log('platform',platform)\n const walletMethodList = WALLET_METHODS.filter(m=>platform.includes(m))\n let recommendMethodList = walletMethodList.length>0?['wallet']:[]\n let methodList:any[] = []\n const otherMethodList = platform.filter(m=>!walletMethodList.includes(m as any))\n if(otherMethodList.length>0){\n const recommendMethodListLength = recommendMethodList.length\n const maxRecommendMethodListLength = 3\n if(recommendMethodListLength<maxRecommendMethodListLength){\n recommendMethodList = recommendMethodList.concat(otherMethodList.slice(0,Math.min(maxRecommendMethodListLength-recommendMethodListLength,otherMethodList.length)))\n methodList = otherMethodList.slice(maxRecommendMethodListLength-recommendMethodListLength)\n }else{\n methodList = otherMethodList\n }\n }\n return {\n recommendMethods:recommendMethodList,\n methods:methodList,\n walletMethods:walletMethodList\n }\n },[config.platform,recommendMethods,methods,walletMethods])\n\n const [emailOpen, setEmailOpen] = useState(false)\n const {login} = useUserInfo()\n const [showWallet, setShowWallet] = useState(false)\n const intl = useIntl()\n const isDownMd = useDownMd()\n const methodMap: {\n [key: string]: {\n icon: React.ReactNode,\n name: string,\n onClick: () => void,\n type?: \"wallet\"\n }\n } = {\n wallet: {\n icon: <WalletIcon size={isDownMd ? 36 : 40}/>,\n name: intl.formatMessage({id: \"wallet\"}),\n onClick: () => setShowWallet(!showWallet),\n type: \"wallet\"\n },\n email: {\n icon: <EmailIcon size={isDownMd ? 36 : 40}/>,\n name: intl.formatMessage({id: \"email\"}),\n onClick: () => {\n setEmailOpen(true)\n }\n },\n google: {\n icon: <GoogleIcon size={isDownMd ? 36 : 40}/>,\n name: \"Google\",\n onClick: () => login('google')\n },\n twitter: {\n icon: <XIcon size={isDownMd ? 36 : 40}/>,\n name: \"X\",\n onClick: () => login('twitter')\n },\n telegram: {\n icon: <TelegramIcon size={isDownMd ? 36 : 40}/>,\n name: \"Telegram\",\n onClick: () => login('telegram')\n },\n github: {\n icon: <GithubIcon size={isDownMd ? 36 : 40}/>,\n name: \"Github\",\n onClick: () => login('github')\n },\n discord: {\n icon: <DiscordIcon size={isDownMd ? 36 : 40}/>,\n name: \"Discord\",\n onClick: () => login('discord')\n },\n linkedin: {\n icon: <LinkedinIcon size={isDownMd ? 36 : 40}/>,\n name: \"LinkedIn\",\n onClick: () => login('linkedin')\n },\n facebook: {\n icon: <FacebookIcon size={isDownMd ? 36 : 40}/>,\n name: \"Facebook\",\n onClick: () => login('facebook')\n },\n youtube: {\n icon: <YoutubeIcon size={isDownMd ? 36 : 40}/>,\n name: \"Youtube\",\n onClick: () => login('youtube')\n }\n\n }\n\n const {walletMap} = useWalletConfig()\n\n\n return <>\n {(!inModal || !emailOpen) && <div className=\"matchid-login-box\">\n <div className=\"matchid-login-recommend-list\">\n {\n methodConfig.recommendMethods.map((m) => {\n return <RecommendItem\n icon={methodMap[m]?.icon}\n name={methodMap[m]?.name}\n onClick={methodMap[m]?.onClick}\n key={m}\n showChildren={m == 'wallet' && showWallet}\n >\n {\n m == 'wallet' && <>\n <div className={\"matchid-login-recommend-wallet-divider\"}></div>\n <div className={\"matchid-login-recommend-wallet-list\"}>\n {\n methodConfig.walletMethods.map((n) => {\n const m = walletMap[n]\n return <div className={\"matchid-login-recommend-wallet-item\"}\n key={m.name}\n onClick={()=>{\n login(m.method)\n }}>\n <div className={\"matchid-login-recommend-wallet-item-content\"}>\n <div className={\"matchid-login-recommend-wallet-item-icon\"}>\n {m.icon}\n </div>\n <div\n className={\"matchid-login-recommend-wallet-item-hover-icon\"}>\n {m.activeIcon}\n </div>\n\n <span\n className={\"matchid-login-recommend-wallet-item-name\"}>{m.name}</span>\n </div>\n <ArrowRightIcon\n className=\"matchid-login-recommend-wallet-item-arrow\"\n size={20}\n color={\"var(--matchid-arrow-color)\"}/>\n </div>\n })\n }\n </div>\n </>\n }\n </RecommendItem>\n })\n }\n </div>\n {methodConfig.methods.length > 0 &&\n <div className=\"matchid-login-other\">\n <div className=\"matchid-login-other-text\"><FormattedMessage id={\"otherLoginMethods\"}/></div>\n <div className=\"matchid-login-method-box\">\n {\n methodConfig.methods.map((m) => {\n return <div className=\"matchid-login-method-item\" key={m}\n onClick={methodMap[m]?.onClick} title={methodMap[m]?.name}>\n {methodMap[m]?.icon}\n </div>\n })\n }\n </div>\n </div>\n }\n </div>\n }\n <EmailModal\n isOpen={emailOpen}\n onClose={() => {\n setEmailOpen(false)\n }}\n onBack={inModal ? () => {\n setEmailOpen(false)\n } : undefined}\n />\n </>\n\n}\n","import React from \"react\";\nimport {\n BTCDarkIcon,\n BTCLightIcon,\n EVMDarkIcon,\n EVMLightIcon,\n SOLDarkIcon,\n SOLLightIcon, TonDarkIcon, TonLightIcon,\n TRXDarkIcon, TRXLightIcon\n} from \"../assets/icon\";\nimport {useDownMd} from \"./useLayout\";\nimport {WalletType} from \"../types\";\nexport const DEFAULT_WALLET_METHODS:WalletType[] = [\"evm\", 'sol', 'btc', 'tron', 'ton']\nexport const WALLET_METHODS:WalletType[] = [\"evm\", 'sol', 'btc', 'tron', 'ton']\nexport function useWalletConfig(){\n const isDownMd = useDownMd()\n const walletMap: {\n [key: string]: {\n icon: React.ReactNode,\n activeIcon: React.ReactNode,\n name: string,\n method: WalletType,\n }\n } = {\n evm: {\n icon: <EVMDarkIcon size={isDownMd ? 36 : 40}/>,\n activeIcon: <EVMLightIcon size={isDownMd ? 36 : 40}/>,\n name: \"EVM\",\n method: 'evm'\n },\n sol: {\n icon: <SOLDarkIcon size={isDownMd ? 36 : 40}/>,\n activeIcon: <SOLLightIcon size={isDownMd ? 36 : 40}/>,\n name: \"SOL\",\n method: 'sol'\n },\n btc: {\n icon: <BTCDarkIcon size={isDownMd ? 36 : 40}/>,\n activeIcon: <BTCLightIcon size={isDownMd ? 36 : 40}/>,\n name: \"BTC\",\n method: 'btc'\n },\n tron: {\n icon: <TRXDarkIcon size={isDownMd ? 36 : 40}/>,\n activeIcon: <TRXLightIcon size={isDownMd ? 36 : 40}/>,\n name: \"TRON\",\n method: 'tron'\n },\n ton: {\n icon: <TonDarkIcon size={isDownMd ? 36 : 40}/>,\n activeIcon: <TonLightIcon size={isDownMd ? 36 : 40}/>,\n name: \"TON\",\n method: 'ton'\n }\n }\n\n return {\n walletMap\n }\n}","import {useQuery} from \"@tanstack/react-query\";\nimport {getAppConfigApi} from \"../api\";\nimport {isSuccess} from \"../api/request\";\n\nexport default function useAppConfig(){\n const query = useQuery({\n queryKey: ['appConfig'],\n queryFn: async () => {\n const res = await getAppConfigApi()\n if(!isSuccess(res)){\n return null\n }\n return res.data\n },\n })\n\n return {\n isFetched: query.isFetched,\n isLoading: query.isLoading,\n ...query.data\n }\n}","import useUserInfo from \"../../hooks/useUserInfo\";\nimport {ReactNode, useState} from \"react\";\nimport {\n ButtonProps,\n OtherLoginMethodType,\n PopoverPositionType,\n PopoverTypeType,\n RecommendLoginMethodType, WalletType,\n} from \"../../types/types\";\nimport {truncateAddress} from \"../../utils\";\nimport Button from \"../../ui/Button\";\nimport {LoginIcon, UnLoginIcon} from \"../../assets/icon\";\nimport LoginModal from \"../LoginModal\";\nimport UserPopover from \"../UserPopover\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nexport default function LoginButton({\n loginRender,\n methods,\n recommendMethods,\n onLoginClick,\n popoverPosition = \"right\",\n popoverType = \"hover\",\n popoverGap = 20,\n walletMethods,\n ...props\n }: Omit<ButtonProps, 'onClick' | 'highlight'> & {\n loginRender?: ReactNode\n methods?: OtherLoginMethodType[],\n recommendMethods?: RecommendLoginMethodType[]\n walletMethods?: WalletType[]\n onLoginClick?: () => void\n popoverPosition?: PopoverPositionType\n popoverType?: PopoverTypeType,\n popoverGap?: number | string\n}) {\n const intl = useIntl()\n const {isLogin, username} = useUserInfo()\n const [loginOpen, setLoginOpen] = useState(false)\n if (!isLogin) {\n return <>\n <LoginModal methods={methods} walletMethods={walletMethods} recommendMethods={recommendMethods} isOpen={loginOpen}\n onClose={() => setLoginOpen(false)}/>\n <Button className={'matchid-unlogin-btn'} {...props} highlight onClick={() => setLoginOpen(true)}>\n <UnLoginIcon/>\n <span><FormattedMessage id=\"login\"/></span>\n </Button>\n </>\n }\n return loginRender ? <>{loginRender}</> :\n <UserPopover position={popoverPosition} type={popoverType} gap={popoverGap}>\n <Button onClick={onLoginClick} className={'matchid-login-btn'} {...props}>\n <LoginIcon/>\n <span>{username ? truncateAddress(username) : ('MatchID ' + intl.formatMessage({\n id: 'user'\n }))}</span>\n </Button>\n </UserPopover>\n\n}","import {LoginPanelProps} from \"types/types\";\nimport LoginBox from \"../LoginBox\";\nimport {CloseRoundIcon} from \"assets/icon\";\nimport {FormattedMessage} from \"react-intl\";\nimport {useDownMd} from \"../../hooks/useLayout\";\n\nexport default function LoginPanel({\n\n header,\n onClose,\n ...props\n }: LoginPanelProps) {\n\n const isDownMd = useDownMd()\n return <div className=\"matchid-login-panel\">\n {header ? header : <div className=\"matchid-login-panel-header\">\n <div className=\"matchid-login-panel-header-content\">\n <div className=\"matchid-login-panel-header-title\"><FormattedMessage id=\"loginTitle\"/></div>\n <div className=\"matchid-login-panel-header-subtilte\"><FormattedMessage id=\"loginTips\"/></div>\n </div>\n {\n onClose && <div className={\"matchid-login-panel-header-close\"} onClick={onClose}><CloseRoundIcon size={isDownMd?24:30}/></div>\n }\n\n </div>}\n <div className=\"matchid-login-panel-divide\"/>\n <div className={\"matchid-login-panel-box\"}>\n <LoginBox {...props}/>\n </div>\n </div>\n\n}\n","import Modal from \"ui/Modal\";\nimport LoginPanel from \"../LoginPanel\";\nimport {LoginModalProps} from \"../../types/types\";\nimport {useUserInfo} from \"../../hooks\";\n\nexport default function LoginModal({\n isOpen = false,\n width = 480,\n ...props\n }: LoginModalProps) {\n const {isLogin} = useUserInfo()\n return <Modal\n isOpen={isOpen && !isLogin}\n width={width}\n >\n <LoginPanel {...props} inModal/>\n </Modal>\n}","import {PopoverProps, UserPopoverProps} from \"../../types/types\";\nimport Popover from \"../../ui/Popover\";\nimport Button from \"../../ui/Button\";\nimport {useCopyClipboard, useUserInfo} from \"../../hooks\";\nimport {PropsWithChildren, useState} from \"react\";\nimport ProfileIcon from \"../../assets/icon/ProfileIcon\";\nimport {ArrowRightIcon, CheckIcon, CopyIcon} from \"../../assets/icon\";\nimport {truncateAddress} from \"../../utils\";\nimport {UsernameModal} from \"../index\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nfunction UserContent() {\n const {logout,address,username} = useUserInfo()\n const [logouting, setLogouting] = useState(false)\n\n const onLogout = async () => {\n if (logouting) return\n try {\n setLogouting(true)\n await logout()\n } catch (error) {\n console.error(error)\n } finally {\n setLogouting(false)\n }\n }\n const UserItem = ({\n children,\n icon,\n rightIcon,\n onClick\n }:PropsWithChildren&{\n icon?:React.ReactNode,\n rightIcon?:React.ReactNode,\n onClick?:()=>void\n })=>{\n return <div className={\"matchid-user-popover-item\"} onClick={onClick}>\n <div className={`matchid-user-popover-item-content`}>\n {icon}\n <div className={\"matchid-user-popover-item-text\"}>\n {children}\n </div>\n </div>\n {rightIcon}\n </div>\n\n }\n const UserDivider = ()=>{\n return <div className={`matchid-user-popover-divider`}></div>\n }\n\n const [usernameOpen,setUsernameOpen] = useState(false)\n const [copied, setCopied] = useCopyClipboard();\n const intl = useIntl()\n return <div className={\"matchid-user-popover-content\"}>\n <div className={\"matchid-user-popover-list\"}>\n <UserItem onClick={()=>{\n setCopied(address)\n }} icon={copied ?<CheckIcon size={20} color=\"#0ecb81\"/> : <CopyIcon size={20} color=\"var(--icon-color)\"/>} rightIcon={<CheckIcon size={20} color=\"var(--icon-color)\"/>}>\n {truncateAddress(address)}\n </UserItem>\n <UserDivider/>\n <UserItem onClick={()=>{\n setUsernameOpen(true)\n }} icon={<ProfileIcon size={20} color=\"var(--icon-color)\"/>} rightIcon={<ArrowRightIcon size={20} color=\"var(--icon-color)\"/>}>\n {username || intl.formatMessage({\n id:\"setUsername\"\n })}\n </UserItem>\n </div>\n <Button onClick={onLogout} loading={logouting}><FormattedMessage id=\"disconnect\"/></Button>\n <UsernameModal isOpen={usernameOpen} onClose={()=>{\n setUsernameOpen(false)\n }} onSuccess={()=>{\n setUsernameOpen(false)\n }}/>\n </div>\n}\n\nexport default function UserPopover({\n children,\n ...props\n }: UserPopoverProps) {\n return <Popover {...props} content={<UserContent/>}>\n {children}\n </Popover>\n\n}","import { IconSizeColorProps} from \"./types\";\n\nexport default function ProfileIcon({size=24,color='black',...props}:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M7.5 6.75C7.5 4.95507 8.95507 3.5 10.75 3.5C12.5449 3.5 14 4.95507 14 6.75C14 8.54493 12.5449 10 10.75 10C8.95507 10 7.5 8.54493 7.5 6.75ZM10.75 2C8.12665 2 6 4.12665 6 6.75C6 9.37335 8.12665 11.5 10.75 11.5C13.3734 11.5 15.5 9.37335 15.5 6.75C15.5 4.12665 13.3734 2 10.75 2ZM8.75 13C5.57436 13 3 15.5744 3 18.75V19.75C3 20.7165 3.7835 21.5 4.75 21.5H13.6646L13.0292 20.8646C12.7764 20.6118 12.5733 20.3185 12.4263 20H4.75C4.61193 20 4.5 19.8881 4.5 19.75V18.75C4.5 16.4028 6.40279 14.5 8.75 14.5H12.6452C13.0508 13.8858 13.676 13.4295 14.4091 13.243C13.8838 13.0849 13.3268 13 12.75 13H8.75Z\"\n fill={color}/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M19.0677 22.4771L21.4771 20.0677C21.841 19.7038 21.841 19.1139 21.4771 18.75L17.75 15.0229C17.5753 14.8482 17.3383 14.75 17.0911 14.75H14.6818C14.1672 14.75 13.75 15.1672 13.75 15.6818V18.0911C13.75 18.3383 13.8482 18.5753 14.0229 18.75L17.75 22.4771C18.1139 22.841 18.7038 22.841 19.0677 22.4771ZM15.6135 17.3124C15.9995 17.3124 16.3124 16.9995 16.3124 16.6135C16.3124 16.2276 15.9995 15.9147 15.6135 15.9147C15.2276 15.9147 14.9147 16.2276 14.9147 16.6135C14.9147 16.9995 15.2276 17.3124 15.6135 17.3124Z\"\n fill={color}/>\n </svg>\n\n}","import {ModalWithHeaderProps} from \"types/types\";\nimport {ModalWithHeader} from \"../../ui/Modal\";\nimport {useEffect, useMemo, useState} from \"react\";\nimport {isValidUsername} from \"../../utils\";\nimport Input from \"../../ui/Input\";\nimport Field from \"../../ui/Field\";\nimport Button from \"../../ui/Button\";\nimport InfoLineIcon from \"../../assets/icon/InfoLineIcon\";\nimport {useUserInfo} from \"../../hooks\";\nimport CheckRoundIcon from \"../../assets/icon/CheckRoundIcon\";\nimport {setUserNameApi} from \"../../api\";\nimport {isSuccess} from \"../../api/request\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport {useDownMd} from \"../../hooks/useLayout\";\n\nconst ValidItem = ({\n success = false,\n text\n }: {\n success?: boolean,\n text: string\n}) => {\n const isDownMd = useDownMd()\n return <div className={`matchid-valid-status-item matchid-valid-status-${success ? 'success' : 'error'}`}>\n\n {success ? <CheckRoundIcon size={isDownMd ? 12 : 16}/> : <InfoLineIcon size={isDownMd ? 12 : 16}/>}\n <span>\n {text}\n </span>\n </div>\n}\n\nexport default function UsernameModal({\n title,\n isOpen,\n onSuccess,\n ...props\n }: ModalWithHeaderProps & {\n onSuccess?: () => void\n}) {\n const {username, refreshOverview} = useUserInfo()\n const {isLogin} = useUserInfo()\n const [val, setVal] = useState(username)\n const [error, setError] = useState('')//error from api\n const isDownMd = useDownMd()\n\n useEffect(() => {\n if (isOpen) {\n setVal(username)\n setError('')\n }\n }, [isOpen]);\n\n const isValid = useMemo(() => {\n return isValidUsername(val)\n }, [val])\n\n const isLength = useMemo(() => {\n return val.length >= 2 && val.length <= 32\n }, [val])\n\n const isSafe = isValid && isLength\n\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n const onSubmit = async () => {\n if (isSubmitting) return\n try {\n setIsSubmitting(true)\n const res = await setUserNameApi({\n username: val\n })\n\n if (isSuccess(res)) {\n await refreshOverview()\n onSuccess && onSuccess()\n } else {\n setError(res.message)\n }\n\n } catch (error: any) {\n setError(error.message)\n } finally {\n setIsSubmitting(false)\n }\n }\n const intl = useIntl()\n\n return <ModalWithHeader isOpen={isOpen && isLogin} {...props} title={title || intl.formatMessage({\n id: username ? \"editUsernameTitle\" : \"setUsernameTitle\"\n })}>\n <div className=\"matchid-username-box\">\n <Field label={intl.formatMessage({\n id: \"username\"\n })} error={error}>\n <Input\n placeholder={intl.formatMessage({\n id: \"usernamePlaceholder\"\n })}\n onChange={e => {\n setVal(e.target.value)\n setError('')\n }}\n value={val}\n />\n </Field>\n <div className=\"matchid-valid\">\n <ValidItem success={isValid}\n text={intl.formatMessage({\n id: \"usernameValidError\"\n })}/>\n <ValidItem success={isLength} text={intl.formatMessage({\n id: \"usernameLengthError\"\n })}/>\n {/*<ValidItem success={isSafe} text={\"Cannot contain sensitive words\"}/>*/}\n </div>\n\n <Button disabled={!isSafe} loading={isSubmitting} style={{\n marginTop: isDownMd ? \"36px\" : \"64px\"\n }} onClick={onSubmit} size={\"lg\"} block highlight><FormattedMessage id=\"confirm\"/></Button>\n <Button style={{\n marginTop: isDownMd ? \"12px\" : \"24px\"\n }} onClick={props.onClose} size={\"lg\"} block><FormattedMessage id=\"cancel\"/></Button>\n </div>\n </ModalWithHeader>\n}","import {BindWalletParam, ILoginWalletReq, ModalWithHeaderProps} from \"types/types\";\nimport {ModalWithHeader} from \"ui\";\nimport React, {useCallback, useEffect, useState} from \"react\";\nimport {getWalletInitApi, getWalletNonceApi, loginByWalletApi, toBindWalletApi} from \"../../api\";\nimport {isSuccess} from \"../../api/request\";\nimport matchlog from \"../../utils/matchlog\";\nimport {useMatch} from \"../../MatchContext\";\nimport eventManager from \"../../hooks/eventManager\";\nimport {useIntl} from \"react-intl\";\nimport {WalletModalContentV2} from \"../WalletModalContent\";\n\nimport {RainbowKitProvider, useConnectModal} from \"@rainbow-me/rainbowkit\";\nimport {useAccount, useChainId, useConfig, useDisconnect} from \"wagmi\";\nimport useWalletBox from \"../../hooks/useWalletBox\";\nimport {getEthersSigner} from \"hooks/useEthersSigner\";\nimport {SiweMessage} from \"siwe\";\nimport \"@rainbow-me/rainbowkit/styles.css\";\n\n\nfunction WalletContent({\n onSuccess,\n type,\n }: {\n onSuccess?: () => void\n type: 'login' | 'bind' | ''\n}) {\n const config = useConfig();\n const {openConnectModal, connectModalOpen} = useConnectModal();\n const {address, connector, isConnected} = useAccount();\n const {disconnectAsync} = useDisconnect({config});\n const chainId = useChainId()\n const {events, login} = useMatch()\n const [inited, setInited] = useState(false)\n\n\n const {status, setStatus, error, setError, statusRef, nonce, setNonce, init} = useWalletBox({\n onInit: async ({setStatus}) => {\n setStatus('start')\n }\n })\n\n useEffect(() => {\n matchlog.log(`status=${status}`, `connectModalOpen=${connectModalOpen}`, `address=${address}`, `isConnected=${isConnected}`)\n }, [status, connectModalOpen, isConnected, address]);\n useEffect(() => {\n if (connectModalOpen) {\n setStatus(\"connecting\")\n return\n }\n if (!connectModalOpen && address) {\n toLoginInWallet(address)\n return\n }\n if (!connectModalOpen && !address) {\n setStatus('start')\n }\n }, [connectModalOpen, address]);\n useEffect(() => {\n if (openConnectModal && !isConnected && !inited) {\n openConnectModal && openConnectModal()\n setInited(true)\n }\n }, [openConnectModal, inited]);\n // useAccountEffect({\n // onDisconnect() {\n // matchlog.log('onDisconnect')\n // setStatus('start')\n // },\n // onConnect(data) {\n // matchlog.log('onConnect',data)\n // setStatus('connecting')\n // toLoginInWallet(data.address)\n // },\n // });\n\n\n // useEffect(() => {\n // if ( status != 'start') {\n // visible && setVisible(false)\n // } else if(status=='start'){\n // !visible && setVisible(true)\n // }\n // }, [ status])\n\n\n const toLoginInWallet = async (address: string) => {\n if (statusRef.current != 'start' && statusRef.current != 'connecting') return\n\n try {\n if (!address) {\n throw new Error('Wallet address is empty')\n }\n setStatus('nonce')\n const res = type == 'bind' ? await getWalletInitApi({\n address,\n type: \"EVM\"\n }) : await getWalletNonceApi({address, type: \"EVM\"});\n\n if (!isSuccess(res)) {\n throw new Error(res.message)\n }\n setNonce(res.data.nonce)\n } catch (error: any) {\n console.error('toLoginInWallet', error)\n setStatus('error')\n setError(error.message)\n }\n }\n\n const signature = useCallback(async () => {\n if (!nonce || status != 'nonce') {\n return\n }\n try {\n const signer = await getEthersSigner(config);\n if (!signer) return;\n matchlog.log('signature', nonce, status)\n if (!address) {\n throw new Error('Wallet address is empty')\n }\n setStatus('signer')\n const params: ILoginWalletReq = {\n domain: window.location.host,\n address,\n statement: 'By signing, you are proving you own this wallet and logging in. This does not initiate a transaction or cost any fees.',\n uri: window.location.origin,\n nonce,\n version: \"1\",\n chainId,\n };\n const message = new SiweMessage({...params});\n const signature = await signer.signMessage(message.prepareMessage());\n const obj: BindWalletParam = {\n type: 'EVM',\n address: address,\n signature: signature,\n message: `${message.prepareMessage()}`,\n connector_type: connector?.type || '',\n wallet_client_type: connector?.name || '',\n }\n const res = type == 'bind' ? await toBindWalletApi(obj) : await loginByWalletApi(obj)\n if (!isSuccess(res)) {\n throw new Error(res.message)\n }\n\n matchlog.log(res)\n setStatus('success')\n if (type == 'bind') {\n events!.onBind && events!.onBind({\n type: 'evm'\n })\n eventManager.emit('onBind', {\n type: 'evm'\n })\n } else {\n await login({\n token: `${res.data.token_type} ${res.data.access_token}`\n })\n }\n onSuccess && onSuccess()\n\n\n } catch (error: any) {\n console.error('signature', error)\n setStatus('error')\n setError(error.reason || error.message)\n }\n\n\n }, [nonce, status, address])\n useEffect(() => {\n if (signature) {\n signature()\n }\n }, [signature])\n\n const onError = async () => {\n if (isConnected) {\n try {\n await disconnectAsync()\n } catch (error: any) {\n console.error('disconnectAsync', error)\n }\n }\n\n setError('')\n setNonce(undefined)\n setStatus('start')\n openConnectModal?.()\n }\n const onConnect = async () => {\n // console.log('onConnect')\n if (isConnected) {\n try {\n await disconnectAsync()\n } catch (error: any) {\n console.error('disconnectAsync', error)\n }\n }\n setError('')\n setNonce(undefined)\n openConnectModal?.()\n }\n const onDisconnect = async () => {\n if (isConnected) {\n try {\n await disconnectAsync()\n } catch (error: any) {\n console.error('disconnectAsync', error)\n }\n }\n\n setError('')\n setNonce(undefined)\n setStatus('start')\n }\n\n return <WalletModalContentV2\n status={status}\n onSuccess={async () => onSuccess?.()}\n error={error}\n onError={onError}\n onConnect={onConnect}\n onDisconnect={onDisconnect}\n />\n}\n\ntype EVMModalProps = ModalWithHeaderProps & {\n type?: 'login' | 'bind' | ''\n onSuccess?: () => void\n}\n\nfunction EVMConnectModal({\n type = 'login',\n onSuccess,\n ...props\n }: EVMModalProps) {\n const intl = useIntl()\n return <ModalWithHeader {...props} title={props.title || (intl.formatMessage({\n id: type == \"bind\" ? \"bindWith\" : \"loginWith\"\n }, {\n name: \"EVM\"\n }))}>\n <WalletContent onSuccess={onSuccess} type={type}/>\n </ModalWithHeader>\n}\n\nexport default function EVMModal(props: EVMModalProps) {\n return props.isOpen && <RainbowKitProvider><EVMConnectModal {...props}/></RainbowKitProvider>\n}","import {Button} from \"../index\";\nimport React, {useMemo, useState} from \"react\";\nimport {\n walletConnectedImage,\n walletConnectImage,\n walletConnectingImage,\n walletErrorImage,\n walletSigningImage\n} from \"../../assets/wallet\";\nimport {Lottie} from \"../../ui\";\n\nexport default function WalletModalContent({\n status,\n error,\n disconnect,\n setError,\n setVisible,\n visible,\n address,\n connected\n }: {\n status: string,\n error: string,\n disconnect: () => Promise<void>,\n setError: (error: string) => void,\n setVisible: (visible: boolean) => void,\n visible: boolean,\n address?: string,\n connected: boolean\n\n}) {\n const pageData: {\n btnText?: string,\n btnLoading?: boolean,\n btnDisabled?: boolean,\n btnClick?: () => void\n statusImage: any\n text: string,\n isError?: boolean\n } = useMemo(() => {\n\n if (status == 'success') {\n return {\n btnText: 'Disconnect Wallet',\n btnClick: async () => {\n await disconnect()\n },\n text: 'Wallet connection successful!',\n statusImage: walletConnectedImage\n }\n }\n if (status == 'error') {\n return {\n text: error,\n btnText: \"Reconnect Wallet\",\n btnClick: async () => {\n console.log('click error')\n setError('')\n try {\n await disconnect()\n } catch (error: any) {\n console.error(error)\n }\n setVisible(true)\n },\n statusImage: walletErrorImage,\n isError: true\n }\n }\n if (status == 'nonce') {\n return {\n btnLoading: true,\n text: 'Connecting',\n statusImage: walletConnectingImage\n }\n }\n if (status == 'signer') {\n return {\n btnLoading: true,\n text: 'Signing',\n statusImage: walletSigningImage\n }\n }\n if (visible) {\n return {\n btnLoading: true,\n text: 'Connecting',\n statusImage: walletConnectingImage,\n }\n }\n\n return {\n btnText: 'Connect Wallet',\n btnClick: () => {\n setVisible(true)\n },\n text: 'Please Connect your wallet',\n statusImage: walletConnectImage\n }\n }, [visible, connected, status, error, address])\n return <div className=\"matchid-wallet-container\">\n <div className={`matchid-wallet-box`}>\n <div className={`matchid-wallet-content`}>\n <Lottie animationData={pageData.statusImage} style={{\n width: 128,\n height: 128\n }}/>\n <div className={pageData.isError ? 'matchid-error' : ''}>{pageData.text}</div>\n </div>\n <Button block size=\"lg\" onClick={pageData.btnClick} loading={pageData.btnLoading}\n disabled={pageData.btnDisabled}>\n {pageData.btnText}\n </Button>\n </div>\n </div>\n}\n\nexport function WalletModalContentV2(props: {\n status: string,\n error?: string,\n onError?: () => Promise<void>,\n onConnect?: () => Promise<void>,\n onSuccess?: () => Promise<void>,\n onDisconnect?: () => Promise<void>,\n\n}) {\n const [submitting, setSubmitting] = useState(false)\n const pageData: {\n btnText?: string,\n btnLoading?: boolean,\n btnDisabled?: boolean,\n btnClick?: () => Promise<void>\n statusImage: any\n text: string,\n } = useMemo(() => {\n const {status} = props\n if (status == 'success') {\n return {\n btnText: 'Disconnect Wallet',\n btnClick: async () => {\n setSubmitting(true)\n await props.onDisconnect?.()\n setSubmitting(false)\n },\n text: 'Wallet connection successful!',\n statusImage: walletConnectedImage,\n btnLoading: submitting\n }\n }\n if (status == 'error') {\n return {\n text: props.error || 'Unknown Error',\n btnText: \"Reconnect Wallet\",\n btnClick: async () => {\n setSubmitting(true)\n await props.onError?.()\n setSubmitting(false)\n },\n statusImage: walletErrorImage,\n isError: true,\n btnLoading: submitting\n }\n }\n if (status == 'nonce') {\n return {\n btnLoading: true,\n text: 'Connecting',\n statusImage: walletConnectingImage\n }\n }\n if (status == 'signer') {\n return {\n btnLoading: true,\n text: 'Signing',\n statusImage: walletSigningImage\n }\n }\n if (status == 'connecting') {\n return {\n btnLoading: true,\n text: 'Connecting',\n statusImage: walletConnectingImage,\n }\n }\n\n return {\n btnText: 'Connect Wallet',\n btnClick: async () => {\n setSubmitting(true)\n await props.onConnect?.()\n setSubmitting(false)\n },\n text: 'Please Connect your wallet',\n statusImage: walletConnectImage\n }\n }, [props, submitting])\n return <div className=\"matchid-wallet-container\">\n <div className={`matchid-wallet-box`}>\n <div className={`matchid-wallet-content`}>\n <Lottie animationData={pageData.statusImage} style={{\n width: 128,\n height: 128\n }}/>\n <div className={props.status=='error' ? 'matchid-error' : ''}>{pageData.text}</div>\n </div>\n <Button block size=\"lg\" onClick={pageData.btnClick} loading={pageData.btnLoading}\n disabled={pageData.btnDisabled}>\n {pageData.btnText}\n </Button>\n </div>\n </div>\n}","import { WalletStatusType } from \"types/types\"\nimport { useEffect, useRef, useState } from \"react\"\n\nexport default function useWalletBox({\n onInit\n }:{\n onInit:(data:{\n setStatus:(status:WalletStatusType)=>void,\n })=>void\n}) {\n const [status, setStateStatus] = useState<WalletStatusType>('start')\n const [error, setError] = useState('')\n const statusRef = useRef(status)\n const [nonce,setNonce] = useState<any>()\n\n const setStatus = (status: WalletStatusType) => {\n statusRef.current = status\n setStateStatus(status)\n }\n const init = ()=>{\n setError('')\n setNonce(null)\n }\n useEffect(()=>{\n init()\n\n onInit({\n setStatus\n })\n return ()=>{\n setStatus('start')\n setNonce(null)\n setError('')\n }\n },[])\n return {\n status,\n statusRef,\n setStatus,\n error,\n setError,\n nonce,\n setNonce,\n init\n }\n}","import * as React from 'react'\nimport { useWalletClient } from 'wagmi'\nimport { providers } from 'ethers'\nimport { Config, getConnectorClient } from '@wagmi/core'\nimport type { Account, Chain, Client, Transport } from 'viem'\n\nexport function walletClientToSigner(walletClient: any) {\n const { account, chain, transport } = walletClient\n const network = {\n chainId: chain?.id || 1,\n name: chain?.name,\n ensAddress: chain?.contracts?.ensRegistry?.address,\n }\n const provider = new providers.Web3Provider(transport, network)\n const signer = provider.getSigner(account.address)\n return signer\n}\n\n/** Hook to convert a viem Wallet Client to an ethers.js Signer. */\nexport function useEthersSigner({ chainId }: { chainId?: number } = {}) {\n const { data: walletClient } = useWalletClient({ chainId })\n return React.useMemo(\n () => (walletClient ? walletClientToSigner(walletClient) : undefined),\n [walletClient],\n )\n}\n\n\nexport function clientToSigner(client: Client<Transport, Chain, Account>) {\n const { account, chain, transport } = client\n const network = {\n chainId: chain.id,\n name: chain.name,\n ensAddress: chain.contracts?.ensRegistry?.address,\n }\n const provider = new providers.Web3Provider(transport, network)\n const signer = provider.getSigner(account.address)\n return signer\n}\n\n/** Action to convert a Viem Client to an ethers.js Signer. */\nexport async function getEthersSigner(\n config: any,\n { chainId }: { chainId?: number } = {},\n) {\n const client: any = await getConnectorClient(config, { chainId })\n return clientToSigner(client)\n}","import {BindWalletParam, ModalWithHeaderProps} from \"../../types/types\";\nimport {ModalWithHeader} from \"../../ui/Modal\";\nimport React, {useEffect, useMemo, useState} from \"react\";\nimport {getWalletInitApi, getWalletNonceApi, loginByWalletApi, toBindWalletApi} from \"../../api\";\nimport {isSuccess} from \"../../api/request\";\nimport matchlog from \"../../utils/matchlog\";\nimport {useMatch} from \"../../MatchContext\";\nimport eventManager from \"../../hooks/eventManager\";\nimport {useIntl} from \"react-intl\";\nimport WalletModalContent from \"../WalletModalContent\";\nimport {useTRONWallet} from \"../../hooks/useTRONWallet\";\nimport {RecommendItem} from \"../LoginBox\";\nimport {BitgetIcon, OKXIcon, TronLinkIcon} from \"../../assets/icon\";\nimport {useDownMd} from \"../../hooks/useLayout\";\nimport {Button} from \"../index\";\ntype TRONConnectModalProps = ModalWithHeaderProps & {\n type?: 'login' | 'bind' | ''\n onSuccess?: () => void\n}\nfunction TRONConnectModal({\n type = 'login',\n onSuccess,\n ...props\n }:TRONConnectModalProps) {\n const isDownMd = useDownMd()\n const intl = useIntl()\n const {wallets, installedWallets, chooseWallet, wallet, address, onConnect} = useTRONWallet()\n const iconMaps = {\n tronlink: <TronLinkIcon size={isDownMd ? 36 : 40}/>,\n bitget: <BitgetIcon size={isDownMd ? 36 : 40}/>,\n okx:<OKXIcon size={isDownMd ? 36 : 40}/>\n }\n\n const {events, login} = useMatch()\n const [status, setStatus] = useState<'' | 'nonce' | 'signer' | 'success' | 'error'>('')\n const statusRef = React.useRef(status)\n const [error, setError] = useState('')\n const connected = useMemo(() => {\n return !!address\n }, [address])\n const disconnect = async () => {\n setStatus('')\n chooseWallet(null)\n statusRef.current = ''\n setError('')\n }\n\n const onBack = ()=>{\n setStatus('')\n chooseWallet(null)\n statusRef.current = ''\n setError('')\n }\n\n const toLoginInWallet = async () => {\n if (statusRef.current || !address || !wallet) return\n try {\n setStatus('nonce')\n statusRef.current = 'nonce'\n const res = type == 'bind' ? await getWalletInitApi({address,type:\"TRON\"}) : await getWalletNonceApi({address,type:\"TRON\"});\n if (!isSuccess(res)) {\n throw new Error(res.message)\n }\n const nonce = res.code >= 0 ? res.data.nonce : null;\n if (nonce) {\n setStatus('signer')\n statusRef.current = 'signer'\n const message = \"By signing, you are proving you own this wallet and logging in. This does not initiate a transaction or cost any fees.Nonce:\" + res.data.nonce;\n const signedMessage = await wallet.signMessage(message);\n let obj: BindWalletParam = {\n type: 'TRON',\n address: address,\n signature: signedMessage,\n message: message,\n connector_type: 'TRON',\n wallet_client_type: wallet.walletKey\n }\n const res1 = type == 'bind' ? await toBindWalletApi(obj) : await loginByWalletApi(obj)\n if (res1) {\n if (!isSuccess(res1)) {\n throw new Error(res1.message)\n }\n matchlog.log(res1)\n setStatus('success')\n statusRef.current = 'success'\n if (type == 'bind') {\n events!.onBind && events!.onBind({\n type: 'tron'\n })\n eventManager.emit('onBind', {\n type: 'tron'\n })\n } else {\n await login({\n // mid: res1.data.mid,\n token: `${res1.data.token_type} ${res1.data.access_token}`\n })\n }\n onSuccess && onSuccess()\n }\n }\n } catch (error: any) {\n // toast.error(error.message)\n // disconnect()\n setStatus('error')\n setError(error.message)\n statusRef.current = ''\n }\n }\n\n useEffect(() => {\n if (wallet) {\n console.log('onConnect')\n onConnect()\n } else {\n setStatus('')\n }\n }, [wallet]);\n\n useEffect(() => {\n if (address) {\n toLoginInWallet()\n }\n }, [address]);\n\n useEffect(() => {\n if (!props.isOpen) {\n disconnect()\n }\n }, [props.isOpen]);\n\n return <ModalWithHeader {...props} title={props.title || (intl.formatMessage({\n id: type == \"bind\" ? \"bindWith\" : \"loginWith\"\n }, {\n name: \"TRON\"\n }))} onBack={wallet ? onBack : undefined}>\n {\n wallet ? <WalletModalContent error={error} setError={setError} status={status} disconnect={disconnect}\n address={address || ''} connected={connected} visible setVisible={() => {\n }}/> : <div className=\"matchid-login-box\">\n <div className=\"matchid-login-recommend-list\">\n {\n installedWallets.map(wallet => {\n return <RecommendItem\n key={wallet.walletKey}\n icon={iconMaps[wallet.walletKey as keyof typeof iconMaps]}\n name={wallet.name} onClick={() => {\n chooseWallet(wallet)\n }}/>\n })\n }\n {\n wallets.filter(wallet => !installedWallets.find(installedWallet => installedWallet.walletKey == wallet.walletKey)).map(wallet => {\n return <RecommendItem key={wallet.walletKey}\n icon={iconMaps[wallet.walletKey as keyof typeof iconMaps]}\n name={wallet.name} onClick={() => {\n }}\n footer={<Button size=\"sm\" onClick={() => {\n window.open(wallet.website)\n }}>Install</Button>}/>\n })\n }\n\n\n </div>\n </div>\n }\n </ModalWithHeader>\n}\n\nexport default function TRONModal(props: TRONConnectModalProps) {\n return props.isOpen&&<TRONConnectModal {...props} type={props.type}/>\n}","import {TRONWalletAdapter} from \"../lib/WalletAdapter\";\nimport {TronLinkAdapter} from \"../lib/tron/TronLinkAdapter\";\nimport {useEffect, useState} from \"react\";\nimport {BitgetAdapter} from \"../lib/tron/BitgetAdapter\";\nimport {OKXAdapter} from \"../lib/tron/OKXAdapter\";\n\nexport const useTRONWallet = () => {\n\n const wallets: TRONWalletAdapter[] = [new TronLinkAdapter(), new BitgetAdapter(),new OKXAdapter()];\n const [installedWallets, setInstalledWallets] = useState<TRONWalletAdapter[]>([]);\n const [address, setAddress] = useState<string | null>(null);\n useEffect(() => {\n const getInstalled = async () => {\n const installed = await Promise.all(wallets.map(wallet => wallet.isInstalled().then(isInstalled => ({\n wallet,\n isInstalled\n }))));\n setInstalledWallets(installed.filter(({isInstalled}) => isInstalled).map(({wallet}) => wallet));\n };\n // console.log('getInstalled');\n getInstalled();\n }, []);\n\n const [wallet, chooseWallet] = useState<TRONWalletAdapter | null>(null);\n\n const onConnect = async () => {\n setAddress(await wallet!.connect());\n }\n useEffect(() => {\n\n if (!wallet) {\n setAddress(null)\n }\n }, [wallet]);\n\n return {\n installedWallets,\n wallets,\n chooseWallet,\n wallet,\n address,\n onConnect\n\n }\n\n}","import {BindWalletParam, ModalWithHeaderProps} from \"../../types/types\";\nimport {ModalWithHeader} from \"../../ui/Modal\";\nimport React, {useEffect, useState} from \"react\";\nimport {getWalletInitApi, getWalletNonceApi, loginByWalletApi, toBindWalletApi} from \"../../api\";\nimport {isSuccess} from \"../../api/request\";\nimport matchlog from \"../../utils/matchlog\";\nimport {useMatch} from \"../../MatchContext\";\nimport eventManager from \"../../hooks/eventManager\";\nimport {useIntl} from \"react-intl\";\nimport WalletModalContent from \"../WalletModalContent\";\nimport {\n TonConnectUIProvider,\n useTonAddress,\n useTonConnectModal,\n useTonConnectUI,\n useTonWallet,\n} from '@tonconnect/ui-react';\nimport useLocalStore from \"../../store/useLocalStore\";\n\nfunction WalletContent({\n onSuccess,\n type,\n }: {\n onSuccess?: () => void\n type: 'login' | 'bind' | ''\n}) {\n const {events, login} = useMatch()\n const [connected, setConnected] = useState(false);\n const wallet = useTonWallet();\n const userFriendlyAddress = useTonAddress();\n const [tonConnectUI] = useTonConnectUI();\n const {state, open, close} = useTonConnectModal();\n const [status, setStatus] = useState<'' | 'nonce' | 'signer' | 'success' | 'error'>('')\n const statusRef = React.useRef(status)\n const [error, setError] = useState('')\n\n\n useEffect(() => {\n const init = async () => {\n if (tonConnectUI.connected) {\n await tonConnectUI.disconnect();\n }\n open()\n };\n init();\n tonConnectUI.onStatusChange(wallet => {\n matchlog.log('onStatusChange:', wallet, wallet?.connectItems?.tonProof, JSON.stringify(wallet?.connectItems?.tonProof));\n if (wallet?.connectItems?.tonProof && 'proof' in wallet!.connectItems.tonProof) {\n matchlog.log(wallet?.connectItems.tonProof.proof, wallet?.account);\n const toLoginInWallet = async () => {\n if (statusRef.current || !wallet) return\n setStatus('signer')\n statusRef.current = 'signer'\n try {\n const signature = {\n \"address\": wallet?.account?.address,\n \"network\": wallet?.account?.chain,\n \"public_key\": wallet?.account?.publicKey,\n \"proof\": {\n //@ts-ignore\n ...wallet?.connectItems?.tonProof?.proof,\n \"state_init\": wallet?.account?.walletStateInit\n }\n }\n let obj: BindWalletParam = {\n type: 'TON',\n address: wallet?.account?.publicKey as string,\n signature: JSON.stringify(signature),\n //@ts-ignore\n message:wallet?.connectItems?.tonProof?.proof.payload,\n connector_type: \"TON\",\n wallet_client_type: wallet?.name\n }\n console.log('signature', {\n signature,\n obj\n })\n\n const res1 = type == 'bind' ? await toBindWalletApi(obj) : await loginByWalletApi(obj)\n if (res1) {\n if (!isSuccess(res1)) {\n throw new Error(res1.message)\n }\n matchlog.log(res1)\n setStatus('success')\n statusRef.current = 'success'\n if (type == 'bind') {\n events!.onBind && events!.onBind({\n type: 'ton'\n })\n eventManager.emit('onBind', {\n type: 'ton'\n })\n } else {\n await login({\n // mid: res1.data.mid,\n token: `${res1.data.token_type} ${res1.data.access_token}`\n })\n }\n onSuccess && onSuccess()\n }\n\n } catch (error: any) {\n // toast.error(error.message)\n // disconnect()\n setStatus('error')\n setError(error.message)\n statusRef.current = ''\n }\n }\n toLoginInWallet()\n }\n })\n }, []);\n useEffect(() => {\n if (wallet) {\n setConnected(true);\n console.log('Wallet connected:', wallet);\n } else {\n setConnected(false);\n open()\n statusRef.current = ''\n setStatus('')\n }\n }, [wallet]);\n\n useEffect(() => {\n console.log({\n state,\n wallet\n })\n if (state.status=='opened') {\n const init = async () => {\n tonConnectUI.setConnectRequestParameters({state: 'loading'});\n const res = type == 'bind' ? await getWalletInitApi({\n address: \"tonconnect\",\n type: \"TON\"\n }) : await getWalletNonceApi({address: \"tonconnect\", type: \"TON\"});\n if (!isSuccess(res)) {\n tonConnectUI.setConnectRequestParameters(null);\n throw new Error(res.message)\n }\n tonConnectUI.setConnectRequestParameters({\n state: \"ready\",\n value: {tonProof: res.data.nonce}\n });\n };\n init();\n }else{\n if(!wallet){\n setStatus('')\n statusRef.current = ''\n }\n }\n }, [state]);\n\n\n return <WalletModalContent\n connected={connected}\n disconnect={tonConnectUI.disconnect}\n address={userFriendlyAddress}\n visible={state.status=='opened'}\n setVisible={async(v)=>{\n console.log('setVisible',v)\n\n if(v){\n if (tonConnectUI.connected) {\n await tonConnectUI.disconnect();\n }\n setStatus('')\n statusRef.current = ''\n open()\n }else{\n close()\n }\n }}\n error={error}\n setError={setError}\n status={status}\n />\n}\ntype TonModalProps = ModalWithHeaderProps & {\n type?: 'login' | 'bind' | ''\n onSuccess?: () => void\n}\nfunction TONConnectModal({\n type = 'login',\n onSuccess,\n ...props\n }: TonModalProps) {\n const intl = useIntl()\n const {endpoints, appid} = useLocalStore()\n const manifestUrl = `${endpoints.back}api/v1/wallet/ton?appid=${appid}&url=` + encodeURIComponent(window.location.origin)\n return <ModalWithHeader {...props} title={props.title || (intl.formatMessage({\n id: type == \"bind\" ? \"bindWith\" : \"loginWith\"\n }, {\n name: \"TON\"\n }))}>\n\n <TonConnectUIProvider\n manifestUrl={manifestUrl}>\n <WalletContent onSuccess={onSuccess} type={type}/>\n </TonConnectUIProvider>\n </ModalWithHeader>\n}\nexport default function TONModal(props: TonModalProps) {\n return props.isOpen && <TONConnectModal {...props}/>\n}","import {BindWalletParam, ModalWithHeaderProps} from \"../../types/types\";\nimport {ModalWithHeader} from \"../../ui/Modal\";\nimport React, {useEffect, useMemo, useState} from \"react\";\nimport {getWalletInitApi, getWalletNonceApi, loginByWalletApi, toBindWalletApi} from \"../../api\";\nimport {isSuccess} from \"../../api/request\";\nimport matchlog from \"../../utils/matchlog\";\nimport {useMatch} from \"../../MatchContext\";\nimport eventManager from \"../../hooks/eventManager\";\nimport {useIntl} from \"react-intl\";\nimport WalletModalContent from \"../WalletModalContent\";\nimport {useBTCWallet} from \"../../hooks/useBTCWallet\";\nimport {RecommendItem} from \"../LoginBox\";\nimport {LeatherIcon, PhantomIcon, UnisatIcon, XverseIcon} from \"../../assets/icon\";\nimport {useDownMd} from \"../../hooks/useLayout\";\nimport {Button} from \"../index\";\ntype BTCConnectModalProps = ModalWithHeaderProps & {\n type?: 'login' | 'bind' | ''\n onSuccess?: () => void\n}\nfunction BTCConnectModal({\n type = 'login',\n onSuccess,\n ...props\n }: BTCConnectModalProps) {\n const isDownMd = useDownMd()\n const intl = useIntl()\n const {wallets, installedWallets, chooseWallet, wallet, address, onConnect} = useBTCWallet()\n const iconMaps = {\n leather: <LeatherIcon size={isDownMd ? 36 : 40}/>,\n unisat: <UnisatIcon size={isDownMd ? 36 : 40}/>,\n xverse: <XverseIcon size={isDownMd ? 36 : 40}/>,\n phantom:<PhantomIcon size={isDownMd ? 36 : 40}/>,\n }\n\n const {events, login} = useMatch()\n const [status, setStatus] = useState<'' | 'nonce' | 'signer' | 'success' | 'error'>('')\n const statusRef = React.useRef(status)\n const [error, setError] = useState('')\n const connected = useMemo(() => {\n return !!address\n }, [address])\n const disconnect = async () => {\n wallet&& wallet.disconnet &&wallet!.disconnet!()\n setStatus('')\n chooseWallet(null)\n statusRef.current = ''\n setError('')\n }\n\n const toLoginInWallet = async () => {\n if (statusRef.current || !address || !wallet) return\n try {\n setStatus('nonce')\n statusRef.current = 'nonce'\n const res = type == 'bind' ? await getWalletInitApi({address,type:\"BTC\"}) : await getWalletNonceApi({address,type:\"BTC\"});\n if (!isSuccess(res)) {\n throw new Error(res.message)\n }\n const nonce = res.code >= 0 ? res.data.nonce : null;\n if (nonce) {\n setStatus('signer')\n statusRef.current = 'signer'\n const message = \"By signing, you are proving you own this wallet and logging in. This does not initiate a transaction or cost any fees.Nonce:\" + res.data.nonce;\n const signedMessage = await wallet.signMessage(message);\n let obj: BindWalletParam = {\n type: 'BTC',\n address: address,\n signature: signedMessage,\n message: message,\n connector_type: 'BTC',\n wallet_client_type: wallet.walletKey\n }\n const res1 = type == 'bind' ? await toBindWalletApi(obj) : await loginByWalletApi(obj)\n if (res1) {\n if (!isSuccess(res1)) {\n throw new Error(res1.message)\n }\n matchlog.log(res1)\n setStatus('success')\n statusRef.current = 'success'\n if (type == 'bind') {\n events!.onBind && events!.onBind({\n type: 'btc'\n })\n eventManager.emit('onBind', {\n type: 'btc'\n })\n } else {\n await login({\n // mid: res1.data.mid,\n token: `${res1.data.token_type} ${res1.data.access_token}`\n })\n }\n onSuccess && onSuccess()\n }\n }\n } catch (error: any) {\n // toast.error(error.message)\n // disconnect()\n console.error('btc error',error)\n setStatus('error')\n setError(error.message)\n statusRef.current = ''\n }\n }\n\n useEffect(() => {\n if (wallet) {\n console.log('onConnect')\n try{\n onConnect()\n }catch(err:any){\n setStatus('error')\n setError(err.message)\n }\n } else {\n setStatus('')\n }\n }, [wallet]);\n\n useEffect(() => {\n if (address) {\n toLoginInWallet()\n }\n }, [address]);\n\n useEffect(() => {\n if (!props.isOpen) {\n disconnect()\n }\n }, [props.isOpen]);\n\n const onBack = ()=>{\n wallet&& wallet.disconnet &&wallet!.disconnet!()\n setStatus('')\n chooseWallet(null)\n statusRef.current = ''\n setError('')\n }\n\n return <ModalWithHeader {...props} title={props.title || (intl.formatMessage({\n id: type == \"bind\" ? \"bindWith\" : \"loginWith\"\n }, {\n name: \"BTC\"\n }))} onBack={wallet ? onBack: undefined}>\n {\n wallet ? <WalletModalContent error={error} setError={setError} status={status} disconnect={disconnect}\n address={address || ''} connected={connected} visible setVisible={() => {\n }}/> : <div className=\"matchid-login-box\">\n <div className=\"matchid-login-recommend-list\">\n {\n installedWallets.map(wallet => {\n return <RecommendItem\n key={wallet.walletKey}\n icon={iconMaps[wallet.walletKey as keyof typeof iconMaps]}\n name={wallet.name} onClick={() => {\n chooseWallet(wallet)\n }}/>\n })\n }\n {\n wallets.filter(wallet => !installedWallets.find(installedWallet => installedWallet.walletKey == wallet.walletKey)).map(wallet => {\n return <RecommendItem key={wallet.walletKey}\n icon={iconMaps[wallet.walletKey as keyof typeof iconMaps]}\n name={wallet.name} onClick={() => {\n }}\n footer={<Button size=\"sm\" onClick={() => {\n window.open(wallet.website)\n }}>Install</Button>}/>\n })\n }\n\n\n </div>\n </div>\n }\n </ModalWithHeader>\n}\n\nexport default function BTCModal(props: BTCConnectModalProps) {\n return props.isOpen && <BTCConnectModal {...props}/>\n}","import {BTCWalletAdapter} from \"../WalletAdapter\";\nimport {\n AddressPurpose,\n BitcoinNetworkType, Capability,\n getCapabilities,\n signMessage,\n request,\n} from \"sats-connect\";\nimport matchlog from \"../../utils/matchlog\";\n\nexport class XverseAdapter implements BTCWalletAdapter {\n name = \"Xverse Wallet\";\n website = \"https://www.xverse.app/\"\n capabilities: Set<Capability> | null = null;\n address = '';\n network = BitcoinNetworkType.Mainnet;\n walletKey = \"xverse\"\n\n async isInstalled() {\n return new Promise<boolean>(async (resolve) => {\n try {\n await getCapabilities({\n onFinish: (response: any) => {\n matchlog.log(response)\n this.capabilities = (new Set(response));\n resolve(true);\n },\n onCancel() {\n },\n payload: {\n network: {\n type: this.network\n },\n },\n });\n } catch (err) {\n matchlog.error(err)\n resolve(false);\n }\n\n\n });\n }\n\n async connect(): Promise<string> {\n if (!await this.isInstalled()) throw new Error(\"Xverse Wallet is not installed\");\n const response = await request('getAccounts', {\n purposes: [AddressPurpose.Ordinals],\n message: 'SATS Connect Demo',\n });\n matchlog.log(\"getAccounts ~ response:\", response)\n if (response.status === 'success') {\n const ordinalsAddressItem = response.result.find(\n (address) => address.purpose === AddressPurpose.Ordinals\n );\n this.address = ordinalsAddressItem?.address || '';\n return ordinalsAddressItem?.address || '';\n\n } else {\n if (response.error) {\n console.error(response.error)\n throw new Error(\"Error getting accounts. Check console for error logs\");\n }\n throw new Error(\"Error getting accounts\");\n }\n }\n\n async signMessage(message: string): Promise<string> {\n if (!await this.isInstalled()) throw new Error(\"Xverse Wallet is not installed\");\n return new Promise<string>(async (resolve, reject) => {\n await signMessage({\n payload: {\n network: {\n type: this.network,\n },\n address: this.address,\n message,\n },\n onFinish: (response) => {\n resolve(response);\n },\n onCancel: () => {\n reject(\"User cancelled\")\n }\n });\n\n });\n }\n\n async disconnet(): Promise<void> {\n if (!await this.isInstalled()) throw new Error(\"Xverse Wallet is not installed\");\n await request('wallet_disconnect', null);\n }\n}\n","import {BTCWalletAdapter} from \"../lib/WalletAdapter\";\nimport {UnisatAdapter} from \"../lib/btc/UnisatAdapter\";\nimport {XverseAdapter} from \"../lib/btc/XverseAdapter\";\nimport {LeatherAdapter} from \"../lib/btc/LeatherAdapter\";\nimport {useEffect, useState} from \"react\";\nimport {PhantomAdapter} from \"../lib/btc/PhantomAdapter\";\n\nexport const useBTCWallet = () => {\n\n const wallets: BTCWalletAdapter[] = [new UnisatAdapter(), new XverseAdapter(), new LeatherAdapter(),new PhantomAdapter()];\n const [installedWallets, setInstalledWallets] = useState<BTCWalletAdapter[]>([]);\n const [address, setAddress] = useState<string | null>(null);\n useEffect(() => {\n const getInstalled = async () => {\n const installed = await Promise.all(wallets.map(wallet => wallet.isInstalled().then(isInstalled => ({\n wallet,\n isInstalled\n }))));\n setInstalledWallets(installed.filter(({isInstalled}) => isInstalled).map(({wallet}) => wallet));\n };\n // console.log('getInstalled');\n getInstalled();\n }, []);\n\n const [wallet, chooseWallet] = useState<BTCWalletAdapter | null>(null);\n\n const onConnect = async () => {\n setAddress(await wallet!.connect());\n }\n useEffect(() => {\n\n if (!wallet) {\n setAddress(null)\n }\n }, [wallet]);\n\n return {\n installedWallets,\n wallets,\n chooseWallet,\n wallet,\n address,\n onConnect\n\n }\n\n}","import {ModalWithHeader} from \"../../ui/Modal\";\nimport React, {useMemo} from \"react\";\nimport {ModalWithHeaderProps, WalletType} from \"../../types\";\nimport {useIntl} from \"react-intl\";\nimport {DEFAULT_WALLET_METHODS, useWalletConfig, WALLET_METHODS} from \"../../hooks/useConfig\";\nimport {RecommendItem} from \"../LoginBox\";\nimport {useUserInfo} from \"../../hooks\";\nimport useAppConfig from \"../../hooks/useAppConfig\";\n\ntype WalletModalProps = ModalWithHeaderProps & {\n type?: 'login' | 'bind' | ''\n methods?: WalletType[]\n}\n\nfunction WalletConnectModal({\n type,\n methods: _methods,\n ...props\n }: WalletModalProps) {\n const intl = useIntl()\n const {walletMap} = useWalletConfig()\n const {bind, login} = useUserInfo()\n const config = useAppConfig()\n const methods = useMemo(() => {\n if (_methods) return _methods\n if (!config.platform) {\n return []\n }\n const platform = config.platform.map(p => p.toLowerCase())\n return WALLET_METHODS.filter(m => platform.includes(m))\n }, [config.platform, _methods])\n return <ModalWithHeader {...props} title={props.title || (intl.formatMessage({\n id: type == \"bind\" ? \"bindWith\" : \"loginWith\"\n }, {\n name: \"\"\n }))}>\n <div className=\"matchid-login-box\">\n <div className=\"matchid-login-recommend-list\">\n {\n methods.map((method, index) => {\n const m = walletMap[method]\n return <RecommendItem\n icon={m?.icon}\n name={m?.name}\n onClick={() => {\n type == 'bind' ? bind(method) : login(method)\n }\n }\n key={method}\n />\n })\n }\n </div>\n </div>\n </ModalWithHeader>\n}\n\nexport default function WalletModal(props: WalletModalProps) {\n return props.isOpen && <WalletConnectModal {...props}/>\n}","import {useEffect, useState} from \"react\";\n\nexport default function AlphaAvatar({name, size = 40, className = ''}: {\n name: string,\n size?: number,\n className?: string\n}) {\n const [avatar, setAvatar] = useState<string | undefined>(undefined)\n useEffect(() => {\n if (name) {\n const char = name[0].toUpperCase()\n // if (char.match(/[a-zA-Z]/)) {\n setAvatar(char)\n // }\n }\n }, [name])\n return <div className={`matchid-alpha-avatar ${className}`} style={{\n width: size,\n height: size,\n fontSize: Math.ceil(size / 2)\n }}>\n {avatar}\n </div>\n}","import {useMatchChain, useMatchWalletAssetList, useMatchWalletAssets} from \"hooks\";\nimport AlphaAvatar from \"../AlphaAvatar\";\nimport {NumberFormatter} from \"../../utils\";\nimport {useMatchWalletAssetsProps, WalletAssetMergeType} from \"../../types\";\n\nexport default function WalletAsset({\n onAssetClick,\n matchWalletAssetsOptions\n }: {\n onAssetClick?: (asset: WalletAssetMergeType) => () => void\n matchWalletAssetsOptions?: useMatchWalletAssetsProps\n}) {\n const walletAssets = useMatchWalletAssets(matchWalletAssetsOptions)\n const matchWalletAssetList = useMatchWalletAssetList({\n list: walletAssets.mergedAssets\n })\n const {list} = useMatchChain()\n return (\n <div className={\"matchid-wallet-asset-list\"}>\n {\n matchWalletAssetList.list.map((n, index) => {\n const clickFunc = onAssetClick && onAssetClick(n)\n const chain = list?.find((m) => m.id.toString() === n.chain_id)\n const getFooterColor = () => {\n if (!n.price_change_24h) {\n return ''\n }\n if (n.price_change_24h > 0) {\n return 'matchid-wallet-asset-up'\n }\n if (n.price_change_24h < 0) {\n return 'matchid-wallet-asset-down'\n }\n return ''\n }\n return <div className={`matchid-wallet-asset-item`} onClick={clickFunc} style={{\n cursor: clickFunc ? 'pointer' : 'default'\n }} key={index}>\n <div className={\"matchid-wallet-asset-logo\"} title={n.symbol || n.name || ''}>\n {n.icon ? <img src={n.icon} alt={n.symbol} className={`matchid-wallet-asset-icon`}/> :\n <AlphaAvatar className={`matchid-wallet-asset-icon`} size={40}\n name={n.symbol || n.name || ''}/>}\n {chain?.iconUrl &&\n <img src={chain.iconUrl} alt={chain.name} className={`matchid-wallet-asset-chain`}/>}\n </div>\n <div className={`matchid-wallet-asset-info`}>\n <div className={`matchid-wallet-asset-name`}>{n.symbol}</div>\n {\n ('price' in n) && <div className={`matchid-wallet-asset-content`}>\n <div className={\"matchid-wallet-asset-price\"}><NumberFormatter value={n.price}\n prefix={\"$ \"}\n tFixNum={2}/></div>\n\n <div className={\"matchid-wallet-asset-value\"}><NumberFormatter value={n.value}\n prefix={\"$ \"}\n tFixNum={2}/></div>\n </div>\n }\n\n <div className={`matchid-wallet-asset-footer`}>\n <div className={`matchid-wallet-asset-balance`}><NumberFormatter value={n.balance}\n tFixNum={3}/></div>\n {'price_change_24h' in n &&\n <div className={`matchid-wallet-asset-change ${getFooterColor()}`}><NumberFormatter\n prefix={`${(n?.price_change_24h || 0) < 0 ? '-' : '+'} `}\n value={Math.abs(n.price_change_24h || 0)} suffix={\"%\"} tFixNum={3}/></div>}\n\n </div>\n </div>\n </div>\n })\n }\n </div>\n )\n}","import {Address, WalletAssetMergeType} from \"types/types\";\nimport {AlphaAvatar, Button, ModalDrawer} from \"../../ui\";\nimport {useMatchChain, useWallet} from \"hooks\";\nimport {useEffect, useMemo, useState} from \"react\";\nimport {NumberFormatter} from \"../../utils\";\nimport {TransferIcon} from \"../../assets/icon\";\nimport {defineChain, encodeFunctionData, erc20Abi, http, parseUnits} from \"viem\";\nimport {NATIVE_TOKEN_ADDRESS} from \"../../config\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nfunction Input({\n onChange,\n placeholder,\n value,\n maxLength,\n type,\n error,\n size = \"df\"\n }: {\n onChange: (e: any) => void\n placeholder: string\n value: string\n maxLength: number\n type: string\n error: string\n size?: \"sm\" | \"df\"\n}) {\n return <div className={`matchid-token-input-box ${\"matchid-token-input-\" + size}`}>\n <input placeholder={placeholder} onChange={onChange} maxLength={maxLength} type={type} value={value}\n className={`matchid-token-input ${error ? 'matchid-token-input-error' : ''}`}/>\n {error && <div className={\"matchid-token-input-error-text\"}>{error}</div>}\n </div>\n}\n\nexport default function TokenSend({\n onClose,\n zIndex,\n token,\n onBack\n }: {\n onBack: () => void\n onClose: () => void\n zIndex: number\n token: WalletAssetMergeType\n}) {\n const {list: chainList} = useMatchChain()\n const intl = useIntl()\n const {createWalletClient} = useWallet()\n const isNative = token.address.toLowerCase() == NATIVE_TOKEN_ADDRESS\n const chain = useMemo(() => {\n return chainList?.find((m) => m.id.toString() === token.chain_id)\n }, [chainList, token.chain_id])\n const walletClient = useMemo(() => {\n return createWalletClient({\n // @ts-ignore\n chain: defineChain(chain),\n transport: http()\n })\n }, [chain])\n\n const [amount, setAmount] = useState('')\n const [address, setAddress] = useState('')\n const [loading, setLoading] = useState(false)\n const [sending, setSending] = useState(false)\n\n const [txError, setTxError] = useState('')\n const transaction = useMemo(() => {\n const reg = /^0x[a-fA-F0-9]{40}$/\n if(!amount || !address || !reg.test(address)){\n return\n }\n //@ts-ignore\n const viemChain = defineChain(chain)\n const to = isNative ? address as `0x${string}` : token.address\n const value = isNative ? parseUnits(amount, parseInt(token?.decimals || \"18\")) : BigInt(0)\n const data = isNative ? \"0x\" : encodeFunctionData({\n abi:erc20Abi,\n functionName: 'transfer',\n args: [address as Address, parseUnits(amount, parseInt(token?.decimals || \"18\"))]\n })\n return {\n to:to as `0x${string}`,\n value,\n data,\n chain: viemChain\n }\n }, [amount, address])\n const onCal = async () => {\n try {\n setLoading(true)\n // @ts-ignore\n await walletClient?.prepareTransactionRequest(transaction)\n } catch (error: any) {\n console.error(error)\n setTxError(error.details || error.message)\n } finally {\n setLoading(false)\n }\n }\n\n const error = useMemo(() => {\n setTxError('')\n let amountError = ''\n let addressError = ''\n\n if (amount) {\n if (parseFloat(amount) <= 0) {\n amountError = intl.formatMessage({\n id:\"tokenAmountMin\"\n })\n } else if ('balance' in token && parseFloat(amount) > (token.balance || 0)) {\n amountError = intl.formatMessage({\n id:\"tokenAmountMax\"\n })\n }\n }\n\n if (address) {\n if (address.length < 42) {\n addressError = intl.formatMessage({\n id:\"tokenAddressError\"\n })\n } else {\n const reg = /^0x[a-fA-F0-9]{40}$/\n if (!reg.test(address)) {\n addressError = intl.formatMessage({\n id:\"tokenAddressError\"\n })\n }\n }\n }\n if (amount && address && !amountError && !addressError && walletClient) {\n onCal()\n }\n\n return {\n amount: amountError,\n address: addressError,\n }\n }, [amount, token, chain, address,walletClient])\n\n const onChangeAmount = (e: any) => {\n const value = e.target.value\n if (value.match(/^\\d*\\.?\\d*$/)) {\n setAmount(value)\n }\n }\n\n const canSend = useMemo(() => {\n return !error.amount && !error.address && amount && address\n }, [error])\n\n const onNext = async () => {\n setSending(true)\n if(transaction){\n await walletClient?.sendTransaction(transaction)\n }\n onClose()\n\n }\n\n useEffect(() => {\n const receiveMessage = (event: any) => {\n if(event.data){\n if(event.data.source==\"match-wallet\"){\n if(event.data.method==\"sendTransaction\" && event.data.messageId==\"openIframe\"){\n onBack()\n setSending(false)\n }\n }\n }\n }\n window.addEventListener('message', receiveMessage)\n return () => {\n window.removeEventListener('message', receiveMessage)\n }\n }, []);\n return <ModalDrawer isOpen onClose={onClose} zIndex={zIndex} title={<FormattedMessage id={\"send\"}/>} onBack={onBack}>\n <div className={`matchid-token-send-box`}>\n <div className={\"matchid-token-send-content\"}>\n <div className={`matchid-token-amount-content`}>\n <div className={`matchid-token-amount-header`}>\n <div className={`matchid-token-amount-title`}><FormattedMessage id={\"amount\"}/></div>\n <div className={`matchid-token-amount-chain`}>\n {token.icon ? <img src={token?.icon} alt={token?.symbol}\n className={`matchid-token-amount-chain-icon`}/> :\n <AlphaAvatar name={token.symbol||token.name||''} size={16}/>}\n <span>{token?.symbol}</span>\n </div>\n </div>\n <Input\n type={\"text\"}\n onChange={onChangeAmount}\n placeholder={intl.formatMessage({\n id:\"amountPlaceholder\"\n })}\n value={amount}\n maxLength={40}\n error={error.amount || txError}\n />\n <div className={`matchid-token-amount-footer`}>\n <div className={`matchid-token-amount-title`}><FormattedMessage id={\"balance\"}/>:</div>\n <div className={`matchid-token-amount-value`}>\n <NumberFormatter value={token.balance} tFixNum={10} suffix={\" \" + token.symbol}/>\n </div>\n </div>\n <TransferIcon className={\"matchid-token-amount-transfer\"}/>\n </div>\n\n <div className={`matchid-token-address-content`}>\n <div className={`matchid-token-address-header`}>\n <div className={`matchid-token-address-title`}><FormattedMessage id={\"receiveTitle\"}/></div>\n </div>\n <Input\n type={\"text\"}\n size={\"sm\"}\n onChange={(e) => setAddress(e.target.value)}\n placeholder={intl.formatMessage({\n id:\"receivePlaceholder\"\n })}\n value={address}\n maxLength={42}\n error={error.address}\n />\n </div>\n </div>\n <Button size={\"lg\"} block highlight disabled={!canSend || !!txError} onClick={onNext}\n loading={loading||sending}><FormattedMessage id={\"next\"}/></Button>\n </div>\n </ModalDrawer>\n}","import {ModalDrawer} from \"../../ui\";\nimport {WalletAssetMergeType} from \"../../types\";\nimport {useMatchChain, useModal} from \"../../hooks\";\nimport {AlphaAvatar} from \"ui\";\nimport {Button} from \"../index\";\nimport TokenSend from \"../TokenSend\";\nimport {NATIVE_TOKEN_ADDRESS} from \"../../config\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport {NumberFormatter} from \"../../utils\";\n\nexport default function TokenDetail({\n onClose,\n token\n }:{\n onClose:()=>void\n token:WalletAssetMergeType\n}){\n const {list:chainList} = useMatchChain()\n const modal = useModal()\n const chain = chainList?.find((m)=>m.id.toString() === token.chain_id)\n const onSend = ()=>{\n modal.show((props)=>{\n return <TokenSend onClose={()=>{\n props.close()\n onClose()\n }} onBack={props.close} zIndex={props.zIndex} token={token}/>\n })\n }\n const intl = useIntl()\n return <ModalDrawer isOpen title={intl.formatMessage({\n id: \"tokenDetails\"\n })} onClose={onClose}>\n <div className={`matchid-token-detail`}>\n <div className={`matchid-token-main`}>\n <div className={`matchid-token-info`}>\n <div className={`matchid-token-logo`}>\n {token.icon ? <img src={token.icon} alt={token.symbol} className={`matchid-token-icon`}/> :\n <AlphaAvatar className={`matchid-token-icon`} size={48} name={token.symbol||token.name||''}/>}\n {chain?.iconUrl &&\n <img src={chain.iconUrl} alt={chain.name} className={`matchid-token-chain`}/>}\n </div>\n <div className={`matchid-token-name`}><NumberFormatter value={token.balance} tFixNum={10}/> {token.symbol}</div>\n </div>\n {token.address.toLowerCase()!=NATIVE_TOKEN_ADDRESS && <div className={`matchid-token-contract`}>\n <div className={\"matchid-token-contract-title\"}>Contract address</div>\n <div className={\"matchid-token-contract-address\"}>{token.address}</div>\n </div>}\n </div>\n <Button size={\"lg\"} block highlight onClick={onSend}><FormattedMessage id={\"send\"}/></Button>\n </div>\n </ModalDrawer>\n}","import {useMatchChain, useMatchWalletAssetList, useMatchWalletAssets, useModal} from \"hooks\";\nimport AlphaAvatar from \"../AlphaAvatar\";\nimport {NumberFormatter} from \"../../utils\";\nimport {WalletAssetMergeType} from \"../../types\";\nimport {Radio} from \"../../ui\";\nimport {useState} from \"react\";\nimport {Button} from \"../index\";\nimport TokenSend from \"../TokenSend\";\nimport {FormattedMessage} from \"react-intl\";\nimport {useDownMd} from \"../../hooks/useLayout\";\n\nexport default function TokenSendList({close}: {\n close: () => void\n}) {\n const isDownMd = useDownMd();\n const walletAssets = useMatchWalletAssets()\n const matchWalletAssetList = useMatchWalletAssetList({\n list: walletAssets.mergedAssets\n })\n const {list} = useMatchChain()\n const [checked, setChecked] = useState<WalletAssetMergeType | null>()\n const modal = useModal()\n const onNext = () => {\n checked && modal.show((props) => {\n return <TokenSend onClose={() => {\n props.close()\n close()\n }} onBack={props.close} zIndex={props.zIndex} token={checked}/>\n })\n }\n return (\n <div className={\"matchid-token-send-list-box\"}>\n <div className={\"matchid-token-send-list\"}>\n {\n matchWalletAssetList.list.map((n, index) => {\n const chain = list?.find((m) => m.id.toString() === n.chain_id)\n return <div\n className={`matchid-token-send-item ${checked?.address == n.address ? \"matchid-token-send-chekced\" : \"\"}`}\n onClick={() => {\n setChecked(n)\n }} key={index}>\n <Radio checked={checked?.address == n.address} size={isDownMd ? 18 : 24}/>\n <div className={\"matchid-token-send-content\"}>\n <div className={\"matchid-token-send-logo\"}>\n {n.icon ? <img src={n.icon} alt={n.symbol} className={`matchid-token-send-icon`}/> :\n <AlphaAvatar className={`matchid-token-send-icon`} size={isDownMd ? 28 :40}\n name={n.symbol || n.name || ''}/>}\n {chain?.iconUrl &&\n <img src={chain.iconUrl} alt={chain.name}\n className={`matchid-token-send-chain`}/>}\n </div>\n <div className={`matchid-token-send-info`}>\n <div className={`matchid-token-send-name`}>{n.symbol}</div>\n\n <div className={`matchid-token-send-balance`}>\n <NumberFormatter value={n.balance} tFixNum={3}/>\n </div>\n\n </div>\n </div>\n </div>\n })\n }\n </div>\n <Button size={\"lg\"} highlight block disabled={!checked} onClick={onNext}><FormattedMessage id={\"next\"}/></Button>\n </div>\n )\n}","import InfiniteScroll from \"react-infinite-scroll-component\";\nimport {useMatchWalletRecords, useWallet, useMatchChain, useReceipt} from \"../../hooks\";\nimport {Address, UserTransactionType} from \"../../types\";\nimport {ReactNode, useEffect, useMemo, useState} from \"react\";\nimport {ArrowSendIcon, CheckRoundIcon, InfoRoundIcon, LoadingIcon} from \"../../assets/icon\";\nimport {formatAddress, formatDate, NumberFormatter,} from \"../../utils\";\nimport {decodeFunctionData, defineChain, formatUnits} from \"viem\";\nimport {erc20Abi} from \"viem\";\nimport useContractStore from \"../../store/useContractStore\";\nimport {TransactionInfo} from \"../../store/useTransactionStore\";\nimport useHash from \"../../hooks/useHash\";\nimport {FormattedMessage} from \"react-intl\";\n\nconst Item = ({data}: { data: UserTransactionType | TransactionInfo }) => {\n const {address} = useWallet()\n const isOut = data.from.toLowerCase() == address.toLowerCase()\n\n const {chain, chainId, explorerLink, formatUnits: chainFormatUnits} = useMatchChain()\n const {contracts} = useContractStore()\n const [shouldRefetch,setShouldRefetch] = useState(true)\n\n // const receiptQuery = useReceipt({\n // chainId: chain?.id || 698,\n // hash: data.hash\n // })\n const transferType = useMemo(() => {\n const methodId = data.input.substring(2, 10)\n if (methodId == \"095ea7b3\") {\n return \"erc20_approve\"\n }\n if (methodId == \"a9059cbb\") {\n return \"erc20_transfer\"\n }\n return \"unknown\"\n }, [data.input])\n\n const to = useMemo(() => {\n if(!isOut){\n return data.from\n }\n if (transferType == \"erc20_transfer\") {\n const decodeData = decodeFunctionData({\n abi: erc20Abi,\n data: data.input,\n })\n return decodeData.args[0] as Address\n }\n return data.to\n }, [data.input, transferType, data.to,isOut])\n\n const amount = useMemo(() => {\n if (transferType == \"erc20_transfer\") {\n const decodeData = decodeFunctionData({\n abi: erc20Abi,\n data: data.input,\n })\n const value = decodeData.args[1] as bigint\n return formatUnits(value, contracts[`${chainId}-${data.to.toLowerCase()}`]?.decimals || 18)\n // return value.toString();\n }\n return chainFormatUnits(BigInt(data.value))\n }, [data.input, transferType, data.value, contracts, chainId, data.to])\n\n const hashQuery = useHash({\n hash:data.hash,\n //@ts-ignore\n chain:defineChain(chain),\n refetchInterval: shouldRefetch ? 3000 : false,\n enabled:shouldRefetch && data.source == 'local'\n })\n const status = useMemo(() => {\n if (data.source == 'matchain') {\n switch (data.extra.status) {\n case \"ok\":\n return \"success\"\n case \"error\":\n return \"error\"\n }\n\n } else if(data.source=='auto') {\n if (data.extra.receipt_status == 1) {\n return \"success\"\n } else {\n return \"error\"\n }\n }else {\n if(hashQuery.data==1){\n return 'success'\n }\n if(hashQuery.data==-1){\n return 'error'\n }\n if(Date.now()/1000-parseInt(data.timestamp)>3600){\n return 'error'\n }\n }\n\n return 'loading'\n }, [data.extra?.status, data.source,hashQuery.data])\n\n useEffect(() => {\n if(data.hash){\n setShouldRefetch(status=='loading')\n }\n }, [status,data.hash]);\n\n const symbol = useMemo(() => {\n if (transferType == \"erc20_transfer\") {\n const contract = contracts[`${chainId}-${data.to.toLowerCase()}`]\n return contract?.symbol || contract?.name || \"unknown\"\n }\n return chain?.nativeCurrency.symbol || chain?.nativeCurrency.name\n }, [transferType, chain, contracts, chainId, data.to])\n\n\n return <a\n href={explorerLink(`tx/${data.hash}`)}\n target=\"_blank\"\n className={`matchid-transaction-item`}\n >\n <div className={`matchid-transacton-item-container`}>\n <div className={\"matchid-transaction-item-icon\"}>\n <ArrowSendIcon className={!isOut ? \"rotate-180\" : \"\"}/>\n </div>\n <div className={`matchid-transaction-item-details`}>\n <div className={`matchid-transaction-item-address`}>\n {formatAddress(to, 6, 4)}\n </div>\n <div\n className={`matchid-transaction-item-timestamp`}>{formatDate(data.timestamp, 'MM/DD HH:mm:ss')}</div>\n </div>\n </div>\n <div className={`matchid-transaction-item-amount ${'matchid-transaction-item-' + status}`}>\n <NumberFormatter value={amount} tFixNum={6} prefix={isOut ? '-' : '+'} suffix={\" \" + symbol}/>\n\n {status == 'loading' && <LoadingIcon color=\"#000000\" size={16} rotate/>}\n {status == 'success' && <CheckRoundIcon size={16}/>}\n {status == 'error' && <InfoRoundIcon size={16}/>}\n\n </div>\n </a>\n}\n\nexport default function TransactionList({\n scrollableTarget\n }: {\n scrollableTarget?: ReactNode;\n}) {\n const {fetchMoreData, hasMore, items} = useMatchWalletRecords()\n\n return (\n <InfiniteScroll\n scrollableTarget={scrollableTarget}\n dataLength={items.length}\n next={fetchMoreData}\n hasMore={hasMore}\n loader={<div className={\"matchid-list-nomore\"}><LoadingIcon rotate size={16} color={\"black\"}/>Loading...\n </div>}\n endMessage={\n items.length > 0 ?\n <div className={`matchid-list-nomore`}><FormattedMessage id={\"noMoreRecords\"}/></div> :\n <div className={`matchid-list-nomore`}><FormattedMessage id={\"noRecords\"}/></div>\n }\n >\n {\n items.length == 0 && !hasMore ?\n <div className={\"mt-[150px]\"}/> :\n <div className={`matchid-transaction-list`}>\n {\n items.map((item, index) => <Item data={item} key={index}/>)\n }\n </div>\n }\n </InfiniteScroll>\n )\n}","import { create } from 'zustand';\nimport { devtools, persist } from 'zustand/middleware';\nexport interface ContractInfo {\n symbol?: string;\n decimals?: number;\n name?:string\n}\n\ninterface ContractStore {\n contracts: Record<string, ContractInfo>;\n\n getContract: (chainId: number, contractAddress: string) => ContractInfo | undefined;\n\n setContractSymbol: (chainId: number, contractAddress: string, symbol: string) => void;\n\n setContractDecimals: (chainId: number, contractAddress: string, decimals: number) => void;\n\n setContractName: (chainId: number, contractAddress: string, name: string) => void;\n\n setContracts: (data: { chainId: number; contractAddress: string; info: ContractInfo }[]) => void;\n}\n\nconst persistedState = persist<ContractStore>(\n (set, get) => ({\n contracts: {},\n\n getContract: (chainId, contractAddress) => {\n const key = `${chainId}-${contractAddress.toLowerCase()}`;\n return get().contracts[key];\n },\n\n setContractName: (chainId, contractAddress, name) => {\n const key = `${chainId}-${contractAddress.toLowerCase()}`;\n set((state) => {\n const updatedContracts = {\n ...state.contracts,\n [key]: { ...state.contracts[key], name },\n };\n return { contracts: updatedContracts };\n });\n },\n\n setContractSymbol: (chainId, contractAddress, symbol) => {\n const key = `${chainId}-${contractAddress.toLowerCase()}`;\n set((state) => {\n const updatedContracts = {\n ...state.contracts,\n [key]: { ...state.contracts[key], symbol },\n };\n return { contracts: updatedContracts };\n });\n },\n\n setContractDecimals: (chainId, contractAddress, decimals) => {\n const key = `${chainId}-${contractAddress.toLowerCase()}`;\n set((state) => {\n const updatedContracts = {\n ...state.contracts,\n [key]: { ...state.contracts[key], decimals },\n };\n return { contracts: updatedContracts };\n });\n },\n\n setContracts: (data) => {\n set((state) => {\n const newContracts = { ...state.contracts };\n data.forEach(({ chainId, contractAddress, info }) => {\n const key = `${chainId}-${contractAddress.toLowerCase()}`;\n newContracts[key] = { ...newContracts[key], ...info };\n });\n return { contracts: newContracts };\n });\n },\n }),\n { name: 'match-contract-local' }\n);\n\nconst useContractStore = create(devtools(persistedState));\n\nexport default useContractStore;\n","import {useQuery} from \"@tanstack/react-query\";\nimport {Chain, createPublicClient, http} from \"viem\";\nimport matchlog from \"../utils/matchlog\";\n\nexport default function useHash({\n hash,\n chain,\n refetchInterval,\n enabled=true\n }:{\n hash?: `0x${string}` | null,\n chain?: Chain | null,\n refetchInterval?:false|number\n enabled?:boolean\n}){\n return useQuery(\n {\n queryKey: ['txhash', hash, chain],\n queryFn: async () => {\n if (!chain || !hash) return false\n const publicClient = createPublicClient({\n chain,\n transport: http(),\n });\n try {\n const receipt = await publicClient.getTransactionReceipt({hash});\n\n if (!receipt) {\n return 0\n }\n matchlog.log('getTransactionReceipt', receipt)\n if (receipt.status === 'success') {\n return 1\n }\n return -1\n\n } catch (error) {\n console.error('getTransactionReceiptError', error)\n }\n return -99\n },\n enabled: !!chain && !!hash && enabled,\n refetchInterval,\n // refetchIntervalInBackground: false\n }\n );\n}","import {useDownMd} from \"hooks/useLayout\";\nimport {ModalWithHeader} from \"../Modal\";\nimport Drawer from \"../Drawer\";\nimport {WalletPanelProps} from \"../../types\";\n\nexport default function ModalDrawer({\n title,\n drawerTitleVisible=true,\n ...props}:WalletPanelProps){\n\n const isDownMd = useDownMd()\n if(isDownMd){\n return <ModalWithHeader {...props} title={title}/>\n }\n return <Drawer {...props} title={drawerTitleVisible ? title : null}/>\n}","import {UIProps} from \"../../types\";\nimport {LoadingIcon} from \"../../assets/icon\";\n\nexport default function Switch({\n size=\"default\",\n checked=false,\n loading=false,\n onChange,\n className,\n disabled=false,\n ...props\n }:{\n size?:\"default\"|\"sm\",\n checked?:boolean,\n loading?:boolean,\n disabled?:boolean,\n onChange?:(checked:boolean)=>void,\n}&UIProps){\n const onClick = ()=>{\n if(!disabled && !loading){\n onChange && onChange(!checked)\n }\n }\n return <div onClick={onClick} className={`matchid-switch matchid-switch-${size} ${checked ? \"matchid-switch-checked\":\"\"} ${disabled ? \"matchid-switch-disabled\":\"\"} ${loading ? \"matchid-switch-loading\":\"\"}`} {...props}>\n\n {\n loading ?\n <LoadingIcon className=\"matchid-switch-loading-icon\" size={size==\"default\"?24:18} color=\"var(--matchid-swicth-loading-color)\"/> :\n <div className={\"matchid-switch-ball\"}></div>\n }\n </div>\n}","import { useMemo} from \"react\";\nimport {UIProps} from \"../../types\";\n\nexport default function AlphaAvatar({\n name,\n size = \"default\", className = '',style}: {\n name: string,\n size?: number|\"sm\"|\"default\"|\"lg\",\n}&UIProps) {\n\n const avatar = useMemo(()=>{\n if (name) {\n const char = name[0].toUpperCase()\n if (char.match(/[a-zA-Z0-9]/)) {\n return char\n }\n }\n return ''\n },[name])\n\n const numberSize = typeof size === 'number' ? size : size === 'sm' ? 24 : size === 'default' ? 40 : 64\n return <div className={`matchid-alpha-avatar ${className}`} style={{\n width: numberSize,\n height: numberSize,\n fontSize: Math.ceil(numberSize / 2),\n ...style\n }}>\n {avatar}\n </div>\n}","import {CSSProperties} from \"react\";\n\nexport default function Radio({\n checked = false,\n onChange,\n size = 24,\n color = \"#FC802D\",\n className = \"\",\n style = {}\n }: {\n checked?: boolean,\n onChange?: () => void\n size?: number,\n color?: string,\n className?: string,\n style?: CSSProperties\n}) {\n return <div onClick={onChange} className={`matchid-radio ${className} ${checked ? 'matchid-radio-checked' :''}`} style={{\n width: size,\n height: size,\n ...style,\n // @ts-ignore\n '--matchid-radio-checked': color\n }}>\n {checked && <div className={`matchid-radio-content`} style={{\n width:Math.floor(size*0.7),\n height:Math.floor(size*0.7),\n }}></div>}\n </div>\n}","import React from \"react\";\n\ninterface SkeletonProps {\n style?: React.CSSProperties;\n className?: string;\n width?: string | number;\n height?: string | number;\n radius?: string | number;\n loading?: boolean;\n children?: React.ReactNode;\n}\n\nconst Skeleton: React.FC<SkeletonProps> = ({\n style={},\n className=\"\",\n width = 40,\n height = 40,\n radius = 5,\n loading = true,\n children,\n }) => {\n if (!loading) {\n return <>{children}</>;\n }\n\n const skeletonStyle: React.CSSProperties = {\n width,\n height,\n borderRadius: radius,\n ...style,\n };\n\n return (\n <div\n className={\"matchid-skeleton \"+className}\n style={skeletonStyle}\n ></div>\n );\n};\n\nexport default Skeleton;","type TabsProps = {\n tabs: string[]\n activeTab: number\n setActiveTab: (tab: number) => void\n}\nexport default function Tabs(props:TabsProps){\n\n return <div className={`matchid-tabs`}>\n {props.tabs.map((tab, index) => {\n return <div key={index} onClick={() => props.setActiveTab(index)} className={`matchid-tab ${props.activeTab === index ? \"matchid-tab-active\" : \"\"}`}>\n {tab}\n </div>\n })}\n\n </div>\n}","import { useEffect, useState } from \"react\";\nimport {LottieComponentProps, useLottie} from \"lottie-react\";\n\nconst LazyLottie = (props: {\n animationData: any;\n style?: React.CSSProperties;\n}) => {\n const options = {\n animationData: props.animationData,\n loop: true,\n autoplay: true,\n };\n\n const { View } = useLottie(options, props.style);\n\n return View;\n};\n\nexport default LazyLottie;","import {CheckboxCheckedIcon,CheckboxIcon} from \"../../assets/icon\";\n\nexport default function Checkbox({\n checked=false,\n onChange\n }:{\n checked?:boolean,\n onChange?:(checked:boolean)=>void\n}){\n return checked ? <CheckboxCheckedIcon onClick={()=>onChange?.(false)}/> : <CheckboxIcon onClick={()=>onChange?.(true)}/>\n}","import {create} from 'zustand';\nimport {devtools, persist} from 'zustand/middleware';\nimport {Address, AnyObject, Hash} from \"../types\";\n\nexport interface TransactionInfo {\n from: Address;\n hash: Hash;\n input: Hash;\n timestamp: string;\n to: Address;\n value: string;\n source:\"local\"\n extra?:AnyObject\n}\n\ninterface TransactionStore {\n transactions: Record<string, TransactionInfo[]>;\n\n\n addTransaction: (data: { chainId: number;address:Address; hash: string; info: TransactionInfo }) => void;\n\n removeTransaction: (data: { chainId: number;address:Address; hash: string }) => void;\n}\n\nconst persistedState = persist<TransactionStore>(\n (set, get) => ({\n transactions: {},\n\n addTransaction: (data) => {\n set((state) => {\n const updatedTransactions = {\n ...state.transactions,\n [`${data.chainId}-${data.address}`]: [data.info,...(state.transactions[`${data.chainId}-${data.address}`] || [])],\n };\n return {transactions: updatedTransactions};\n });\n },\n removeTransaction: (data) => {\n set((state) => {\n const updatedTransactions = {\n ...state.transactions,\n [`${data.chainId}-${data.address}`]: (state.transactions[`${data.chainId}-${data.address}`] || [])\n .filter((tx) => tx.hash !== data.hash)\n };\n return {transactions: updatedTransactions};\n });\n },\n }),\n {name: 'match-transactions-local'}\n);\n\nconst useTransactionStore = create(devtools(persistedState));\n\nexport default useTransactionStore;\n","import copy from 'copy-to-clipboard'\nimport { useCallback, useEffect, useState } from 'react'\n\nexport default function useCopyClipboard(timeout = 500): [boolean, (toCopy: string) => void] {\n const [isCopied, setIsCopied] = useState(false)\n\n const staticCopy = useCallback((text: string) => {\n const didCopy = copy(text)\n setIsCopied(didCopy)\n }, [])\n\n useEffect(() => {\n if (isCopied) {\n const hide = setTimeout(() => {\n setIsCopied(false)\n }, timeout)\n\n return () => {\n clearTimeout(hide)\n }\n }\n return undefined\n }, [isCopied, setIsCopied, timeout])\n\n return [isCopied, staticCopy]\n}\n","import { useState, useCallback, createContext, useContext, ReactNode, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {CheckRoundIcon, ErrorRoundIcon} from \"assets/icon\";\n\ninterface ToastContextType {\n show: (options: { icon?: ReactNode; timeout?: number; text: ReactNode }) => void;\n success: (text: ReactNode, timeout?: number) => void;\n error: (text: ReactNode, timeout?: number) => void;\n}\n\nconst ToastContext = createContext<ToastContextType | null>(null);\n\nexport function ToastProvider({ children,zIndex=299 }: { children: ReactNode,zIndex?:number }) {\n const [toasts, setToasts] = useState<{ id: number; icon?: ReactNode; text: ReactNode }[]>([]);\n\n const removeToast = useCallback((id: number) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const show = useCallback(({ icon, timeout = 3000, text }: { icon?: ReactNode; timeout?: number; text: ReactNode }) => {\n const id = Date.now()+Math.random();\n setToasts((prev) => [...prev, { id, icon, text }]);\n setTimeout(() => removeToast(id), timeout);\n }, [removeToast]);\n\n const success = useCallback((text: ReactNode, timeout?: number) => {\n show({ icon: <CheckRoundIcon color={\"#2FCC00\"} size={24}/>, text, timeout });\n }, [show]);\n\n const error = useCallback((text: ReactNode, timeout?: number) => {\n show({ icon: <ErrorRoundIcon size={24}/>, text, timeout });\n }, [show]);\n\n const ToastComponent = createPortal(\n <div className=\"matchid-toast-box\" style={{\n zIndex\n }}>\n {toasts.reverse().map(({ id, icon, text }) => (\n <div\n key={id}\n className=\"matchid-toast\"\n >\n {icon && <span>{icon}</span>}\n <span>{text}</span>\n </div>\n ))}\n </div>,\n document.body\n );\n\n return (\n <ToastContext.Provider value={{ show, success, error }}>\n {children}\n {ToastComponent}\n </ToastContext.Provider>\n );\n}\n\nexport function useToast(): ToastContextType {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\");\n }\n return context;\n}\n","import {useQuery} from \"@tanstack/react-query\";\nimport {\n getUserChainListApi,\n getUserImportTokenListApi,\n getUserWalletAssetApi, getWalletAssetListApi, getWalletChainListApi, getWalletNftListApi,\n} from \"../../api\";\nimport {isSuccess} from \"../../api/request\";\nimport type {UseQueryOptions} from \"@tanstack/react-query/src/types\";\nimport {\n UserAssetToken,\n UserChainType,\n UserImportTokenType,\n UserTransactionType, WalletAssetType,\n WalletChainType,\n WalletNFTType\n} from \"../../types\";\nimport useUserInfo from \"../useUserInfo\";\n\nexport {userImportTokenApi, getUserWalletTransactionsApi, getWalletAssetListApi, getWalletListApi} from \"../../api\"\n\nexport function useChainListQuery(options?: Partial<Omit<UseQueryOptions<UserChainType[]>, 'queryKey' | 'queryFn'>>) {\n const {isLogin, token} = useUserInfo()\n return useQuery({\n queryKey: [\"match-user-chain-list\", token],\n queryFn: async () => {\n const res = await getUserChainListApi()\n if (!isSuccess(res)) {\n return []\n }\n return res.data\n },\n enabled: isLogin,\n ...options\n })\n\n}\n\n\nexport function useAssetListQuery({\n chainId,\n ...options\n }: {\n chainId: number\n} & Partial<Omit<UseQueryOptions<UserAssetToken[]>, 'queryKey' | 'queryFn'>>) {\n const {isLogin, token} = useUserInfo()\n return useQuery({\n queryKey: [\"match-user-asset-list\", token, chainId],\n queryFn: async () => {\n const res = await getUserWalletAssetApi({chain_id: chainId.toString()})\n if (!isSuccess(res)) {\n return []\n }\n return res.data || []\n },\n enabled: isLogin,\n ...options\n })\n}\nexport const USER_IMPORT_TOKEN_LIST_KEY = \"match-user-import-token-list\"\nexport function useImportTokenListQuery({\n chainId,\n ...options\n }: {\n chainId: number\n} & Partial<Omit<UseQueryOptions<UserImportTokenType[]>, 'queryKey' | 'queryFn'>>) {\n const {isLogin, token} = useUserInfo()\n return useQuery({\n queryKey: [USER_IMPORT_TOKEN_LIST_KEY, token, chainId],\n queryFn: async () => {\n const res = await getUserImportTokenListApi({chain_id: chainId.toString()})\n if (!isSuccess(res)) {\n return []\n }\n return res.data || []\n },\n enabled: isLogin,\n ...options\n })\n}\n\nexport function useWalletChainListQuery(options?: Partial<Omit<UseQueryOptions<WalletChainType[]>, 'queryKey' | 'queryFn'>>) {\n const {isLogin, token} = useUserInfo()\n return useQuery({\n queryKey: [\"match-wallet-chain-list\", token],\n queryFn: async () => {\n const res = await getWalletChainListApi()\n if (!isSuccess(res)) {\n return []\n }\n return res.data\n },\n enabled: isLogin,\n ...options\n })\n\n}\n\nexport function useWalletNftListQuery({\n chainId,\n address,\n ...options\n }: {\n chainId: string,\n address: string\n} & Partial<Omit<UseQueryOptions<WalletNFTType[]>, 'queryKey' | 'queryFn'>>) {\n const {isLogin, token} = useUserInfo()\n return useQuery({\n queryKey: [\"match-wallet-nft-list\", token, chainId, address],\n queryFn: async () => {\n const res = await getWalletNftListApi({\n chain_id: chainId.toString(),\n address\n })\n if (!isSuccess(res)) {\n return []\n }\n return res.data\n },\n enabled: isLogin,\n ...options\n })\n\n}\n\nexport function useWalletAssetListQuery({\n chainId,\n address,\n ...options\n }: {\n chainId: string,\n address: string\n} & Partial<Omit<UseQueryOptions<{\n asset_list:WalletAssetType[]\n asset_total_balance:string\n}|null>, 'queryKey' | 'queryFn'>>) {\n const {isLogin, token} = useUserInfo()\n return useQuery({\n queryKey: [\"match-wallet-asset-list\", token, chainId, address],\n queryFn: async () => {\n const res = await getWalletAssetListApi({\n chain_id: chainId,\n address\n })\n if (!isSuccess(res)) {\n return null\n }\n return res.data\n },\n enabled: isLogin,\n ...options\n })\n\n}","import {useChainListQuery} from \"./api/wallet\";\nimport useLocalStore from \"../store/useLocalStore\";\nimport {useMemo, useState} from \"react\";\nimport {useModal} from \"../context/ModalContext\";\nimport {Button, Radio} from \"../ui\";\nimport {createPublicClient, formatUnits, http, parseUnits} from \"viem\";\nimport {useDownMd} from \"./useLayout\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nexport default function useMatchChain() {\n const chainListQuery = useChainListQuery()\n const modal = useModal()\n const intl = useIntl()\n const {chainId: storeChainId, setChainId} = useLocalStore()\n const chainId = useMemo(() => {\n if (!chainListQuery.data || !chainListQuery.data.length) {\n return null\n }\n if (chainListQuery.data.find((item) => item.id === storeChainId)) {\n return storeChainId\n }\n return chainListQuery.data[0].id\n }, [storeChainId, chainListQuery.data])\n\n const chain = useMemo(() => {\n if (!chainListQuery.data || !chainListQuery.data.length) {\n return null\n }\n return chainListQuery.data.find((item) => item.id === chainId)\n }, [chainId, chainListQuery.data])\n\n const explorerLink = (url: string) => {\n const explorer = chain?.blockExplorers.default.url as string\n return explorer.lastIndexOf('/') === explorer.length - 1 ? explorer + url : explorer + '/' + url\n }\n\n function ChangeNetwork({\n close,\n }: {\n close: () => void\n }) {\n const {chainId: storeChainId, setChainId} = useLocalStore()\n const [selectedChainId, setSelectedChainId] = useState(storeChainId)\n const isDownMd = useDownMd()\n return <div className={`matchid-change-network-box`}>\n <div className={`matchid-change-network-list`}>\n {\n chainListQuery.data?.map((item, index) => {\n return <div key={index} onClick={() => setSelectedChainId(item.id)}\n className={`matchid-change-network-item ${selectedChainId == item.id ? 'matchid-change-network-selected' : ''}`}>\n <div className={`matchid-change-network-item-content`}>\n <img src={item.iconUrl} className={`matchid-change-network-item-icon`}/>\n <span className={\"matchid-change-network-item-name\"}>{item.name}</span>\n </div>\n <Radio checked={selectedChainId === item.id} size={isDownMd ? 18 :24}/>\n </div>\n })\n }\n </div>\n <Button size={\"lg\"} highlight onClick={() => {\n setChainId(selectedChainId || 0)\n close()\n }} block><FormattedMessage id={\"confirm\"}/></Button>\n </div>\n }\n\n const showChangeNetwork = () => {\n modal.open({\n title: intl.formatMessage({id: 'changeNetwork'}),\n content: ChangeNetwork\n })\n }\n\n const publicClient = useMemo(() => {\n if (!chain) {\n return null\n }\n return createPublicClient({\n chain,\n transport:http()\n })\n }, [chain])\n\n return {\n list: chainListQuery.data,\n chainId,\n setChainId,\n chain,\n explorerLink,\n showChangeNetwork,\n publicClient,\n formatUnits: (value: bigint) => {\n return formatUnits(value, chain?.nativeCurrency.decimals || 18)\n },\n parseUnits: (value: string) => {\n return parseUnits(value, chain?.nativeCurrency.decimals || 18)\n }\n }\n}","import {useModal} from \"../context/ModalContext\";\nimport {useCopyClipboard, useMatchChain, useToast, useUserInfo, useWallet} from \"./index\";\nimport {Button, TokenSendList} from \"components\";\nimport {QRCode} from \"react-qrcode\";\nimport {useEffect, useMemo, useRef, useState} from \"react\";\nimport {\n Address,\n useMatchWalletAssetsProps,\n UserAssetToken,\n UserImportTokenType, UserTransactionNextPageParams, UserTransactionRecordType,\n UserTransactionType,\n WalletAssetMergeType\n} from \"../types\";\nimport {getUserWalletTransactionsApi, userImportTokenApi} from \"../api\";\nimport {isSuccess} from \"../api/request\";\nimport {Field, Input} from \"../ui\";\nimport {Abi} from \"abitype\";\nimport {useAssetListQuery, useImportTokenListQuery, USER_IMPORT_TOKEN_LIST_KEY} from \"./api/wallet\";\nimport {useQuery, useQueryClient} from \"@tanstack/react-query\";\nimport {NATIVE_TOKEN_ADDRESS} from \"../config\";\nimport {erc20Abi, formatUnits} from \"viem\";\nimport useLocalStore from \"../store/useLocalStore\";\nimport useContractStore, {ContractInfo} from \"../store/useContractStore\";\nimport useTransactionStore from \"../store/useTransactionStore\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport ImportToken from \"../components/ImportToken\";\n\nconst ReceiveModal = () => {\n const chain = useMatchChain()\n const {address} = useWallet();\n const [copied, setCopied] = useCopyClipboard();\n const toast = useToast()\n const intl = useIntl()\n\n const onCopy = () => {\n setCopied(address)\n toast.success(intl.formatMessage({\n id: \"copied\"\n }))\n }\n\n const chainLink = chain.explorerLink(\"address/\" + address)\n return <div className={`matchid-receive-modal`}>\n <div className={\"matchid-receive-container\"}>\n <div className={`matchid-receive-text`}><FormattedMessage id={\"receiveQrcode\"}/></div>\n <div className={`matchid-qr-container`}>\n <QRCode margin=\"0\"\n className={`matchid-qr-code`}\n value={address}/>\n </div>\n <a href={chainLink} target=\"_blank\"\n className={`matchid-receive-link`}>\n {address}\n </a>\n </div>\n <Button size={\"lg\"} onClick={onCopy} block highlight disabled={copied}><FormattedMessage\n id={\"copyAddress\"}/></Button>\n </div>\n\n}\nexport default function useMatchWallet() {\n const modal = useModal()\n const intl = useIntl()\n const showReceiveModal = () => {\n modal.open({\n title: intl.formatMessage({\n id: \"receive\"\n }),\n content: ReceiveModal\n })\n }\n\n const showImportTokenModal = () => {\n modal.open({\n title: intl.formatMessage({\n id: \"customizedToken\"\n }),\n content: ImportToken\n })\n }\n\n const showSendListModal = () => {\n modal.open({\n title: intl.formatMessage({\n id: \"send\"\n }),\n content: TokenSendList\n })\n }\n\n return {\n showReceiveModal,\n showImportTokenModal,\n showSendListModal\n }\n}\n\nexport function useMatchWalletRecords() {\n const [hasMore, setHasMore] = useState(true);\n const [items, setItems] = useState<UserTransactionType[]>([])\n const {chainId, publicClient} = useMatchChain()\n const {address} = useWallet()\n const hasMoreRef = useRef(hasMore)\n const nextPageParamsRef = useRef<UserTransactionNextPageParams | undefined>(undefined)\n const {contracts, setContracts} = useContractStore()\n\n const fetchMoreData = async () => {\n const chainIdStr = chainId ? chainId.toString() : \"\"\n\n if (!hasMoreRef.current || !chainIdStr) {\n return\n }\n const res = await getUserWalletTransactionsApi({\n chain_id: chainIdStr,\n ...nextPageParamsRef.current,\n })\n if (isSuccess(res)) {\n if (res.data && res.data.transactions && res.data.transactions.length > 0) {\n setItems(items.concat(res.data.transactions || []));\n }\n hasMoreRef.current = res.data && res.data.transactions && res.data.transactions.length >= 50\n setHasMore(hasMoreRef.current)\n nextPageParamsRef.current = res.data?.next_page_params\n }\n };\n const onInit = async () => {\n nextPageParamsRef.current = undefined\n setItems([])\n setHasMore(true)\n hasMoreRef.current = true\n fetchMoreData()\n }\n useEffect(() => {\n if (chainId && address) {\n onInit()\n }\n }, [chainId, address]);\n\n const {transactions, removeTransaction} = useTransactionStore()\n const getContractInfoList = async(contractList:string[])=>{\n const contractUnique = Array.from(new Set(contractList)).filter(item => {\n const contract = contracts[`${chainId}-${item.toLowerCase()}`]\n if (!contract) {\n return true\n }\n if (!contract.symbol && !contract.name) {\n return true\n }\n if (!contract.decimals) {\n return true\n }\n return false\n })\n const calls = []\n for (const contract of contractUnique) {\n calls.push({\n address: contract as `0x${string}`,\n abi: erc20Abi,\n functionName: \"symbol\",\n args: []\n })\n calls.push({\n address: contract as `0x${string}`,\n abi: erc20Abi,\n functionName: \"decimals\",\n args: []\n })\n }\n const results = await publicClient?.multicall({contracts: calls});\n if (results) {\n console.log('contract results', calls, results)\n const contractMap = []\n for (let i = 0; i < contractUnique.length; i++) {\n const info: ContractInfo = {}\n if (results[i * 2].status == 'success') {\n info.symbol = results[i * 2].result as string\n }\n if (results[i * 2 + 1].status == 'success') {\n info.decimals = results[i * 2 + 1].result as number\n }\n // if(results[i * 3 + 2].status == 'success'){\n // info.name = results[i * 3 + 2].result as string\n // }\n\n contractMap.push({\n chainId: chainId || 0,\n contractAddress: contractUnique[i],\n info\n })\n }\n setContracts(contractMap)\n }\n }\n const list = useMemo(() => {\n const localTransactions = transactions[`${chainId}-${address}`] || []\n const removeList = localTransactions.filter(n => items.findIndex(m => m.hash == n.hash) >= 0);\n removeList.forEach(item => {\n removeTransaction({\n chainId: chainId || 0,\n hash: item.hash,\n address: address as Address\n })\n })\n const saveList = localTransactions.filter(n => items.findIndex(m => m.hash == n.hash) < 0);\n const list = [\n ...saveList,\n ...items\n ].sort((a, b) => {\n const btimestamp = typeof b.timestamp === 'string' ? parseInt(b.timestamp) : b.timestamp\n const atimestamp = typeof a.timestamp === 'string' ? parseInt(a.timestamp) : a.timestamp\n return btimestamp - atimestamp\n })\n const contractList = list.filter(item => item.input.toLowerCase().substring(0, 10) == '0xa9059cbb')\n .map(item => item.to)\n getContractInfoList(contractList)\n return list\n }, [transactions, chainId, items, address])\n\n\n return {\n items: list,\n fetchMoreData,\n hasMore\n }\n}\n\n\nexport function useMatchWalletAssets({\n importTokenOptions,\n assetListOptions\n }: useMatchWalletAssetsProps = {}) {\n const {chainId, chain} = useMatchChain();\n\n\n const importTokenQuery = useImportTokenListQuery({\n chainId: chainId || 0,\n ...importTokenOptions\n });\n\n const assetListQuery = useAssetListQuery({\n chainId: chainId || 0,\n ...assetListOptions\n });\n\n const mergedAssets = useMemo(() => {\n if (!assetListQuery.data && !importTokenQuery.data) return [];\n\n const assetList = (assetListQuery.data || []).map(asset => ({\n ...asset,\n isAuto: true\n }));\n\n const importTokens = (importTokenQuery.data || []).map(token => ({\n ...token,\n isCustom: true\n }));\n\n const assetMap = new Map();\n assetList.forEach(asset => {\n const key = `${asset.chain_id}-${asset.address.toLowerCase()}`;\n assetMap.set(key, asset);\n });\n\n importTokens.forEach(token => {\n const key = `${token.chain_id}-${token.address.toLowerCase()}`;\n if (assetMap.has(key)) {\n const existing = assetMap.get(key);\n assetMap.set(key, {\n ...existing,\n symbol: token.symbol,\n decimals: token.decimals,\n isCustom: true,\n isAuto: existing.isAuto ?? false\n });\n } else {\n assetMap.set(key, token);\n }\n });\n\n const list = Array.from(assetMap.values()).sort((a, b) => {\n return (b.isAuto ? 1 : 0) - (a.isAuto ? 1 : 0);\n });\n //check native token exist\n const nativeToken = list.find(asset => asset.address.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase());\n if (!nativeToken) {\n list.unshift({\n chain_id: chain?.id.toString() || '',\n address: NATIVE_TOKEN_ADDRESS,\n decimals: chain?.nativeCurrency.decimals||18,\n symbol: chain?.nativeCurrency.symbol,\n name: chain?.nativeCurrency.name,\n balance: 0,\n icon: chain?.nativeCurrency.icon\n });\n }\n return list\n }, [assetListQuery.data, importTokenQuery.data]);\n\n return {\n importTokenQuery,\n assetListQuery,\n mergedAssets\n };\n}\n\n\nconst MULTICALL_LIMIT = 100;\n\nexport function useMatchWalletAssetList({\n list\n }: {\n list: WalletAssetMergeType[]\n}) {\n const {publicClient, chain} = useMatchChain();\n const {address} = useWallet()\n const {assets, setAssets} = useLocalStore()\n\n // Filter out the native token\n const nativeToken = list.find(asset => asset.address.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase()) || {\n chain_id: chain?.id || '',\n address: NATIVE_TOKEN_ADDRESS,\n decimals: 18,\n symbol: chain?.nativeCurrency.symbol,\n name: chain?.nativeCurrency.name,\n balance: 0,\n }\n\n // 1. Query the native token balance\n const nativeBalanceQuery = useQuery({\n queryKey: ['nativeBalance', nativeToken?.chain_id],\n queryFn: async () => {\n if (!nativeToken || !publicClient) return null;\n try {\n return await publicClient.getBalance({\n address: address as `0x${string}`,\n });\n } catch (error) {\n console.error('Native Token Balance Error:', error);\n return null;\n }\n },\n enabled: !!nativeToken && !!publicClient,\n refetchInterval: 15000, // Refresh every 15 seconds\n retry: 3 // Retry up to 3 times if failed\n });\n\n // 2. Filter out ERC20 tokens that require multiCall queries\n const erc20Tokens = useMemo(() => list.filter(asset => asset.address !== NATIVE_TOKEN_ADDRESS), [list]);\n\n // 3. Execute multiCall to query ERC20 balances\n const erc20BalanceQuery = useQuery({\n queryKey: ['erc20Balances', erc20Tokens.map(token => token.address)],\n queryFn: async () => {\n if (!erc20Tokens.length || !publicClient) return [];\n\n const calls = erc20Tokens.map(token => (\n {\n address: token.address as `0x${string}`,\n abi: erc20Abi as Abi,\n functionName: \"balanceOf\",\n args: [address as `0x${string}`]\n }\n ));\n\n let balances = [];\n for (let i = 0; i < calls.length; i += MULTICALL_LIMIT) {\n const batchCalls = calls.slice(i, i + MULTICALL_LIMIT);\n try {\n const results = await publicClient.multicall({contracts: batchCalls});\n balances.push(...results);\n } catch (error) {\n console.error('MultiCall Error:', error);\n }\n }\n\n return balances;\n },\n enabled: !!publicClient,\n refetchInterval: 15000, // Refresh every 15 seconds\n retry: 3\n });\n\n\n // 4. Compute the holding value for isAuto=true tokens\n const enrichedAssets = useMemo(() => {\n if (!list) return [];\n\n const erc20Balances = erc20BalanceQuery.data || [];\n return list.map(asset => {\n let balanceValue = \"0\";\n\n let balance = 0;\n const decimals = typeof asset.decimals === 'string' ? parseInt(asset.decimals) : asset.decimals;\n const assetAddress = asset.address.toLowerCase();\n // Native token balance\n if (assetAddress === NATIVE_TOKEN_ADDRESS) {\n balanceValue = nativeBalanceQuery.data?.toString() || \"0\";\n balance = nativeBalanceQuery.data ? Number(formatUnits(nativeBalanceQuery.data, decimals)) : 0;\n }\n // ERC20 balance\n else {\n const index = erc20Tokens.findIndex(t => t.address.toLowerCase() === assetAddress);\n if (index !== -1 && erc20Balances[index] && erc20Balances[index].status === 'success') {\n balance = Number(formatUnits(erc20Balances[index].result as bigint, decimals));\n balanceValue = (erc20Balances[index].result as bigint)?.toString() || \"0\";\n }\n }\n\n // Calculate the holding value\n const value = asset.isAuto ? (balance * (asset.price || 0)) : 0;\n\n return {...asset, balance, value, balanceValue};\n });\n }, [list, nativeBalanceQuery.data, erc20BalanceQuery.data]);\n\n // 5. Sorting rules:\n useEffect(() => {\n const list = enrichedAssets.sort((a, b) => {\n // ① Native token is always at the top\n if (a.address === NATIVE_TOKEN_ADDRESS) return -1;\n if (b.address === NATIVE_TOKEN_ADDRESS) return 1;\n\n // ② Tokens with isAuto=true and non-zero balance are sorted by holding value in descending order\n if (a.isAuto && b.isAuto) return b.value - a.value;\n if (a.isAuto) return -1;\n if (b.isAuto) return 1;\n\n // ③ Tokens with isCustom=true and non-zero balance retain their original order\n if (a.isCustom && !a.isAuto && a.balance > 0) return -1;\n if (b.isCustom && !b.isAuto && b.balance > 0) return 1;\n\n // ④ Other tokens retain their original order\n return 0;\n });\n setAssets(list)\n }, [enrichedAssets]);\n\n return {\n list: assets,\n isLoading: nativeBalanceQuery.isLoading || erc20BalanceQuery.isLoading,\n isFetched: nativeBalanceQuery.isFetched && erc20BalanceQuery.isFetched,\n nativeBalanceQuery,\n erc20BalanceQuery,\n nativeBalance: nativeBalanceQuery.data,\n erc20Balances: erc20BalanceQuery.data\n };\n}\n","import {useMatchChain, useToast, useUserInfo} from \"../../hooks\";\nimport {useEffect, useMemo, useState} from \"react\";\nimport {Abi} from \"abitype\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport {useQueryClient} from \"@tanstack/react-query\";\nimport {userImportTokenApi} from \"../../api\";\nimport {isSuccess} from \"../../api/request\";\nimport {USER_IMPORT_TOKEN_LIST_KEY} from \"../../hooks/api/wallet\";\nimport {Field, Input} from \"../../ui\";\nimport {Button} from \"../index\";\nimport {defineChain, erc20Abi} from \"viem\";\nimport useIsContract from \"../../hooks/useIsContract\";\nimport {Lottie} from \"../../ui\";\nimport {successImg, failImg} from \"assets/lottie\";\n\nexport default function ImportToken ({close}: {\n close: () => void\n}) {\n const [status,setStatus] = useState<''|'success'|'fail'>('')\n const {token} = useUserInfo()\n const [address, setAddress] = useState(\"\")\n const [symbol, setSymbol] = useState(\"\")\n const [decimals, setDecimals] = useState(\"\")\n const [error, setError] = useState<{\n address?: string,\n symbol?: string,\n decimals?: string\n }>({})\n const {publicClient, chainId,chain} = useMatchChain()\n const getContractInfo = async () => {\n if (!publicClient) return;\n\n const calls = [\n {\n address: address as `0x${string}`,\n abi: erc20Abi as Abi,\n functionName: \"symbol\",\n args: []\n },\n {\n address: address as `0x${string}`,\n abi: erc20Abi as Abi,\n functionName: \"decimals\",\n args: []\n },\n\n ];\n try {\n const results = await publicClient.multicall({contracts: calls});\n console.log('results', results)\n\n if (!symbol && results[0]?.status == 'success') {\n setSymbol(results[0]?.result as string)\n }\n if (!decimals && results[1]?.status == 'success') {\n setDecimals((results[1]?.result as number).toString())\n }\n } catch (error: any) {\n setError({\n address: error.message\n })\n }\n\n }\n const intl = useIntl()\n useEffect(() => {\n if (address.length === 42) {\n const reg = /^0x[0-9a-fA-F]{40}$/;\n if (!reg.test(address)) {\n setError({\n ...error,\n address: intl.formatMessage({\n id: \"tokenAddressError\"\n })\n })\n } else {\n setError({\n ...error,\n address: \"\"\n })\n publicClient && getContractInfo()\n }\n }\n }, [address, publicClient]);\n const [loading, setLoading] = useState(false)\n const toast = useToast()\n const queryClient = useQueryClient();\n\n const onImport = async () => {\n setLoading(true)\n try {\n const res = await userImportTokenApi({\n chain_id: chainId?.toString() || '',\n symbol,\n address,\n decimals\n })\n if (isSuccess(res)) {\n // toast.success(intl.formatMessage({\n // id: \"importSuccess\"\n // }))\n setStatus('success')\n queryClient.invalidateQueries({\n queryKey: [USER_IMPORT_TOKEN_LIST_KEY, token, chainId]\n })\n // close()\n } else {\n setStatus('fail')\n toast.error(res.message)\n }\n } catch (error: any) {\n setStatus('fail')\n toast.error(error.message)\n } finally {\n setLoading(false)\n }\n\n }\n\n const canImport = useMemo(() => {\n if (!address) {\n return false\n }\n if (!symbol) {\n return false\n }\n if (decimals.length === 0) {\n return false\n }\n const reg = /^0x[0-9a-fA-F]{40}$/;\n if (!reg.test(address)) {\n return false\n }\n return true;\n }, [error, address, symbol, decimals])\n\n const isContractQuery = useIsContract({\n //@ts-ignore\n chain:defineChain(chain),\n address,\n enabled:canImport\n })\n\n if(status=='success'||status=='fail'){\n return <div className={`matchid-import-token-result matchid-flex`}>\n <div className={`matchid-import-token-result-box matchid-flex`}>\n <div className={`matchid-import-token-result-img`}>\n <Lottie animationData={status=='success'?successImg:failImg} style={{\n width: \"96px\",\n height: \"96px\",\n }} />\n </div>\n <div className={`matchid-import-token-result-text matchid-import-token-result-text-${status}`}>\n {status=='success'?<FormattedMessage id={\"importSuccess\"}/>:<FormattedMessage id={\"importFail\"}/>}\n </div>\n </div>\n {status=='success' ? <Button size={\"lg\"} onClick={close} block highlight><FormattedMessage id={\"close\"}/></Button>\n : <Button size={\"lg\"} onClick={()=>setStatus('')} block highlight><FormattedMessage id=\"back\"/></Button>}\n </div>\n }\n\n return <div className={`matchid-import-token`}>\n <div className={\"matchid-import-token-form\"}>\n <Field label={intl.formatMessage({\n id: \"tokenSmartContract\"\n })} error={error.address ? error.address : (\n isContractQuery.isFetched&&!isContractQuery.isLoading&&!isContractQuery.data&&canImport?\"Address isn't a contract address\":''\n )}>\n <Input placeholder={intl.formatMessage({\n id: \"tokenSmartContractPlaceholder\"\n })} value={address}\n onChange={(e) => setAddress(e.target.value)} maxLength={42}/>\n </Field>\n <Field label={intl.formatMessage({\n id: \"tokenSymbol\"\n })} error={error.symbol}>\n <Input placeholder={intl.formatMessage({\n id: \"tokenSymbolPlaceholder\"\n })} value={symbol} onChange={(e) => setSymbol(e.target.value)}\n maxLength={16}/>\n </Field>\n <Field label={intl.formatMessage({\n id: \"tokenDecimals\"\n })} error={error.decimals}>\n <Input placeholder={intl.formatMessage({\n id: \"tokenDecimalsPlaceholder\"\n })} type={\"number\"} value={decimals}\n onChange={(e) => setDecimals(e.target.value)}/>\n </Field>\n </div>\n <Button size={\"lg\"} onClick={onImport} block loading={loading||isContractQuery.isLoading}\n disabled={!canImport||!isContractQuery.data} highlight><FormattedMessage id={\"import\"}/></Button>\n </div>\n}","import {Chain, createPublicClient, http} from \"viem\";\nimport {useQuery} from \"@tanstack/react-query\";\n\nexport default function useIsContract({\n address,\n chain,\n enabled,\n }: {\n address: string,\n chain: Chain,\n enabled?: boolean\n}) {\n return useQuery<boolean>({\n queryKey: [\"is_contract\", chain?.id, address],\n queryFn: async () => {\n if (!chain) return false;\n if (!address) return false;\n const publicClient = createPublicClient({\n chain,\n transport: http()\n })\n const res = await publicClient.getCode({address: address as `0x${string}`})\n return res !== null && res !== undefined;\n },\n enabled\n });\n}","import { useState, useCallback, useEffect } from \"react\";\nimport {useMatchChain} from \"./index\";\nimport {useQuery} from \"@tanstack/react-query\";\nimport {createPublicClient, defineChain, http} from \"viem\";\nconst CACHE_TTL = 86400 * 30 * 1000;\nconst MAX_CACHE_SIZE = 500;\nconst STORAGE_KEY = \"match_receipt_logs\";\n\ntype CacheEntry<V> = {\n value: V;\n timestamp: number;\n};\n\nexport function useReceiptCache<K extends string, V>() {\n const [cache, setCache] = useState<Map<K, CacheEntry<V>>>(new Map());\n\n const isLocalStorageAvailable = (() => {\n try {\n const testKey = \"__test__\";\n localStorage.setItem(testKey, \"1\");\n localStorage.removeItem(testKey);\n return true;\n } catch (e) {\n return false;\n }\n })();\n\n useEffect(() => {\n if (isLocalStorageAvailable) {\n try {\n const storedData = localStorage.getItem(STORAGE_KEY);\n if (storedData) {\n try {\n const parsed = JSON.parse(storedData) as Record<K, CacheEntry<V>>;\n const now = Date.now();\n\n const validEntries: [K, CacheEntry<V>][] = Object.entries(parsed)\n .filter(([_, entry]) => typeof entry === \"object\" && entry !== null && \"timestamp\" in entry && now - (entry as CacheEntry<V>).timestamp <= CACHE_TTL)\n .map(([key, entry]) => [key as K, entry as CacheEntry<V>]);\n\n setCache(new Map(validEntries));\n\n } catch (e) {\n console.error(\"Failed to parse cache from localStorage:\", e);\n }\n }\n\n } catch (e) {\n console.error(\"Failed to load cache from localStorage:\", e);\n }\n }\n }, []);\n\n const updateLocalStorage = useCallback((updatedCache: Map<K, CacheEntry<V>>) => {\n if (isLocalStorageAvailable) {\n try {\n const storedData = localStorage.getItem(STORAGE_KEY);\n let parsed: Record<K, CacheEntry<V>> = {} as Record<K, CacheEntry<V>>;\n if (storedData) {\n parsed = JSON.parse(storedData) as Record<K, CacheEntry<V>>;\n }\n\n updatedCache.forEach((entry, key) => {\n parsed[key] = entry;\n });\n\n localStorage.setItem(STORAGE_KEY, JSON.stringify(parsed));\n } catch (e) {\n console.error(\"Failed to update localStorage:\", e);\n }\n }\n }, []);\n\n // set cache\n const set = useCallback((key: K, value: V) => {\n const now = Date.now();\n const newCache = new Map(cache);\n\n // clear expired\n newCache.forEach((entry, k) => {\n if (now - entry.timestamp > CACHE_TTL) {\n newCache.delete(k);\n }\n });\n\n // max cache size\n if (newCache.size >= MAX_CACHE_SIZE) {\n const firstKey = newCache.keys().next().value as K | undefined;\n if (firstKey !== undefined) {\n newCache.delete(firstKey);\n }\n }\n\n // set new value\n newCache.set(key, { value, timestamp: now });\n setCache(newCache);\n updateLocalStorage(newCache);\n }, [cache, updateLocalStorage]);\n\n // get cache\n const get = useCallback((key: K): V | undefined => {\n const entry = cache.get(key);\n if (entry) {\n // check if expired\n if (Date.now() - entry.timestamp > CACHE_TTL) {\n const newCache = new Map(cache);\n newCache.delete(key);\n setCache(newCache);\n updateLocalStorage(newCache);\n return undefined;\n }\n return entry.value;\n }\n return undefined;\n }, [cache, updateLocalStorage]);\n\n // del cache\n const del = useCallback((key: K) => {\n if (cache.has(key)) {\n const newCache = new Map(cache);\n newCache.delete(key);\n setCache(newCache);\n updateLocalStorage(newCache);\n }\n }, [cache, updateLocalStorage]);\n\n // clear cache\n const clear = useCallback(() => {\n setCache(new Map());\n if (isLocalStorageAvailable) {\n localStorage.removeItem(STORAGE_KEY);\n }\n }, [isLocalStorageAvailable]);\n\n return { set, get, del, clear };\n}\n\n\nexport default function useReceipt({\n chainId,\n hash\n }:{\n chainId: number,\n hash: string\n}){\n const {list} = useMatchChain()\n const cache = useReceiptCache<string, any>()\n const chain = list?.find((item) => item.id === chainId)\n const [shouldRefetch, setShouldRefetch] = useState(true)\n\n const query = useQuery({\n queryKey: ['match-tx-receipt', hash, chain],\n queryFn: async () => {\n if (!chain || !hash) return false\n const cacheKey = `${chain.id}-${hash}`\n if (cache.get(cacheKey)) {\n return cache.get(cacheKey)\n }\n try {\n const publicClient = createPublicClient({\n chain: defineChain(chain),\n transport: http(),\n });\n const receipt = await publicClient.getTransactionReceipt({hash: hash as `0x${string}`});\n if (!receipt) {\n return false\n }\n cache.set(cacheKey, receipt)\n return receipt\n } catch (e) {\n return false\n }\n },\n refetchInterval: shouldRefetch ? 10000 : false,\n })\n\n useEffect(() => {\n if (query.data) {\n setShouldRefetch(false)\n }\n }, [query.data]);\n\n return query\n}","import { useState, useCallback, useEffect } from \"react\";\nimport {useMatchChain} from \"./index\";\nimport {useQuery} from \"@tanstack/react-query\";\nimport {createPublicClient, defineChain, http} from \"viem\";\nconst CACHE_TTL = 86400 * 30 * 1000;\nconst MAX_CACHE_SIZE = 500;\nconst STORAGE_KEY = \"match_transaction_logs\";\n\ntype CacheEntry<V> = {\n value: V;\n timestamp: number;\n};\n\nexport function useTransactionCache<K extends string, V>() {\n const [cache, setCache] = useState<Map<K, CacheEntry<V>>>(new Map());\n\n const isLocalStorageAvailable = (() => {\n try {\n const testKey = \"__test__\";\n localStorage.setItem(testKey, \"1\");\n localStorage.removeItem(testKey);\n return true;\n } catch (e) {\n return false;\n }\n })();\n\n useEffect(() => {\n if (isLocalStorageAvailable) {\n try {\n const storedData = localStorage.getItem(STORAGE_KEY);\n if (storedData) {\n try {\n const parsed = JSON.parse(storedData) as Record<K, CacheEntry<V>>;\n const now = Date.now();\n\n const validEntries: [K, CacheEntry<V>][] = Object.entries(parsed)\n .filter(([_, entry]) => typeof entry === \"object\" && entry !== null && \"timestamp\" in entry && now - (entry as CacheEntry<V>).timestamp <= CACHE_TTL)\n .map(([key, entry]) => [key as K, entry as CacheEntry<V>]);\n\n setCache(new Map(validEntries));\n\n } catch (e) {\n console.error(\"Failed to parse cache from localStorage:\", e);\n }\n }\n\n } catch (e) {\n console.error(\"Failed to load cache from localStorage:\", e);\n }\n }\n }, []);\n\n const updateLocalStorage = useCallback((updatedCache: Map<K, CacheEntry<V>>) => {\n if (isLocalStorageAvailable) {\n try {\n const storedData = localStorage.getItem(STORAGE_KEY);\n let parsed: Record<K, CacheEntry<V>> = {} as Record<K, CacheEntry<V>>;\n if (storedData) {\n parsed = JSON.parse(storedData) as Record<K, CacheEntry<V>>;\n }\n\n updatedCache.forEach((entry, key) => {\n parsed[key] = entry;\n });\n\n localStorage.setItem(STORAGE_KEY, JSON.stringify(parsed));\n } catch (e) {\n console.error(\"Failed to update localStorage:\", e);\n }\n }\n }, []);\n\n // set cache\n const set = useCallback((key: K, value: V) => {\n const now = Date.now();\n const newCache = new Map(cache);\n\n // clear expired\n newCache.forEach((entry, k) => {\n if (now - entry.timestamp > CACHE_TTL) {\n newCache.delete(k);\n }\n });\n\n // max cache size\n if (newCache.size >= MAX_CACHE_SIZE) {\n const firstKey = newCache.keys().next().value as K | undefined;\n if (firstKey !== undefined) {\n newCache.delete(firstKey);\n }\n }\n\n // set new value\n newCache.set(key, { value, timestamp: now });\n setCache(newCache);\n updateLocalStorage(newCache);\n }, [cache, updateLocalStorage]);\n\n // get cache\n const get = useCallback((key: K): V | undefined => {\n const entry = cache.get(key);\n if (entry) {\n // check if expired\n if (Date.now() - entry.timestamp > CACHE_TTL) {\n const newCache = new Map(cache);\n newCache.delete(key);\n setCache(newCache);\n updateLocalStorage(newCache);\n return undefined;\n }\n return entry.value;\n }\n return undefined;\n }, [cache, updateLocalStorage]);\n\n // del cache\n const del = useCallback((key: K) => {\n if (cache.has(key)) {\n const newCache = new Map(cache);\n newCache.delete(key);\n setCache(newCache);\n updateLocalStorage(newCache);\n }\n }, [cache, updateLocalStorage]);\n\n // clear cache\n const clear = useCallback(() => {\n setCache(new Map());\n if (isLocalStorageAvailable) {\n localStorage.removeItem(STORAGE_KEY);\n }\n }, [isLocalStorageAvailable]);\n\n return { set, get, del, clear };\n}\n\n\nexport default function useTransaction({\n chainId,\n hash\n }:{\n chainId: number,\n hash: string\n}){\n const {list} = useMatchChain()\n const cache = useTransactionCache<string, any>()\n const chain = list?.find((item) => item.id === chainId)\n const [shouldRefetch, setShouldRefetch] = useState(true)\n\n const query = useQuery({\n queryKey: ['match-tx-transaction', hash, chain],\n queryFn: async () => {\n if (!chain || !hash) return false\n const cacheKey = `${chain.id}-${hash}`\n if (cache.get(cacheKey)) {\n return cache.get(cacheKey)\n }\n try {\n const publicClient = createPublicClient({\n chain: defineChain(chain),\n transport: http(),\n });\n const transaction = await publicClient.getTransaction({hash: hash as `0x${string}`});\n if (!transaction) {\n return false\n }\n cache.set(cacheKey, transaction)\n return transaction\n } catch (e) {\n return false\n }\n },\n refetchInterval: shouldRefetch ? 10000 : false,\n })\n\n useEffect(() => {\n if (query.data) {\n setShouldRefetch(false)\n }\n }, [query.data]);\n\n return query\n}","import {create} from 'zustand';\nimport {CEXType, WalletType} from \"../types/types\";\nimport {Chain} from \"viem\";\nimport {DEFAULT_WALLET_METHODS} from \"../hooks/useConfig\";\n\n// export const useEVMModalStore = create<{\n// isOpen: boolean,\n// type: 'bind' | 'login' | ''\n// open: (type: 'bind' | 'login') => void,\n// close: () => void\n// }>(set => ({\n// isOpen: false,\n// type: '',\n// open: (type: 'bind' | 'login') => set({isOpen: true, type}),\n// close: () => set({isOpen: false})\n// }));\n\ntype WalletModalType = {\n isOpen: boolean,\n type: 'bind' | 'login' | ''\n open: (type: 'bind' | 'login') => void,\n close: () => void\n}\n\nexport const useTRONModalStore = create<WalletModalType>(set => ({\n isOpen: false,\n type: '',\n open: (type: 'bind' | 'login') => set({isOpen: true, type}),\n close: () => set({isOpen: false})\n}));\n\nexport const useTONModalStore = create<WalletModalType>(set => ({\n isOpen: false,\n type: '',\n open: (type: 'bind' | 'login') => set({isOpen: true, type}),\n close: () => set({isOpen: false})\n}));\n\nexport const useBTCModalStore = create<WalletModalType>(set => ({\n isOpen: false,\n type: '',\n open: (type: 'bind' | 'login') => set({isOpen: true, type}),\n close: () => set({isOpen: false})\n}));\nexport const useEVMModalStore = create<WalletModalType>(set => ({\n isOpen: false,\n type: '',\n open: (type: 'bind' | 'login') => set({isOpen: true, type}),\n close: () => set({isOpen: false})\n}));\n\nexport const useCEXBindModalStore = create<{\n type: CEXType | ''\n isOpen: boolean,\n open: (type: CEXType) => void,\n close: () => void\n}>(set => ({\n type: '',\n isOpen: false,\n open: (type: CEXType) => set({isOpen: true, type}),\n close: () => set({isOpen: false})\n}));\n\n\nexport const useWalletModalStore = create<{\n isOpen: boolean,\n type: 'bind' | 'login' | ''\n methods?: WalletType[]\n open: (type: 'bind' | 'login', methods?: WalletType[]) => void,\n close: () => void\n}>(set => ({\n isOpen: false,\n type: '',\n methods: [],\n open: (type: 'bind' | 'login', methods = DEFAULT_WALLET_METHODS) => set({isOpen: true, type, methods}),\n close: () => set({isOpen: false})\n}))","import React, {useEffect, useMemo, useState} from \"react\";\nimport {isSuccess} from \"api/request\";\nimport {Button, ModalWithHeader, Field, Input} from \"components\"\nimport {bindCexApi} from \"../../api\";\nimport {CEXType, ModalWithHeaderProps} from \"../../types/types\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport {useUserInfo} from \"../../hooks\";\nimport eventManager from \"../../hooks/eventManager\";\nimport {useMatch} from \"../../MatchContext\";\n\nexport default function CEXBindModal({\n onClose,\n type,\n isOpen = false,\n ...props\n }: {\n type: CEXType | '',\n onClose: () => void,\n} & ModalWithHeaderProps) {\n const intl = useIntl()\n const {events} = useMatch()\n\n const [APIPassphrase, setAPIPassphrase] = useState<string>('')\n const {refreshOverview} = useUserInfo()\n const [loading, setLoading] = useState<boolean>(false)\n const [key, setKey] = useState<string>('')\n const [secret, setSecret] = useState<string>('')\n const [error, setError] = useState<string>('')\n const needPassphrase = useMemo(()=>{\n return ['bitget','okx'].includes(type.toLowerCase())\n },[type])\n useEffect(() => {\n if (isOpen) {\n setSecret('')\n setKey('')\n setAPIPassphrase('')\n setError('')\n setLoading(false)\n\n }\n }, [isOpen]);\n\n const SubmitApi = async () => {\n try {\n setLoading(true)\n const res = await bindCexApi({\n cex: type,\n api_key: key,\n api_secret: secret,\n ...(needPassphrase ? {api_passphrase: APIPassphrase} : {})\n });\n if (isSuccess(res)) {\n\n await refreshOverview()\n events!.onBind && events!.onBind({\n type: 'cex_' + type\n })\n eventManager.emit('onBind', {\n type: 'cex_' + type\n })\n onClose()\n }else{\n throw new Error(res.message)\n }\n\n\n } catch (error: any) {\n console.error(error)\n setError(error.message)\n }finally {\n setLoading(false)\n }\n }\n return <ModalWithHeader showClose isOpen={isOpen} onClose={onClose} title={intl.formatMessage({\n id: \"CEXBindTitle\"\n }, {\n type\n })} {...props}>\n <div className={\"matchid-cex-modal\"}>\n <div>\n <p><FormattedMessage id=\"CEXBindAttention\"/></p>\n <p><FormattedMessage id=\"CEXBindTips1\"/></p>\n <p><FormattedMessage id=\"CEXBindTips2\"/></p>\n <p><FormattedMessage id=\"CEXBindTips3\"/></p>\n </div>\n <Field label={intl.formatMessage({\n id: \"CEXBindApiKey\"\n })}>\n <Input value={key}\n onChange={(e) => setKey(e.target.value)}\n placeholder='**** **** ****'\n />\n </Field>\n <Field label={intl.formatMessage({\n id: \"CEXBindApiSecretKey\"\n })} error={!needPassphrase && error}>\n <Input value={secret}\n onChange={(e) => setSecret(e.target.value)}\n placeholder='**** **** ****'\n />\n </Field>\n {\n needPassphrase && <Field error={error} label={intl.formatMessage({\n id: \"CEXBindApiPassphrase\"\n })}>\n <Input value={APIPassphrase}\n onChange={(e) => setAPIPassphrase(e.target.value)}\n placeholder='**** **** ****'\n />\n </Field>\n }\n <Button onClick={SubmitApi} size=\"lg\" block loading={loading}\n disabled={!key || !secret}><FormattedMessage id={\"continue\"}/></Button>\n\n </div>\n\n </ModalWithHeader>\n}","import React, {PropsWithChildren, useEffect} from \"react\";\nimport {useUserInfo} from \"../hooks\";\nimport {\n useBTCModalStore,\n useCEXBindModalStore,\n useEVMModalStore,\n useTONModalStore,\n useTRONModalStore,\n useWalletModalStore,\n} from \"../store/useModalStore\";\nimport {BTCModal, TRONModal, TONModal, WalletModal, EVMModal} from \"../components\";\nimport CEXBindModal from \"../components/CEXBindModal\";\nimport {useQuery} from \"@tanstack/react-query\";\nimport {getTgAppLoginStatus} from \"../api\";\nimport {isSuccess} from \"../api/request\";\nimport useStore from \"../store/useStore\";\nimport {useMatch} from \"../MatchContext\";\n\nexport default function BusinessProvider({children}: PropsWithChildren) {\n const {overview, token} = useUserInfo()\n const {type: EVMType, isOpen: EVMIsOpen, close: EVMClose} = useEVMModalStore()\n const {type: TONType, isOpen: TONIsOpen, close: TONClose} = useTONModalStore()\n const {type: TRONType, isOpen: TRONIsOpen, close: TRONClose} = useTRONModalStore()\n const {type: BTCType, isOpen: BTCIsOpen, close: BTCClose} = useBTCModalStore()\n const {type: CEXType, isOpen: CEXIsOpen, close: CEXClose} = useCEXBindModalStore()\n const WalletModalStore = useWalletModalStore()\n const {tgAppAuthCode,setTgAppAuthCode} = useStore();\n const {login} = useMatch()\n\n const walletModalClose = (func:()=>void)=>{\n WalletModalStore.close()\n func()\n }\n\n useQuery({\n queryKey: ['matchid-tgapp-login',tgAppAuthCode],\n queryFn: async()=>{\n const res = await getTgAppLoginStatus({\n code:tgAppAuthCode\n })\n if(isSuccess(res)){\n setTgAppAuthCode('')\n await login({\n // mid:'',\n token: `${res.data.token_type} ${res.data.access_token}`\n })\n return true\n }\n return false\n },\n enabled: !!tgAppAuthCode,\n refetchInterval: 1000 * 5,\n })\n\n return (\n <>\n <EVMModal\n isOpen={EVMIsOpen && ((EVMType == 'login' && !overview && !token) || (EVMType == 'bind' && !!token && !!overview))}\n onClose={EVMClose} type={EVMType} onSuccess={()=>walletModalClose(EVMClose)} zIndex={199}/>\n <TRONModal\n isOpen={TRONIsOpen && ((TRONType == 'login' && !overview && !token) || (TRONType == 'bind' && !!token && !!overview))}\n onClose={TRONClose} type={TRONType} onSuccess={()=>walletModalClose(TRONClose)} zIndex={199}/>\n <TONModal\n isOpen={TONIsOpen && ((TONType == 'login' && !overview && !token) || (TONType == 'bind' && !!token && !!overview))}\n onClose={TONClose} type={TONType} onSuccess={()=>walletModalClose(TONClose)} zIndex={199}/>\n <BTCModal\n isOpen={BTCIsOpen && ((BTCType == 'login' && !overview && !token) || (BTCType == 'bind' && !!token && !!overview))}\n onClose={BTCClose} type={BTCType} onSuccess={()=>walletModalClose(BTCClose)} zIndex={199}/>\n <CEXBindModal isOpen={CEXIsOpen && (!!token && !!overview)}\n onClose={CEXClose} type={CEXType} zIndex={199}/>\n <WalletModal\n isOpen={WalletModalStore.isOpen && ((WalletModalStore.type == 'login' && !overview && !token) || (WalletModalStore.type == 'bind' && !!token && !!overview))}\n onClose={WalletModalStore.close} type={WalletModalStore.type} methods={WalletModalStore.methods} zIndex={150}/>\n {children}\n </>\n );\n\n}","import React, {PropsWithChildren} from 'react';\nimport BusinessProvider from \"./BusinessProvider\";\nimport {ModalProvider} from \"./ModalContext\";\nimport {ToastProvider} from \"./ToastContext\";\n\nconst Providers = ({children}: PropsWithChildren) => {\n return (\n <ToastProvider>\n <ModalProvider>\n <BusinessProvider>\n {children}\n </BusinessProvider>\n </ModalProvider>\n </ToastProvider>\n );\n};\n\nexport default Providers;\n","import useLocalStore from \"../store/useLocalStore\";\nimport {useEffect, useRef, useState} from \"react\";\nimport matchlog from \"../utils/matchlog\";\nimport useWallet from \"./useWallet\";\nimport {WalletReceiveMessageType} from \"../types\";\nimport {sendMessage} from \"../utils/wallet\";\nimport useStore from \"../store/useStore\";\nimport {encodeBase64, getAppClientId} from \"../utils\";\nimport {WalletConfigType} from \"../types/types\";\nimport useUserInfo from \"./useUserInfo\";\nimport {getLocale} from \"../store\";\n\nconst getWalletIframe = () => {\n return document.getElementById('match-wallet') as HTMLIFrameElement\n}\nconst AppClientId = getAppClientId()\n\nexport default function useWalletInit({\n config\n }: {\n config: WalletConfigType\n}) {\n const {endpoints, token, setWallet, appid,refreshOverview} = useLocalStore();\n const {setWalletReady, walletReady} = useStore()\n const iframeReadyRef = useRef(walletReady)\n useEffect(() => {\n setWallet(config)\n }, [config]);\n useEffect(() => {\n matchlog.log('sdk.mpc.status', walletReady, iframeReadyRef.current)\n iframeReadyRef.current = walletReady\n if (iframeReadyRef.current) {\n const onReady = async () => {\n if (window.matchProvider.walletMessageStack.length > 0) {\n const stack = window.matchProvider.walletMessageStack\n window.matchProvider.walletMessageStack = []\n for (let i = 0; i < stack.length; i++) {\n const item = stack[i]\n sendMessage(item)\n }\n }\n }\n onReady()\n }\n }, [walletReady]);\n //create an iframe in page body\n useEffect(() => {\n if (!endpoints.auth || !appid || !token || !config) {\n const existingIframe = getWalletIframe();\n if (existingIframe) {\n //remove iframe\n existingIframe.remove()\n }\n return\n }\n if (endpoints.auth) {\n const existingIframe = getWalletIframe();\n const query = {\n appid,\n appClientId: AppClientId,\n initParams:encodeBase64(JSON.stringify({\n access_token: token,\n type:config.type\n }))\n }\n const url = endpoints.auth + 'wallet/2?' + new URLSearchParams(query).toString()\n if (!existingIframe) {\n const createIframe = () => {\n const iframe = document.createElement('iframe');\n iframe.id = 'match-wallet';\n iframe.src = url\n iframe.style.display = 'none';\n iframe.style.width = '0';\n iframe.style.height = '0';\n iframe.style.position = 'fixed';\n iframe.style.zIndex = '200'\n // iframe.style.background = \"rgba(45, 60, 82, 0.50)\"\n // iframe.style.backdropFilter = \"blur(4px)\"\n //@ts-ignore\n //add on error console\n iframe.onerror = (e) => {\n console.error('sdk.mpc.error', e)\n }\n document.body.insertBefore(iframe, document.body.firstChild);\n }\n createIframe();\n if (!window.matchProvider) {\n window.matchProvider = {\n transactionMessageIntervalMap: {},\n walletMessageMap: {},\n walletMessageStack: [],\n sendWalletMessage: ({\n method,\n data = {},\n }) => {\n\n const messageId = Date.now().toString() + Math.random().toString().slice(6)\n const message = {\n method,\n data,\n messageId,\n source: \"matchid\",\n version: 1,\n locale:getLocale()\n }\n\n try {\n matchlog.log('sdk.mpc.send', message, endpoints.auth)\n getWalletIframe()?.contentWindow?.postMessage(message, endpoints.auth);\n } catch (error) {\n console.error('sdk.mpc.sendError', error)\n }\n return messageId\n },\n waitUntilWalletMessage: async ({\n method,\n data = {},\n timeout = 30000\n }) => {\n return new Promise((resolve, reject) => {\n try {\n if (iframeReadyRef.current && window.matchProvider.walletMessageStack.length == 0) {\n sendMessage({\n method,\n data,\n resolve,\n reject,\n timeout\n })\n return\n }\n //if iframe not ready or stack has data need to send, push to stack\n window.matchProvider.walletMessageStack.push({\n method,\n data,\n timeout,\n resolve,\n reject\n })\n } catch (error: any) {\n reject(error)\n }\n })\n }\n }\n }\n\n } else {\n if (existingIframe.src !== url) {\n setWalletReady(false);\n existingIframe.src = url\n }\n }\n }\n\n }, [endpoints.auth, appid, token, config]);\n useEffect(() => {\n const messageHandle = async (e: MessageEvent) => {\n //origin\n if (e.origin !== endpoints.auth.substring(0, endpoints.auth.length - 1)) {\n return\n }\n const res = e.data as WalletReceiveMessageType\n if (res.source != 'match-wallet') {\n return\n }\n matchlog.log('sdk.mpc.receive', e)\n\n const messageId = res.messageId\n if (messageId == 'ready') {\n matchlog.log('sdk.mpc.ready')\n setWalletReady(true)\n window.matchProvider.sendWalletMessage({\n method: 'readied'\n })\n //send readied message\n return\n }\n if (messageId == 'openIframe') {\n const iframe = getWalletIframe()\n if (iframe) {\n iframe.style.display = 'block'\n iframe.style.width = '100vw'\n iframe.style.height = '100vh'\n iframe.style.right = '0'\n iframe.style.top = '0'\n }\n return\n }\n if (messageId == 'closeIframe') {\n const iframe = getWalletIframe()\n if (iframe) {\n iframe.style.display = 'none'\n iframe.style.width = '0'\n iframe.style.height = '0'\n iframe.style.right = '0'\n iframe.style.top = '0'\n }\n return\n }\n if (messageId == 'refreshOverview') {\n refreshOverview()\n return\n }\n if (messageId == 'updateTransactionData') {\n const {data, rootData, transactionId} = res.data\n if (window.matchProvider.transactionMessageIntervalMap[transactionId] && window.matchProvider.transactionMessageIntervalMap[transactionId].transaction.data == rootData) {\n window.matchProvider.transactionMessageIntervalMap[transactionId].transaction.data = data\n const {func} = window.matchProvider.transactionMessageIntervalMap[transactionId]\n func()\n }\n return\n }\n if (messageId && window.matchProvider.walletMessageMap[messageId]) {\n const {resolve, reject, timeout} = window.matchProvider.walletMessageMap[messageId]\n clearTimeout(timeout!)\n if (res.method == 'ping') {\n delete window.matchProvider.walletMessageMap[messageId].timeout\n return\n }\n delete window.matchProvider.walletMessageMap[messageId]\n if (res.status == 'success') {\n resolve(res.data)\n } else {\n console.error('sdk.mpc.fail', res)\n reject(new Error(res.data.message))\n }\n }\n }\n window.addEventListener('message', messageHandle)\n return () => {\n window.removeEventListener('message', messageHandle)\n }\n\n }, []);\n\n return {\n walletReady\n }\n}","import {IEnvConfigType, IEnvName, IMatchEvents, LocaleType} from \"../types/types\";\nimport React, {useEffect, useRef} from \"react\";\nimport useLocalStore from \"../store/useLocalStore\";\nimport eventManager from \"./eventManager\";\nimport {getOverviewInfoApi, getTgAppLoginStatus} from \"../api\";\nimport env from \"../config/env\";\nimport matchlog from \"../utils/matchlog\";\nimport {useWalletModalStore} from \"../store/useModalStore\";\nimport useStore from \"../store/useStore\";\nimport {useQuery} from \"@tanstack/react-query\";\nimport {isSuccess} from \"../api/request\";\nimport {decodeBase64} from \"../utils\";\n\nexport default function useInit({\n theme,\n appid,\n events,\n endpoints,\n locale\n }: {\n theme: \"light\" | \"dark\";\n appid: string;\n endpoints?: IEnvConfigType['endpoints']\n events?: IMatchEvents\n locale?: LocaleType\n}) {\n\n const {\n setAppid,\n setEndpoints,\n setToken,\n setMid,\n token,\n setOverview,\n setTheme,\n setLocale,\n locale:realLocale\n } = useLocalStore();\n const walletModalStore = useWalletModalStore();\n const overviewLoadingRef = useRef(false);\n\n const searchParams = new URLSearchParams(window.location.search);\n const matchToken = searchParams.get('matchToken');\n const matchidt = searchParams.get('matchidt');\n\n const realEndpoints = endpoints || env.endpoints;\n\n useEffect(() => {\n setTheme(theme)\n }, [theme])\n\n useEffect(() => {\n setAppid(appid);\n }, [appid]);\n\n useEffect(() => {\n setEndpoints(realEndpoints);\n }, [realEndpoints]);\n\n useEffect(()=>{\n setLocale(locale||'en')\n },[locale])\n\n useEffect(() => {\n if (matchToken) {\n const tokenData = JSON.parse(atob(matchToken));\n if (tokenData && tokenData.mid && tokenData.token) {\n login({\n // mid: tokenData.mid,\n token: \"Bearer \" + tokenData.token,\n });\n }\n }\n }, [matchToken]);\n\n useEffect(() => {\n if (matchidt) {\n const tokenData = decodeURIComponent(matchidt);\n const data = JSON.parse(decodeBase64(tokenData))\n if(data){\n matchlog.log('matchidt',data)\n if(data.action=='login'){\n const newtoken = data.token || `${data.token_type} ${data.access_token}`\n login({\n // mid: tokenData.mid,\n token:newtoken\n });\n }else if(data.action=='bind') {\n eventManager.emit('onBind', {\n type:data.type\n })\n if (events && events.onBind) {\n events.onBind({\n type:data.type\n })\n }\n }\n const url = window.location.href;\n const urlObj = new URL(url);\n urlObj.searchParams.delete('matchidt');\n window.history.replaceState({}, '', urlObj.toString());\n return;\n }\n }\n }, [matchidt]);\n\n useEffect(() => {\n const onLoginMessage = (event: MessageEvent) => {\n const res = event.data;\n if (res.event === 'login' && res.data && (res.data.token || (res.data.token_type && res.data.access_token))) {\n login({\n // mid: res.data.mid,\n token: res.data.token || `${res.data.token_type} ${res.data.access_token}`,\n });\n } else if (res.event == 'bind') {\n walletModalStore.close()\n eventManager.emit('onBind', res.data)\n if (events && events.onBind) {\n events.onBind(res.data)\n }\n }\n }\n window.addEventListener('message', onLoginMessage);\n return () => {\n window.removeEventListener('message', onLoginMessage);\n };\n }, []);\n\n const loadOverview = async () => {\n matchlog.log('loadOverview')\n if (overviewLoadingRef.current) {\n return;\n }\n overviewLoadingRef.current = true;\n try {\n const res = await getOverviewInfoApi();\n\n setOverview(res.data)\n\n return res.data;\n } catch (err) {\n console.error('overview error', err);\n } finally {\n overviewLoadingRef.current = false;\n }\n };\n\n useEffect(() => {\n if (token) {\n loadOverview();\n }\n }, [token]);\n\n const login = async ({ token}: { token: string }) => {\n // setMid(mid);\n setToken(token);\n const overview = await loadOverview();\n\n eventManager.emit('onLogin', {\n // mid,\n token,\n did: overview?.did as string,\n });\n if (events && events?.onLogin) {\n events.onLogin({\n // mid,\n token,\n did: overview?.did as string,\n });\n }\n };\n\n\n\n return {\n loadOverview,\n login,\n endpoints:realEndpoints,\n locale:realLocale\n }\n\n}","import {defineChain} from \"viem\";\n\nexport const matchMain = /*#__PURE__*/ defineChain({\n //定义match链\n id: 698,\n name: \"Matchain\",\n nativeCurrency: { name: \"Match Coin\", symbol: \"BNB\", decimals: 18 },\n rpcUrls: {\n default: {\n http: [\"https://rpc.matchain.io\"],\n },\n },\n blockExplorers: {\n default: {\n name: \"Matchscan\",\n url: \"https://matchscan.io/\",\n apiUrl: \"https://matchscan.io/api\",\n },\n },\n iconUrl: \"https://matchscan.io/static/identicon_logos/blockies.png\",\n contracts: {\n multicall3: {\n address: \"0xca11bde05977b3631167028862be2a173976ca11\",\n }\n },\n // testnet: true,\n});","\nimport { defineChain } from \"viem\"\n\nexport const matchTest = /*#__PURE__*/ defineChain({\n //定义matchTest链\n id: 699,\n name: \"MatchTest\",\n nativeCurrency: { name: \"Match Coin\", symbol: \"BNB\", decimals: 18 },\n rpcUrls: {\n default: {\n http: [\"https://testnet-rpc.matchain.io\"],\n },\n },\n blockExplorers: {\n default: {\n name: \"Matchscan\",\n url: \"https://testnet.matchscan.io/\",\n apiUrl: \"https://testnet.matchscan.io/api\",\n },\n },\n iconUrl: \"https://testnet.matchscan.io/static/identicon_logos/blockies.png\",\n contracts: {\n multicall3: {\n address: \"0xca11bde05977b3631167028862be2a173976ca11\",\n blockCreated: 751532,\n },\n ensRegistry: { address: \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\" },\n ensUniversalResolver: {\n address: \"0xc8Af999e38273D658BE1b921b88A9Ddf005769cC\",\n blockCreated: 5_317_080,\n },\n },\n // testnet: true,\n});\n","import {useQuery} from \"@tanstack/react-query\";\nimport useUserInfo from \"../useUserInfo\";\nimport type {UseQueryOptions} from \"@tanstack/react-query/src/types\";\nimport {PohItemType} from \"types/types\";\nimport {getPohListApi} from \"api\";\nexport {verifyPohApi} from \"api\";\n\nexport function usePohList(options?: Partial<Omit<UseQueryOptions<PohItemType[]>, 'queryKey' | 'queryFn'>>) {\n const {isLogin} = useUserInfo()\n return useQuery<PohItemType[]>({\n queryKey: ['pohList'],\n enabled: isLogin,\n queryFn: async () => {\n let res = await getPohListApi()\n return res.data\n },\n ...options\n })\n}","export {mintPassportNftApi,chooseIdentityApi} from \"api\""],"mappings":"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","names":["import_react_query","axios","axiosRetry","import_react","import_react","import_viem","import_zustand","import_viem","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_react_intl","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react_intl","import_jsx_runtime","import_react_intl","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_react","import_react_intl","import_react","import_jsx_runtime","import_wagmi","import_react","React","import_jsx_runtime","import_react","import_react_intl","import_react","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_react","import_react_intl","import_react","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_react_intl","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_react","import_viem","import_zustand","import_middleware","persistedState","import_react_query","import_viem","import_react_intl","import_jsx_runtime","import_react_intl","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_zustand","import_middleware","persistedState","import_jsx_runtime","import_react","import_react","import_react_dom","import_jsx_runtime","import_react_query","import_react","import_viem","import_react_intl","import_jsx_runtime","import_react","import_react_query","import_viem","import_react_intl","import_react","import_react_intl","import_react_query","import_viem","import_viem","import_react_query","import_jsx_runtime","import_jsx_runtime","import_react","import_react_query","import_viem","import_react","import_react_query","import_viem","CACHE_TTL","import_zustand","import_react","import_react_intl","import_jsx_runtime","import_react_query","import_jsx_runtime","import_jsx_runtime","import_react","AppClientId","import_react","import_react_query","import_react_intl","import_rainbowkit","import_viem","import_viem","import_wagmi","import_jsx_runtime","import_react_query"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/api/index.ts","../src/hooks/api/bind.ts","../src/store/useLocalStore.ts","../src/api/request.ts","../src/config/env/index.ts","../src/store/index.ts","../src/utils/matchlog.ts","../src/api/index.ts","../src/hooks/useUserInfo.tsx","../src/MatchContext.tsx","../src/hooks/useMatchEvents.ts","../src/hooks/eventManager.ts","../src/utils/index.tsx","../src/hooks/useWallet.tsx","../src/store/useStore.ts","../src/context/ModalContext.tsx","../src/assets/icon/BackIcon.tsx","../src/assets/icon/CloseIcon.tsx","../src/assets/icon/XIcon.tsx","../src/assets/icon/GoogleIcon.tsx","../src/assets/icon/WalletIcon.tsx","../src/assets/icon/TelegramIcon.tsx","../src/assets/icon/EmailIcon.tsx","../src/assets/icon/ArrowRightIcon.tsx","../src/assets/icon/CloseRoundIcon.tsx","../src/assets/icon/LoadingIcon.tsx","../src/assets/icon/EmailLineIcon.tsx","../src/assets/icon/UnLoginIcon.tsx","../src/assets/icon/LoginIcon.tsx","../src/assets/icon/CheckRoundIcon.tsx","../src/assets/icon/PasswordRoundIcon.tsx","../src/assets/icon/CloseEyeIcon.tsx","../src/assets/icon/OpenEyeIcon.tsx","../src/assets/icon/DeleteRoundIcon.tsx","../src/assets/icon/FacebookIcon.tsx","../src/assets/icon/ArrowLeftIcon.tsx","../src/assets/icon/GithubIcon.tsx","../src/assets/icon/DiscordIcon.tsx","../src/assets/icon/CheckIcon.tsx","../src/assets/icon/CopyIcon.tsx","../src/assets/icon/LinkedinIcon.tsx","../src/assets/icon/YoutubeIcon.tsx","../src/assets/icon/BTCDarkIcon.tsx","../src/assets/icon/BTCLightIcon.tsx","../src/assets/icon/EVMDarkIcon.tsx","../src/assets/icon/EVMLightIcon.tsx","../src/assets/icon/SOLDarkIcon.tsx","../src/assets/icon/SOLLightIcon.tsx","../src/assets/icon/TRXDarkIcon.tsx","../src/assets/icon/TRXLightIcon.tsx","../src/assets/icon/ArrowDownIcon.tsx","../src/assets/icon/LeatherIcon.tsx","../src/assets/icon/UnisatIcon.tsx","../src/assets/icon/XverseIcon.tsx","../src/assets/icon/TronLinkIcon.tsx","../src/assets/icon/OKXIcon.tsx","../src/assets/icon/BitgetIcon.tsx","../src/assets/icon/TonDarkIcon.tsx","../src/assets/icon/TonLightIcon.tsx","../src/assets/icon/ErrorRoundIcon.tsx","../src/assets/icon/InfoLineIcon.tsx","../src/assets/icon/InfoRoundIcon.tsx","../src/assets/icon/TransferIcon.tsx","../src/assets/icon/ArrowSendIcon.tsx","../src/assets/icon/PhantomIcon.tsx","../src/assets/icon/MoreIcon.tsx","../src/assets/icon/CheckboxIcon.tsx","../src/assets/icon/CheckboxCheckedIcon.tsx","../src/assets/icon/InputLengthIcon.tsx","../src/ui/Button/index.tsx","../src/ui/Overlay/index.tsx","../src/ui/Drawer/index.tsx","../src/ui/Field/index.tsx","../src/ui/HashPanel/index.tsx","../src/hooks/useLayout.tsx","../src/ui/Modal/index.tsx","../src/components/EmailModal/index.tsx","../src/components/EmailModal/StepEmail.tsx","../src/ui/Input/index.tsx","../src/components/EmailModal/StepVerify.tsx","../src/ui/Popover/index.tsx","../src/components/LoginBox/index.tsx","../src/hooks/useConfig.tsx","../src/hooks/useAppConfig.ts","../src/components/LoginButton/index.tsx","../src/components/LoginPanel/index.tsx","../src/components/LoginModal/index.tsx","../src/components/UserPopover/index.tsx","../src/assets/icon/ProfileIcon.tsx","../src/components/UsernameModal/index.tsx","../src/components/EVMModal/index.tsx","../src/components/WalletModalContent/index.tsx","../src/hooks/useWalletBox.ts","../src/hooks/useEthersSigner.ts","../src/components/TRONModal/index.tsx","../src/hooks/useTRONWallet.ts","../src/components/TONModal/index.tsx","../src/components/BTCModal/index.tsx","../src/lib/btc/XverseAdapter.ts","../src/hooks/useBTCWallet.ts","../src/components/WalletModal/index.tsx","../src/components/AlphaAvatar/index.tsx","../src/components/WalletAsset/index.tsx","../src/components/TokenSend/index.tsx","../src/components/TokenDetail/index.tsx","../src/components/TokenSendList/index.tsx","../src/components/TransactionList/index.tsx","../src/store/useContractStore.ts","../src/hooks/useHash.ts","../src/ui/ModalDrawer/index.tsx","../src/ui/Switch/index.tsx","../src/ui/AlphaAvatar/index.tsx","../src/ui/Radio/index.tsx","../src/ui/Skeleton/index.tsx","../src/ui/Tabs/index.tsx","../src/ui/Lottie/index.tsx","../src/ui/Checkbox/index.tsx","../src/store/useTransactionStore.ts","../src/hooks/useCopyClipboard.ts","../src/context/ToastContext.tsx","../src/hooks/api/wallet.ts","../src/hooks/useMatchChain.tsx","../src/hooks/useMatchWallet.tsx","../src/components/ImportToken/index.tsx","../src/hooks/useIsContract.ts","../src/hooks/useReceipt.tsx","../src/hooks/useTransaction.tsx","../src/store/useModalStore.ts","../src/components/CEXBindModal/index.tsx","../src/context/BusinessProvider.tsx","../src/context/index.tsx","../src/hooks/useWalletInit.ts","../src/hooks/useInit.tsx","../src/config/chains/MatchMain.ts","../src/config/chains/MatchTest.ts","../src/hooks/api/poh.ts","../src/hooks/api/user.ts"],"sourcesContent":["export * as bind from \"./bind\";\nexport * as poh from \"./poh\";\nexport * as user from \"./user\";\nexport * as wallet from \"./wallet\";\nexport {isSuccess} from \"../../api/request\"","import {useQuery} from \"@tanstack/react-query\";\nimport useUserInfo from \"../useUserInfo\";\nimport type {UseQueryOptions} from \"@tanstack/react-query/src/types\";\nimport {BindInfoType, BindItemType} from \"../../types/types\";\nimport {getBindInfoApi, getBindListApi} from \"../../api\";\n\nexport {bindCexApi, unBindApi, unBindWalletApi} from \"../../api\";\n\nexport function useBindList(options?: Partial<Omit<UseQueryOptions<BindItemType[]>, 'queryKey' | 'queryFn'>>) {\n const {isLogin} = useUserInfo()\n return useQuery<BindItemType[]>({\n queryKey: ['bindList'],\n enabled: isLogin,\n queryFn: async () => {\n let res = await getBindListApi()\n return res.data\n },\n ...options\n })\n}\n\nexport function useBindInfo(options?: Partial<Omit<UseQueryOptions<BindInfoType>, 'queryKey' | 'queryFn'>>) {\n const {isLogin} = useUserInfo()\n return useQuery<BindInfoType>({\n queryKey: ['bindInfo'],\n enabled: isLogin,\n queryFn: async () => {\n let res = await getBindInfoApi()\n return res.data\n },\n ...options\n })\n}\n","import {create} from 'zustand';\nimport { devtools, persist } from 'zustand/middleware';\nimport {\n type IEnvConfigType,\n LocaleType,\n OverviewInfo,\n ThemeType,\n WalletAssetMergeType,\n WalletConfigType\n} from \"../types/types\";\nimport {getOverviewInfoApi} from \"../api\";\n\ninterface StoreState {\n appid:string\n token:string\n did:string\n mid:string\n theme:\"dark\"|\"light\"\n endpoints:IEnvConfigType['endpoints']\n\n setAppid: (appid: string) => void;\n setToken: (token: string) => void;\n setDid: (did: string) => void;\n setMid: (mid: string) => void;\n setEndpoints:(endpoints:IEnvConfigType['endpoints'])=>void\n\n logout: () => void;\n overview:OverviewInfo|null\n setOverview:(overview:OverviewInfo)=>void\n refreshOverview:()=>Promise<void>\n setTheme:(theme:\"dark\"|\"light\")=>void\n\n address:string\n setAddress:(address:string)=>void\n\n locale:LocaleType,\n setLocale:(locale:LocaleType)=>void\n\n wallet:WalletConfigType\n setWallet:(wallet:WalletConfigType)=>void\n\n chainId:number\n setChainId:(chainId:number)=>void\n\n assets:WalletAssetMergeType[]\n setAssets:(assets:WalletAssetMergeType[])=>void\n}\n\nconst persistedState = persist<StoreState>(\n set => ({\n appid: '',\n token:'',\n did:'',\n mid:'',\n overview:null,\n theme:'light',\n setOverview:(overview:OverviewInfo)=>set({\n overview,\n address:overview.address,\n did:overview.did,\n mid:overview.mid\n }),\n refreshOverview:async()=>{\n const res = await getOverviewInfoApi()\n if (res.data) {\n set({overview:res.data})\n set({address:res.data.address})\n set({did:res.data.did})\n set({mid:res.data.mid})\n }\n },\n endpoints:{\n back: \"https://api.matchid.ai/\",\n auth:\"https://auth.matchid.ai/\"\n },\n setDid: (did: string) => set({ did: did }),\n setToken: (token: string) => set({ token: token }),\n setAppid: (appid: string) => set({ appid: appid }),\n setMid: (mid: string) => set({ mid: mid }),\n logout: () => set({ token: '',did:'',mid:'',address:'',overview:null ,assets:[]}),\n setTheme:(theme:\"dark\"|\"light\")=>set({theme}),\n setEndpoints:(endpoints:IEnvConfigType['endpoints'])=>set({endpoints}),\n\n address:'',\n setAddress:(address:string)=>set({address}),\n\n locale:'en',\n setLocale:(locale:LocaleType)=>set({locale}),\n\n wallet:{\n type: \"UserPasscode\"\n },\n setWallet:(wallet:WalletConfigType)=>set({wallet}),\n\n chainId:698,\n setChainId:(chainId:number)=>set({chainId}),\n assets:[],\n setAssets:(assets:WalletAssetMergeType[])=>set({assets})\n\n\n }),\n { name: 'match-local' }\n);\n\nconst useLocalStore = create(devtools(persistedState));\n\nexport const localStore = useLocalStore;\n\nexport default useLocalStore;\n","import axios, {AxiosRequestConfig} from 'axios';\nimport {getAppid, getEndpoints, getLocale, getToken} from '../store';\nimport { localStore } from '../store/useLocalStore';\nimport matchlog from \"../utils/matchlog\";\nimport axiosRetry from \"axios-retry\";\n\nexport const SUCCESS_CODE = 0;\n\nexport const isSuccess = (res: { code: number; message: string; data?: any }) => {\n return res.code === SUCCESS_CODE;\n};\n\nexport interface MyResponseType<T> {\n code: number;\n data: T;\n message: string;\n success: boolean;\n fail: boolean;\n result: T;\n}\n\nconst instance = axios.create({\n timeout: 60000,\n validateStatus(status) {\n return status >= 200 && status <= 500;\n },\n});\n\n\n\nconst request = async <T = any>(config: AxiosRequestConfig): Promise<MyResponseType<T>> => {\n try {\n const endpoints = getEndpoints();\n const token = getToken()\n instance.defaults.baseURL = `${endpoints.back}`;\n\n instance.defaults.headers.common['Appid'] = getAppid()\n if(token){\n instance.defaults.headers.common['Authorization'] = token;\n }\n instance.defaults.headers.common['Accept-Language'] = getLocale()\n\n\n const {data} = await instance.request<MyResponseType<T>>(config);\n matchlog.log('api',data)\n if(data.code == 401001){\n localStore.getState().logout()\n throw new Error(\"Your session has expired, please log in again\")\n }\n // if (data.code !== 0) {\n // throw new Error(data.message);\n // }\n return data;\n } catch (err) {\n console.error('qwe-err', err);\n const message = 'Request Error';\n console.error(message);\n return {\n code: -1,\n data: null as any,\n message,\n success: false,\n fail: true,\n result: null as any,\n };\n }\n};\n\nconst retryInstance = axios.create({\n timeout: 60000,\n validateStatus(status) {\n return status >= 200 && status <= 500;\n },\n});\naxiosRetry(retryInstance, {\n retries: 3,\n retryDelay: (retryCount) => retryCount * 1000,\n shouldResetTimeout: true,\n retryCondition: (error) => {\n return (error!.response!.status >= 500 && error!.response!.status<600) || error.code === 'ECONNABORTED';\n },\n});\nexport const retryRequest = async <T = any>(config: AxiosRequestConfig): Promise<MyResponseType<T>> => {\n try {\n const endpoints = getEndpoints();\n const token = getToken()\n retryInstance.defaults.baseURL = `${endpoints.back}`;\n\n retryInstance.defaults.headers.common['Appid'] = getAppid()\n if(token){\n retryInstance.defaults.headers.common['Authorization'] = token;\n }\n retryInstance.defaults.headers.common['Accept-Language'] = getLocale()\n\n\n const {data} = await retryInstance.request<MyResponseType<T>>(config);\n matchlog.log('api',data)\n if(data.code == 401001){\n localStore.getState().logout()\n throw new Error(\"Your session has expired, please log in again\")\n }\n // if (data.code !== 0) {\n // throw new Error(data.message);\n // }\n return data;\n } catch (err) {\n console.error('qwe-err', err);\n const message = 'Request Error';\n console.error(message);\n return {\n code: -1,\n data: null as any,\n message,\n success: false,\n fail: true,\n result: null as any,\n };\n }\n};\n\nexport default request;","import type {IEnvConfigType} from \"../../types/types\";\n\nexport default {\n endpoints:{\n back: \"https://api.matchid.ai/\",\n auth:\"https://auth.matchid.ai/\"\n }\n} as IEnvConfigType","import { localStore } from './useLocalStore';\nimport DefaultEnv from '../config/env';\nexport const getEndpoints = ()=>{\n try {\n const store = localStore.getState();\n\n const env = store?.endpoints;\n\n if (env) {\n return env;\n } else {\n return DefaultEnv.endpoints\n }\n } catch (e) {\n return DefaultEnv.endpoints\n }\n}\n\nexport const getAppid = () => {\n try {\n const store = localStore.getState();\n const appid = store?.appid;\n if (appid) {\n return appid;\n } else {\n return '';\n }\n } catch (e) {\n return '';\n }\n}\n\nexport const getLocale = () => {\n try {\n const store = localStore.getState();\n const locale = store?.locale;\n if (locale) {\n return locale;\n } else {\n return 'en';\n }\n } catch (e) {\n return 'en';\n }\n}\nexport const getToken = () => {\n try {\n const store = localStore.getState();\n const token = store?.token;\n if (token) {\n return token;\n } else {\n return '';\n }\n } catch (e) {\n return '';\n }\n}","// src/utils/logger.ts\nconst matchDevExists = () => localStorage.getItem('matchid-sdk-react-debug') !== null;\n\nconst handler = {\n get(target: any, prop: string) {\n if (matchDevExists() && typeof target[prop] === 'function') {\n return target[prop].bind(console);\n }\n return () => {};\n }\n};\n\nconst matchlog = new Proxy(console, handler);\n\nexport default matchlog;","import request, {retryRequest} from \"./request\";\nimport {\n AppConfigType,\n BindInfoType,\n BindItemType,\n BindWalletParam,\n MetaPageType,\n OverviewInfo,\n PohItemType,\n PohZkpassParams,\n UserAssetToken,\n UserChainType,\n UserImportTokenType,\n UserTransactionNextPageParams,\n UserTransactionType,\n WalletAssetType,\n WalletChainType, WalletNFTType\n} from \"../types/types\";\n\nexport const getEmailCodeApi = (email: string) => {\n return request<any>({\n url: `/api/v1/email/code`,\n method: \"POST\",\n data: {email}\n });\n}\n\nexport const verifyEmailCodeApi = ({email, verification_key, verification_code}: {\n email: string,\n verification_key: string,\n verification_code: string\n}) => {\n return request<any>({\n url: `/api/v1/user/email/login`,\n method: \"POST\",\n data: {email, verification_key, verification_code}\n });\n}\n\n\nexport const getOverviewInfoApi = () => {\n return retryRequest<OverviewInfo>({\n url: `/api/v1/user/overview`,\n method: \"GET\",\n });\n}\nexport const toLogoutApi = () => {\n return retryRequest<any>({\n url: `/api/v1/user/logout`,\n method: \"POST\",\n });\n}\n\nexport const setUserNameApi = (data: any) => {\n return request({\n url: `/api/v1/user/name`,\n method: \"POSt\",\n data\n });\n}\n\nexport const getBindListApi = () => {\n return retryRequest<BindItemType[]>({\n url: `/api/v1/bind/list`,\n method: \"GET\",\n });\n}\n\nexport const getPohListApi = () => {\n return retryRequest<PohItemType[]>({\n url: `/api/v1/poh/list`,\n method: \"GET\",\n });\n}\n\nexport const getBindInfoApi = () => {\n return retryRequest<BindInfoType>({\n url: `/api/v1/bind`,\n method: \"GET\",\n });\n}\n\n\nexport const bindCexApi = (data: {\n cex: string,\n api_key: string,\n api_secret: string,\n api_passphrase?: string\n}) => {\n return request<any>({\n url: `/api/v1/cex/subscribe`,\n method: \"POST\",\n data\n });\n}\n\n\nexport const unBindApi = ({type}: { type: string }) => {\n return request<any>({\n url: `/api/v1/unbind`,\n method: \"POST\",\n data: {type}\n });\n}\n\nexport const unBindWalletApi = ({address}: { address: string }) => {\n return request<any>({\n url: `/api/v1/wallet/unbind`,\n method: \"POST\",\n data: {address}\n });\n}\n\nexport const verifyPohApi = ({\n taskId,\n schemaId,\n publicFields,\n allocatorAddress,\n publicFieldsHash,\n allocatorSignature,\n uHash,\n validatorAddress,\n validatorSignature\n }: PohZkpassParams) => {\n return request<any>({\n url: `/api/v1/poh/zkpass`,\n method: \"POST\",\n data: {\n taskId,\n schemaId,\n publicFields,\n allocatorAddress,\n publicFieldsHash,\n allocatorSignature,\n uHash,\n validatorAddress,\n validatorSignature\n }\n });\n}\n\nexport const chooseIdentityApi = ({identity}: { identity: string }) => {\n return request<any>({\n url: `/api/v1/user/choose/identity`,\n method: \"POST\",\n data: {identity}\n });\n}\n\nexport const mintPassportNftApi = () => {\n return request<any>({\n url: `/api/v1/mint/passport/nft`,\n method: \"POST\",\n });\n}\n\nexport const getAuthInfoApi = () => {\n return retryRequest<any>({\n url: `/api/v1/user/auth`,\n method: \"GET\",\n });\n}\n\nexport const getWalletNonceApi = (data: { address: string, type: string }) => {\n return retryRequest<any>({\n url: `/api/v1/login/wallet/init`,\n method: \"POST\",\n data: data\n });\n}\n\nexport const loginByWalletApi = ({\n type,\n address,\n signature,\n message,\n connector_type,\n wallet_client_type\n }: BindWalletParam) => {\n return request<any>({\n url: `/api/v1/login/wallet`,\n method: \"POST\",\n data: {type, address, signature, message, connector_type, wallet_client_type}\n });\n}\n\n\nexport const getWalletInitApi = (data: { address: string, type: string }) => {\n return retryRequest<any>({\n url: `/api/v1/wallet/init`,\n method: \"POST\",\n data,\n });\n}\n\nexport const toBindWalletApi = ({\n type,\n address,\n signature,\n message,\n connector_type,\n wallet_client_type\n }: BindWalletParam) => {\n return request<any>({\n url: `/api/v1/wallet/bind`,\n method: \"POST\",\n data: {type, address, signature, message, connector_type, wallet_client_type}\n });\n}\n\nexport const getAppConfigApi = () => {\n return retryRequest<AppConfigType>({\n url: `/api/v1/app/config`,\n method: \"GET\",\n });\n}\n\nexport const getUserChainListApi = () => {\n return request<UserChainType[]>({\n url: `/api/v1/user/chain/list`,\n method: \"GET\",\n });\n}\n\nexport const userImportTokenApi = (data: {\n chain_id: string,\n symbol: string,\n address: string,\n decimals: string,\n}) => {\n return request<any>({\n url: `/api/v1/user/import/token`,\n method: \"POST\",\n data\n });\n}\nexport const getUserImportTokenListApi = (data: {\n chain_id: string\n}) => {\n return request<UserImportTokenType[]>({\n url: `/api/v1/user/import/token/list`,\n method: \"POST\",\n data\n });\n}\n\nexport const getUserWalletAssetApi = (data: {\n chain_id: string\n}) => {\n return request<UserAssetToken[]>({\n url: `/api/v1/user/wallet/asset`,\n method: \"POST\",\n data\n });\n}\n\nexport const getUserWalletTransactionsApi = (data: {\n address?: string\n chain_id: string\n page?: string\n block_number?:number\n index?:number\n items_count?:number\n}) => {\n return request<{\n transactions: UserTransactionType[]\n next_page_params:UserTransactionNextPageParams\n }>({\n url: `/api/v1/user/wallet/transactions`,\n method: \"POST\",\n data\n });\n}\n\nexport const getWalletAssetListApi = (data: {\n chain_id: string\n address: string\n}) => {\n return request<{\n asset_list:WalletAssetType[]\n asset_total_balance:string\n }>({\n url: `/api/v1/wallet/asset`,\n method: \"POST\",\n data\n });\n}\n\nexport const getWalletListApi = (data: {\n page: number\n page_size: number\n}) => {\n return request<MetaPageType<{\n wallet_list:{\n address:string\n chain_network:string\n }[]\n mpc_address:string\n }>>({\n url: `/api/v1/wallet/list`,\n method: \"POST\",\n data\n });\n}\n\nexport const getWalletChainListApi = () => {\n return request<WalletChainType[]>({\n url: `/api/v1/wallet/chain`,\n method: \"POST\",\n });\n}\n\nexport const getWalletNftListApi = (data:{\n chain_id:string\n address:string\n})=>{\n return request<WalletNFTType[]>({\n url: `/api/v1/wallet/nfts`,\n method: \"POST\",\n data\n });\n}\n\nexport const tgAppLoginInitApi = ()=>{\n return retryRequest<{\n code:string\n login_url:string\n }>({\n url: `/api/v1/tgapp/login/init`,\n method: \"GET\",\n });\n}\n\nexport const getTgAppLoginStatus = (data:{\n code:string\n})=>{\n return retryRequest<{\n access_token:string\n token_type:string\n }>({\n url: `/api/v1/tgapp/login/status`,\n method: \"POST\",\n data\n });\n}\n\nexport const userInviteApi = (data:{\n invite_code:string\n})=>{\n return request<any>({\n url: `/api/v1/user/invite`,\n method: \"POST\",\n data\n });\n}\n","import useLocalStore from \"../store/useLocalStore\";\nimport {useMemo} from \"react\";\nimport {CEXType, ISocialLoginMethod, LoginMethodType} from \"../types/types\";\nimport {\n getAuthInfoApi,\n getEmailCodeApi,\n getOverviewInfoApi,\n tgAppLoginInitApi,\n toLogoutApi, userInviteApi,\n verifyEmailCodeApi\n} from \"../api\";\nimport {isSuccess} from \"../api/request\";\nimport {useMatch} from \"../MatchContext\";\nimport eventManager from \"./eventManager\";\nimport {encodeBase64, isInTgApp} from \"../utils\";\nimport matchlog from \"../utils/matchlog\";\nimport {\n useBTCModalStore,\n useCEXBindModalStore,\n useEVMModalStore,\n useTONModalStore,\n useTRONModalStore, useWalletModalStore\n} from \"../store/useModalStore\";\nimport {LOGIN_METHOD_MAP} from \"../config\";\nimport useStore from \"../store/useStore\";\nimport {useDownMd} from \"./useLayout\";\n\nexport default function useUserInfo() {\n const {\n appid,\n token,\n mid,\n did,\n logout: logoutStore,\n setOverview,\n overview,\n address,\n endpoints,\n locale,\n refreshOverview,\n } = useLocalStore();\n const {setTgAppAuthCode,emailLoginKey,setEmailLoginKey} = useStore()\n const isDownMd = useDownMd()\n const {events, login} = useMatch()\n const {open:EVMOpen} = useEVMModalStore()\n const {open: TRONOpen} = useTRONModalStore()\n const {open: TONOpen} = useTONModalStore()\n const {open: BTCOpen} = useBTCModalStore()\n const {open: CEXBindOpen} = useCEXBindModalStore()\n const walletModalStore = useWalletModalStore()\n\n const getRedirectUri = ()=>{\n return encodeURIComponent(window.location.href)\n }\n\n\n const isLogin = useMemo(() => !!token && !!overview, [token, overview])\n\n const logout = async () => {\n try {\n await toLogoutApi()\n } catch (err: any) {\n console.error('logout', err)\n }\n\n logoutStore()\n events && events!.onLogout && events!.onLogout()\n eventManager.emit('onLogout');\n }\n\n const loginByMethod = async (method: ISocialLoginMethod) => {\n const link = `${endpoints.back}api/v1/auth/${method == 'youtube' ? 'google' : method}?appid=${appid}&provider=${method == 'youtube' ? 'google' : method}&redirect=${encodeURIComponent(endpoints.auth + 'login/' + method)}&authorization=${new Date().getTime()}${method == \"youtube\" ? '&auth_type=youtube' : ''}`;\n matchlog.log('link', link)\n return window.open(\n link, // Replace with the actual authorization URL\n 'authWindow',\n 'width=800,height=600'\n );\n }\n\n const loginByTwitter = () => {\n return loginByMethod('twitter')\n }\n const loginByGoogle = () => {\n return loginByMethod('google')\n }\n\n const loginByWallet = async () => {\n // return EVMOpen('login')\n return window.open(`${endpoints.auth}login/wallet?appid=${appid}&locale=${locale}`)\n\n }\n const loginByTelegram = async () => {\n if (isInTgApp()) {\n //get auth code\n try {\n const res = await tgAppLoginInitApi()\n if (!isSuccess(res)) {\n throw new Error(res.message)\n }\n setTgAppAuthCode(res.data.code)\n const link = res.data.login_url + `?startapp=${res.data.code}_${appid}_${locale}`\n console.log('tgAppLoginInitLink', link)\n if (window.TelegramWebviewProxy) {\n console.log('in telegram webview')\n if (!window.Telegram) {\n throw new Error('Please import telegram-web-app.js first')\n }\n window.Telegram.WebApp.openTelegramLink(link)\n return\n }\n console.log('not in telegram webview')\n window.open(link)\n return\n\n\n } catch (e: any) {\n console.error('tgAppLoginInitApi', e)\n throw e\n }\n }\n\n return window.open(\n `${endpoints.auth}login/telegram?appid=${appid}&locale=${locale}`, // Replace with the actual authorization URL\n 'authWindow',\n 'width=800,height=600'\n );\n }\n\n const loginMethod = async (method: LoginMethodType | 'wallet', extra?: {\n [key: string]: any\n }) => {\n switch (method) {\n case \"wallet\":\n return walletModalStore.open(\"login\", extra?.methods)\n case \"evm\":\n return EVMOpen('login')\n // return window.open(`${endpoints.auth}login/wallet?appid=${appid}&locale=${locale}`)\n case \"sol\":\n if(isDownMd){\n return window.location.href = `${endpoints.auth}login/sol?appid=${appid}&locale=${locale}&redirect_uri=${getRedirectUri()}`\n }\n return window.open(`${endpoints.auth}login/sol?appid=${appid}&locale=${locale}`)\n case \"tron\":\n return TRONOpen('login')\n case \"ton\":\n return TONOpen('login')\n case \"btc\":\n return BTCOpen('login')\n case \"telegram\":\n return await loginByTelegram()\n case \"youtube\":\n case \"twitter\":\n case \"google\":\n case \"discord\":\n case \"github\":\n case \"linkedin\":\n case \"facebook\":\n return await loginByMethod(method)\n default:\n throw new Error('unsupported method')\n\n }\n }\n\n\n const getLoginEmailCode = async (email: string) => {\n const res = await getEmailCodeApi(email);\n if (isSuccess(res)) {\n setEmailLoginKey(res.data.key)\n // window.sessionStorage.setItem('loginkey', res.data.key as string)\n return res.data.key as string\n }\n throw new Error(res.message)\n }\n\n const loginByEmail = async ({\n email,\n code\n }: { email: string, code: string }) => {\n try {\n const obj = {\n email: email,\n verification_key: emailLoginKey,\n verification_code: code,\n }\n const res = await verifyEmailCodeApi(obj);\n if (res && res.data && isSuccess(res)) {\n await login({\n // mid: res.data.mid,\n token: `${res.data.token_type} ${res.data.access_token}`\n })\n return true;\n\n } else {\n throw new Error(res.message)\n }\n } catch (error) {\n console.error('loginByEmail', error);\n throw error\n }\n return false\n };\n\n\n const bindWallet = async () => {\n if (!token) {\n throw new Error('You must login first')\n }\n return window.open(`${endpoints.auth}bind/wallet?appid=${appid}&locale=${locale}&st=` + encodeURIComponent(encodeBase64(token)))\n }\n\n const bindTelegram = async () => {\n if (!token) {\n throw new Error('You must login first')\n }\n const authWindow = window.open(\n `${endpoints.auth}bind/telegram?appid=${appid}&locale=${locale}&st=` + encodeURIComponent(encodeBase64(token)), // Replace with the actual authorization URL\n 'authWindow',\n 'width=800,height=600'\n );\n }\n\n const auth = async () => {\n const res = await getAuthInfoApi()\n if (isSuccess(res)) {\n return res.data\n }\n throw new Error(res.message)\n }\n\n const bind = async (method: LoginMethodType | 'wallet', extra?: {\n [key: string]: any\n }) => {\n if (!token) {\n throw new Error('You must login first')\n }\n switch (method) {\n case \"wallet\":\n return walletModalStore.open(\"bind\", extra?.methods)\n case \"evm\":\n return EVMOpen('bind')\n // return window.open(`${endpoints.auth}bind/wallet?appid=${appid}&locale=${locale}&st=` + encodeURIComponent(encodeBase64(token)))\n case \"sol\":\n if(isDownMd){\n return window.location.href = `${endpoints.auth}bind/sol?appid=${appid}&locale=${locale}&st=${encodeURIComponent(encodeBase64(token))}&redirect_uri=${getRedirectUri()}`\n }\n return window.open(`${endpoints.auth}bind/sol?appid=${appid}&locale=${locale}&st=${encodeURIComponent(encodeBase64(token))}`)\n case \"tron\":\n return TRONOpen('bind')\n case \"ton\":\n return TONOpen('bind')\n case \"btc\":\n return BTCOpen('bind')\n case \"telegram\":\n return await bindTelegram()\n case \"twitter\":\n case \"google\":\n case \"discord\":\n case \"github\":\n case \"linkedin\":\n case \"facebook\":\n case \"youtube\":\n const link = `${endpoints.back}api/v1/auth/${method == 'youtube' ? 'google' : method}?appid=${appid}&provider=${method == 'youtube' ? 'google' : method}&redirect=${encodeURIComponent(endpoints.auth + 'bind/' + method)}&authorization=${token.includes(\"Bearer \") ? token.split(' ')[1] : token}${method == \"youtube\" ? '&auth_type=youtube' : ''}`;\n matchlog.log('link', link)\n return window.open(\n link,\n 'authWindow',\n 'width=800,height=600'\n );\n default:\n throw new Error('unsupported method')\n\n }\n }\n\n const bindCex = (type: CEXType) => {\n return CEXBindOpen(type)\n }\n\n const getAuthInfo = async (method: keyof typeof LOGIN_METHOD_MAP) => {\n // create a full screen iframe to get the auth info\n const element_id = 'auth_iframe'\n //if the iframe already exists, remove it\n if (document.getElementById(element_id)) {\n document.getElementById(element_id)!.remove()\n }\n const iframe = document.createElement('iframe')\n iframe.id = element_id\n iframe.src = `${endpoints.auth}auth?appid=${appid}&method=${method}&locale=${locale}&token=${encodeURIComponent(encodeBase64(token))}`\n iframe.style.width = '100vw'\n iframe.style.height = '100vh'\n iframe.style.position = 'fixed'\n iframe.style.top = '0'\n iframe.style.left = '0'\n iframe.style.zIndex = '9999'\n iframe.style.border = 'none'\n //@ts-ignore\n iframe.allowTransparency = 'true'\n document.body.appendChild(iframe)\n return new Promise((resolve, reject) => {\n const authMessageHandle = (event: MessageEvent) => {\n if (endpoints.auth.includes(event.origin)) {\n const res = event.data\n if (res.source == 'match-auth') {\n window.removeEventListener('message', authMessageHandle)\n if (res.status == 'success') {\n resolve({\n ...res.data,\n method: res.method,\n appid: res.appid,\n did\n })\n } else {\n reject(new Error(res.message))\n }\n\n iframe.remove()\n }\n }\n }\n window.addEventListener('message', authMessageHandle)\n })\n }\n\n const invite = async(invite_code:string)=>{\n return await userInviteApi({\n invite_code\n })\n }\n\n\n return {\n loginByMethod,\n loginByTelegram,\n loginByTwitter,\n loginByGoogle,\n loginByWallet,\n loginByEmail,\n\n bindWallet,\n bindTelegram,\n\n\n token,\n mid,\n did,\n address,\n isLogin,\n logout,\n getLoginEmailCode,\n refreshOverview,\n overview,\n bindCex,\n username: overview?.username || '',\n auth,\n\n login: loginMethod,\n bind,\n\n getAuthInfo,\n invite\n }\n}","// src/MatchContext.tsx\nimport React, {createContext, useContext, ReactNode, useEffect} from 'react';\nimport Providers from './context';\nimport {IEnvConfigType, IMatchEvents, LocaleType, WalletConfigType} from \"./types/types\";\nimport useWalletInit from \"hooks/useWalletInit\"\nimport useInit from \"./hooks/useInit\";\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query';\nimport {IntlProvider} from 'react-intl';\nimport {messages} from \"./i18n\"\nimport {getDefaultConfig, RainbowKitProvider} from \"@rainbow-me/rainbowkit\";\nimport {\n bitgetWallet,\n injectedWallet,\n metaMaskWallet,\n okxWallet,\n walletConnectWallet\n} from \"@rainbow-me/rainbowkit/wallets\";\nimport {arbitrum, base, bsc, mainnet, optimism, polygon} from \"wagmi/chains\";\nimport {matchMain} from \"./config/chains/MatchMain\";\nimport {matchTest} from \"./config/chains/MatchTest\";\nimport {WagmiProvider} from \"wagmi\";\n\nconst queryClient = new QueryClient();\nexport const wagmiConfig = getDefaultConfig({\n appName: \"MatchID\",\n projectId: \"9ac6ea7e07860f04616fb311b447dee9\",\n wallets: [\n {\n groupName: \"Recommended\",\n wallets: [\n metaMaskWallet,\n walletConnectWallet,\n okxWallet,\n bitgetWallet,\n injectedWallet,\n ],\n },\n ],\n chains: [mainnet, polygon, optimism, arbitrum, base, matchMain, matchTest, bsc],\n});\ntype MatchContextType = {\n appid: string;\n events?: IMatchEvents;\n login: (data: { token: string }) => Promise<void>;\n theme: \"light\" | \"dark\";\n locale?: LocaleType\n} & Partial<IEnvConfigType>\n\nexport const MatchContext = createContext<MatchContextType | undefined>(undefined);\n\nexport const MatchProvider: React.FC<{\n children: ReactNode;\n appid: string;\n events?: IMatchEvents;\n theme?: \"light\" | \"dark\",\n endpoints?: IEnvConfigType['endpoints']\n locale?: LocaleType\n wallet: WalletConfigType\n}> = ({\n children,\n appid,\n events,\n theme = \"light\",\n endpoints,\n locale,\n wallet\n }) => {\n\n const {login, endpoints: realEndPoints, locale: realLocale} = useInit({\n theme,\n appid,\n events,\n endpoints,\n locale\n })\n\n // matchlog.log('config', {\n // appid,\n // events,\n // theme,\n // endpoints,\n // locale,\n // wallet\n // })\n //\n\n useWalletInit({\n config: wallet,\n })\n\n return (\n <IntlProvider locale={realLocale} messages={messages[realLocale]}>\n <WagmiProvider config={wagmiConfig}>\n <QueryClientProvider client={queryClient}>\n <MatchContext.Provider\n value={{\n appid,\n endpoints: realEndPoints,\n events,\n login,\n theme,\n locale: realLocale\n }}\n >\n <Providers>{children}</Providers>\n </MatchContext.Provider>\n </QueryClientProvider>\n </WagmiProvider>\n </IntlProvider>\n\n );\n};\n\nexport const useMatch = () => {\n const context = useContext(MatchContext);\n\n if (context === undefined) {\n throw new Error('useMatch must be used within a MatchProvider');\n }\n return context;\n};","// src/hooks/useMatchEvents.ts\nimport { useEffect } from \"react\";\nimport eventManager from \"./eventManager\";\nimport {IMatchEvents} from \"../types/types\";\n\n\nexport default function useMatchEvents(handlers: IMatchEvents) {\n useEffect(() => {\n Object.entries(handlers).forEach(([event, handler]) => {\n if (handler) {\n eventManager.on(event, handler);\n }\n });\n\n return () => {\n Object.entries(handlers).forEach(([event, handler]) => {\n if (handler) {\n eventManager.off(event, handler);\n }\n });\n };\n }, [handlers]);\n}\n","// src/hooks/eventManager.ts\ntype EventCallback = (...args: any[]) => void;\n\nclass EventManager {\n private listeners: Record<string, Set<EventCallback>> = {};\n\n on(event: string, callback: EventCallback) {\n if (!this.listeners[event]) {\n this.listeners[event] = new Set();\n }\n this.listeners[event].add(callback);\n }\n\n off(event: string, callback: EventCallback) {\n if (this.listeners[event]) {\n this.listeners[event].delete(callback);\n if (this.listeners[event].size === 0) {\n delete this.listeners[event];\n }\n }\n }\n\n emit(event: string, ...args: any[]) {\n if (this.listeners[event]) {\n this.listeners[event].forEach(callback => callback(...args));\n }\n }\n}\n\nconst eventManager = new EventManager();\n\nexport default eventManager;\n","import moment from 'moment';\n\nexport const getVersion = (): string => {\n return \"0.0.2\";\n};\n\nexport function encodeBase64(input: string) {\n return btoa(unescape(encodeURIComponent(input)));\n}\n\nexport function decodeBase64(input: string) {\n return decodeURIComponent(escape(atob(input)));\n}\n\nexport const isValidEmail = (email: string) => {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)\n}\nexport const isValidUsername = (username: string) => {\n //8-32 alpha number - _\n return /^[a-zA-Z0-9_-]+$/.test(username)\n}\n\nexport const deepMerge = (target: any, source: any): any => {\n for (const key in source) {\n if (source[key] instanceof Object && key in target) {\n target[key] = deepMerge(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n }\n return target;\n};\n\nexport function truncateAddress(address: string, startLen = 4, endLen = 4): string {\n if (address.length <= startLen + endLen) {\n return address;\n }\n const start = address.slice(0, startLen);\n const end = address.slice(-endLen);\n return `${start}...${end}`;\n}\n\n\nexport function firstUpperCase(str: string): string {\n return str.toString()[0].toUpperCase() + str.toString().slice(1);\n}\n\nexport function getAppClientId() {\n return \"react-sdk-\" + getVersion()\n}\n\n\nfunction convertScientificToDecimal(num: number) {\n let str = num.toFixed(12)\n str = str.replace(/0+$/, '')\n str = str.replace(/\\.$/, '')\n return str\n}\n\ninterface NumberFormatterProps {\n value: number | string | undefined\n prefix?: string\n suffix?: string\n separator?: boolean\n fixNum?: number //number >= 1 fix num\n tFixNum?: number //number < 1 fix num\n intClassName?: string\n decimalClassName?: string\n prefixClassName?: string\n className?: string\n}\n\nexport const NumberFormatter: React.FC<NumberFormatterProps> = ({\n value,\n prefix = '',\n suffix = '',\n separator = true,\n fixNum = 2,\n tFixNum = 4,\n intClassName = \"\",\n decimalClassName = \"\",\n prefixClassName = \"\",\n className = \"\"\n }) => {\n const numberValue =\n typeof value === 'number'\n ? convertScientificToDecimal(value)\n : value\n ? value\n : '0'\n\n const [intPart, decimalPart] = numberValue.toString().split('.')\n\n const intFormat = separator\n ? intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n : intPart\n\n if (Math.abs(parseFloat(numberValue)) >= 1) {\n return (\n <span className={className}>\n {prefix && <span className={prefixClassName}>{prefix}</span>}\n <span className={intClassName}>{intFormat}</span>\n {decimalPart ? (\n <span className={decimalClassName}>\n .{decimalPart.substring(0, fixNum)}\n </span>\n ) : (\n ''\n )}\n {suffix}\n </span>\n )\n }\n\n if (decimalPart) {\n let zeroCount = 0\n for (let i = 0; i < decimalPart.length; i++) {\n if (decimalPart[i] === '0') {\n zeroCount++\n } else {\n break\n }\n }\n if (zeroCount < tFixNum) {\n return (\n <span className={className}>\n {prefix && <span className={prefixClassName}>{prefix}</span>}\n <span className={intClassName}>{intFormat}</span>\n <span className={decimalClassName}>\n .{decimalPart.substring(0, tFixNum)}\n </span>\n {suffix}\n </span>\n )\n }\n return (\n <span className={className}>\n {prefix && <span className={prefixClassName}>{prefix}</span>}\n <span className={intClassName}>{intFormat}</span>\n <span className={decimalClassName}>\n .0<sub>{zeroCount}</sub>\n {decimalPart?.substring(zeroCount, zeroCount + tFixNum - 2)}\n </span>\n {suffix}\n </span>\n )\n }\n return (\n <span className={className}>\n {prefix && <span className={prefixClassName}>{prefix}</span>}\n <span className={intClassName}>{intPart}</span>\n {suffix}\n </span>\n )\n}\n\nexport function formatAddress(address: string, pre = 4, after = 5) {\n return `${address.substring(0, pre)}...${address.substring(address.length - after, address.length)}`\n}\n\nexport const formatDate = (value: any, formatString = 'YYYY-MM-DD HH:mm:ss') => {\n if (value) {\n return moment.unix(value).format(formatString)\n }\n return '--'\n}\nexport const isInTgApp = () => {\n return !!(window.TelegramWebviewProxy)\n}\n\nexport function bytesToBase64(bytes: Uint8Array) {\n const binString = String.fromCodePoint(...bytes);\n return btoa(binString);\n}","import useLocalStore from \"../store/useLocalStore\";\nimport {getVersion} from \"../utils\";\nimport {\n Account, Chain, createPublicClient,\n encodeFunctionData,\n EncodeFunctionDataParameters,\n Hex, http,\n SignableMessage,\n TransactionSerializable,\n WalletClientConfig\n} from 'viem';\nimport useStore from \"../store/useStore\";\nimport {ChainType, RecoveryType} from \"../types/mpc\";\nimport {toAccount} from \"viem/accounts\";\nimport {createWalletClient} from \"viem\";\nimport {useEffect, useMemo, useState} from \"react\";\nimport {retryMessage} from \"../utils/wallet\";\nimport {Hash} from \"viem/types/misc\";\nimport {SendTransactionParameters, encodeDeployData, DeployContractParameters, WriteContractParameters} from \"viem\";\nimport type {Abi, Address} from \"abitype\";\nimport matchlog from \"../utils/matchlog\";\nimport {useModal} from \"../context/ModalContext\";\nimport {HashPanel} from \"../ui\";\nimport useTransactionStore from \"../store/useTransactionStore\";\n\ntype isRecoveredType = () => Promise<boolean>;\ntype signMessageType = (params: { message: SignableMessage, chainType?: ChainType }) => Promise<Hex>;\ntype signTransactionType = (params: {\n transaction: TransactionSerializable,\n chainType?: ChainType\n chain: {\n id: number,\n name: string,\n nativeCurrency: {\n name: string\n symbol: string\n decimals: number\n },\n rpcUrls: {\n [key: string]: any\n }\n }\n}) => Promise<`0x02${string}` | `0x01${string}` | `0x03${string}` | `0x04${string}` | import(\"viem\").TransactionSerializedLegacy>;\ntype SendTransactionReturnType = Hash\ntype SendTransactionParametersType = Omit<SendTransactionParameters, 'account'>\ntype SendTransactionType = (\n transaction: SendTransactionParametersType\n // chainType?: ChainType\n // chainId?: number\n) => Promise<SendTransactionReturnType>\ntype DeployContractReturnType = SendTransactionReturnType\ntype DeployContractType = <const abi extends Abi | readonly unknown[]>(\n parameters: DeployContractParameters<abi>\n) => Promise<DeployContractReturnType>;\ntype WriteContractParametersType = Omit<WriteContractParameters, 'account' | 'chain'> & {\n chain?: Chain\n}\ntype WriteContractReturnType = SendTransactionReturnType\ntype WriteContractType = (params: WriteContractParametersType) => Promise<WriteContractReturnType>\n\ninterface UseWalletReturnType {\n walletReady: boolean\n isRecovered: isRecoveredType\n signMessage: signMessageType\n signTransaction: signTransactionType\n address: string;\n evmAccount: Account | undefined;\n createWalletClient: (parameters: Omit<WalletClientConfig, 'account'>) => Omit<\n ReturnType<typeof createWalletClient>, 'sendTransaction' | 'deployContract' | 'writeContract'> &\n {\n sendTransaction: SendTransactionType,\n deployContract: DeployContractType\n writeContract: WriteContractType\n } | undefined\n // exportWallet:()=>Promise<void>\n}\n\nconst AppClientId = \"react-sdk-\" + getVersion()\n\nexport default function useWallet(): UseWalletReturnType {\n const {address, wallet: walletConfig} = useLocalStore();\n const {walletReady} = useStore()\n const modal = useModal()\n const {addTransaction} = useTransactionStore()\n\n const isRecovered: isRecoveredType = async () => {\n const res = await window.matchProvider.waitUntilWalletMessage({\n method: 'isRecovered'\n })\n return res.isRecovered\n }\n\n const signMessage: signMessageType = async ({\n message,\n chainType = ChainType.Ethereum\n }) => {\n try {\n const res = await window.matchProvider.waitUntilWalletMessage({\n method: 'signMessage',\n data: {\n message,\n chainType\n }\n })\n\n return res.message\n } catch (error: any) {\n console.error('sdk.wallet.message', error)\n throw error\n }\n\n }\n\n const signTransaction: signTransactionType = async ({\n transaction,\n chainType = ChainType.Ethereum,\n chain\n }) => {\n try {\n const res = await window.matchProvider.waitUntilWalletMessage({\n method: 'signTransaction',\n data: {\n transaction,\n chainType,\n chain\n }\n })\n return res.message\n } catch (error: any) {\n console.error('sdk.wallet.transaction', error)\n throw error\n }\n }\n\n const evmAccount = useMemo(() => {\n try{\n return address ? toAccount({\n address: address as `0x${string}`,\n async signMessage({message}) {\n return await signMessage({\n message,\n chainType: ChainType.Ethereum\n })\n },\n async signTransaction(transaction, options) {\n //@ts-ignore\n const {account, chain, ...restTransaction} = transaction;\n console.log('qwe-sign-transaction', restTransaction, options)\n return await signTransaction({\n transaction: {\n ...restTransaction as TransactionSerializable,\n },\n chainType: ChainType.Ethereum,\n chain: {\n id: chain?.id || restTransaction.chainId,\n name: chain?.name,\n nativeCurrency: {\n name: chain?.nativeCurrency?.name || 'ETH',\n symbol: chain?.nativeCurrency?.symbol || 'ETH',\n decimals: chain?.nativeCurrency?.decimals || 18,\n },\n rpcUrls: chain?.rpcUrls\n }\n })\n },\n async signTypedData(typedData) {\n return '0x'\n },\n }) : undefined\n }catch(error){\n console.error(`qwe-evm-account-error ${address}`,error)\n return undefined\n }\n\n }, [address])\n\n\n useEffect(() => {\n matchlog.log('qwe-evmAccount', evmAccount)\n }, [evmAccount]);\n\n\n // const exportWallet = async ()=>{\n // await window.matchProvider.waitUntilWalletMessage({\n // method: 'exportWallet',\n // data: {\n // address\n // }\n // })\n // }\n\n const realCreateWalletClient = (parameters: Omit<WalletClientConfig, 'account'>) => {\n if (!evmAccount) {\n return\n }\n // if ('chain' in parameters) {\n // retryMessage({\n // method: 'addChain',\n // data: {\n // chain: parameters.chain,\n // create: true\n // }\n // })\n // }\n\n const obj = createWalletClient({\n ...parameters,\n account: evmAccount as Account\n })\n const sendTransaction: SendTransactionType = async (transaction) => {\n\n\n const {chain, ...restTransaction} = transaction\n const chainId = chain ? chain.id : await obj.getChainId()\n const _chain = chain || obj.chain\n const transactionId = Date.now().toString() + Math.random().toString().slice(6)\n //prepare transaction\n window.matchProvider.transactionMessageIntervalMap[transactionId] = {\n transaction,\n func: async () => {\n try {\n const {\n chain,\n account,\n ...prepareTransactionRequest\n // @ts-ignore\n } = await obj.prepareTransactionRequest(window.matchProvider.transactionMessageIntervalMap[transactionId].transaction)\n\n window.matchProvider.sendWalletMessage({\n method: 'prepareTransactionRequest',\n data: {\n prepareTransactionRequest,\n transactionId,\n }\n })\n } catch (error) {\n console.error(error)\n }\n\n },\n interval: setInterval(() => {\n window.matchProvider.transactionMessageIntervalMap[transactionId].func()\n }, 10000)\n }\n\n try {\n\n const {\n chain,\n account,\n ...prepareTransactionRequest\n // @ts-ignore\n } = await obj.prepareTransactionRequest(transaction)\n const {serializedTransaction} = await window.matchProvider.waitUntilWalletMessage({\n method: 'sendTransaction',\n data: {\n transactionId,\n transaction: {\n ...restTransaction\n },\n chainType: ChainType.Ethereum,\n chain: {\n id: chainId,\n name: _chain?.name,\n nativeCurrency: _chain?.nativeCurrency,\n rpcUrls: _chain?.rpcUrls\n },\n prepareTransactionRequest\n }\n })\n //send transaction\n try{\n const txHash = await obj.sendRawTransaction({\n serializedTransaction\n })\n addTransaction({\n chainId:chainId,\n hash:txHash,\n info:{\n from:evmAccount.address,\n to:restTransaction.to as Address,\n value:(restTransaction.value||0).toString(),\n input:restTransaction.data as Hash,\n timestamp:Math.floor(Date.now()/1000).toString(),\n hash:txHash,\n source:'local',\n },\n address:evmAccount.address\n\n })\n\n modal.show((props)=>{\n return <HashPanel isOpen onClose={props.close} zIndex={props.zIndex} hash={txHash} chain={_chain}/>\n })\n\n return txHash\n }catch(error:any){\n modal.show((props)=>{\n return <HashPanel isOpen onClose={props.close} zIndex={props.zIndex} error={typeof error=='string'?error :(error.details||error.message)} chain={_chain}/>\n })\n throw error\n }\n\n\n } catch (error: any) {\n console.error('matchid-send-error', error)\n\n throw error\n }finally {\n clearInterval(window.matchProvider.transactionMessageIntervalMap[transactionId].interval)\n delete window.matchProvider.transactionMessageIntervalMap[transactionId]\n }\n\n }\n\n const deployContract: DeployContractType = async <const abi extends Abi | readonly unknown[]>(parameters: DeployContractParameters<abi>) => {\n const {abi, args, bytecode, ...request} =\n parameters as DeployContractParameters\n const calldata = encodeDeployData({abi, args, bytecode});\n return await sendTransaction({\n\n ...request,\n data: calldata,\n\n } as SendTransactionParametersType);\n\n };\n\n const writeContract: WriteContractType = async (parameters) => {\n const {abi, address, args, dataSuffix, functionName, ...request} =\n parameters as WriteContractParameters\n const data = encodeFunctionData({\n abi,\n args,\n functionName,\n } as EncodeFunctionDataParameters)\n return await sendTransaction({\n data: `${data}${dataSuffix ? dataSuffix.replace('0x', '') : ''}`,\n to: address,\n ...request,\n } as SendTransactionParametersType)\n }\n\n return {\n ...obj,\n sendTransaction,\n deployContract,\n writeContract,\n }\n }\n return {\n walletReady,\n evmAccount,\n address,\n signMessage,\n signTransaction,\n isRecovered,\n createWalletClient: realCreateWalletClient,\n // exportWallet\n };\n}\n","import {create} from 'zustand';\n\ninterface StoreState {\n walletReady: boolean\n setWalletReady: (inited: boolean) => void,\n tgAppAuthCode: string\n setTgAppAuthCode: (code: string) => void,\n emailLoginKey: string\n setEmailLoginKey: (key: string) => void,\n\n}\n\nconst useStore = create<StoreState>(set => ({\n walletReady: false,\n setWalletReady: (inited) => set({walletReady: inited}),\n tgAppAuthCode: '',\n setTgAppAuthCode: (code) => set({tgAppAuthCode: code}),\n emailLoginKey: '',\n setEmailLoginKey: (key) => set({emailLoginKey: key}),\n}));\n\nexport default useStore;\n","import React, {useState, useCallback, createContext, useContext, ReactNode, useEffect, useRef} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ModalDrawer } from \"ui\";\n\ninterface ModalProps {\n close: () => void;\n zIndex: number;\n}\n\ninterface ModalContextType {\n show: (content: React.FC<ModalProps>, index?: number) => void;\n open: (props: {\n title: ReactNode,\n content: React.ComponentType<{ close: () => void, zIndex: number }>,\n index?: number\n }) => void;\n}\n\ninterface ModalState {\n modals: Array<{\n visible: boolean;\n index: number;\n zIndex: number;\n content: React.FC<ModalProps>;\n close: () => void;\n }>;\n highestZIndex: number;\n}\n\nconst ModalContext = createContext<ModalContextType | null>(null);\n\nexport function ModalProvider({ children }: { children: ReactNode }) {\n const [modalState, setModalState] = useState<ModalState>({\n modals: [],\n highestZIndex: 100,\n });\n const highestIndexRef = useRef(100); // 记录当前的最高 index\n\n const getNextIndex = useCallback(() => {\n highestIndexRef.current += 1;\n return highestIndexRef.current;\n }, []);\n\n\n const closeModal = useCallback((index: number) => {\n // console.log(\"closeModal\", index);\n setModalState(prevState => ({\n modals: prevState.modals.filter(modal => modal.index !== index),\n highestZIndex: prevState.highestZIndex,\n }));\n }, []);\n\n // useEffect(() => {\n // console.log(\"modalState\", modalState);\n // }, [modalState]);\n\n const show = useCallback((content: React.FC<ModalProps>, index?: number) => {\n setModalState(prevState => {\n const modalIndex = index ?? getNextIndex();\n const newZIndex = prevState.highestZIndex + 1;\n return {\n modals: [...prevState.modals, {\n visible: true,\n index: modalIndex,\n zIndex: newZIndex,\n content: content,\n close: () => closeModal(modalIndex),\n }],\n highestZIndex: newZIndex,\n };\n });\n }, [getNextIndex, closeModal]);\n\n const open = useCallback((props: {\n title: ReactNode;\n content: React.ComponentType<{ close: () => void, zIndex: number }>;\n index?: number;\n onBack?: () => void;\n }) => {\n setModalState(prevState => {\n const modalIndex = props.index ?? getNextIndex();\n const newZIndex = prevState.highestZIndex + 1;\n return {\n modals: [...prevState.modals, {\n visible: true,\n index: modalIndex,\n zIndex: newZIndex,\n close: () => closeModal(modalIndex),\n content: ({ close, zIndex }) => <ModalDrawer showClose isOpen onClose={close} title={props.title} zIndex={zIndex} onBack={props.onBack}>\n <props.content close={close} zIndex={zIndex} />\n </ModalDrawer>,\n }],\n highestZIndex: newZIndex,\n };\n });\n }, [getNextIndex, closeModal]);\n\n const modalElements = modalState.modals.map(modal =>\n modal.visible ? (\n createPortal(\n <modal.content key={modal.index} zIndex={modal.zIndex} close={modal.close} />,\n document.body\n )\n ) : null\n )\n\n\n return (\n <ModalContext.Provider value={{ show, open }}>\n {children}\n {modalElements}\n </ModalContext.Provider>\n );\n}\n\nexport function useModal(): ModalContextType {\n const context = useContext(ModalContext);\n if (!context) {\n throw new Error(\"useModal must be used within a ModalProvider\");\n }\n return context;\n}\n","import {CSSProperties} from \"react\";\n\nexport default function BackIcon({\n color = \"#000\",\n size = 24,\n className,\n style\n }: {\n color?: string,\n size?: number,\n style?: CSSProperties\n className?: string\n}) {\n return (\n <svg className={className} style={style} width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.2917 25.2926C11.1988 25.3855 11.1251 25.4958 11.0748 25.6172C11.0245 25.7386 10.9987 25.8687 10.9987 26.0001C10.9987 26.1315 11.0245 26.2616 11.0748 26.383C11.1251 26.5044 11.1988 26.6147 11.2917 26.7076C11.3846 26.8005 11.4949 26.8742 11.6163 26.9245C11.7377 26.9747 11.8678 27.0006 11.9992 27.0006C12.1306 27.0006 12.2607 26.9747 12.3821 26.9245C12.5035 26.8742 12.6138 26.8005 12.7067 26.7076L22.7067 16.7076C22.7997 16.6147 22.8734 16.5044 22.9238 16.383C22.9741 16.2616 23 16.1315 23 16.0001C23 15.8687 22.9741 15.7385 22.9238 15.6171C22.8734 15.4957 22.7997 15.3854 22.7067 15.2926L12.7067 5.29257C12.5191 5.10493 12.2646 4.99951 11.9992 4.99951C11.7338 4.99951 11.4794 5.10493 11.2917 5.29257C11.1041 5.48021 10.9987 5.7347 10.9987 6.00007C10.9987 6.26543 11.1041 6.51993 11.2917 6.70757L20.5855 16.0001L11.2917 25.2926Z\"\n fill={color}/>\n </svg>\n )\n}","import {CSSProperties} from \"react\";\n\nexport default function CloseIcon({\n color = \"#000\",\n size = 24,\n style\n }: {\n color?: string,\n size?: number,\n style?: CSSProperties\n\n}) {\n return <svg style={style} width={size} height={size} viewBox=\"0 0 29 29\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1 1L14.5 14.5M28 28L14.5 14.5M14.5 14.5L1 28L28 1\" stroke={color} strokeWidth=\"2\"/>\n </svg>\n}","\nexport default function XIcon({size=40}:{\n size?:number\n}) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"black\"/>\n <path\n d=\"M16 10H9L17.2609 21.0145L9.44995 29.9999H12.1L18.4883 22.651L24 30H31L22.3917 18.5223L29.8001 10H27.1501L21.1643 16.8858L16 10ZM25 28L13 12H15L27 28H25Z\"\n fill=\"white\"/>\n </svg>\n\n}","\nexport default function GoogleIcon({size=40}:{\n size?:number\n}) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"#F8F8F8\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M31.52 20.2729C31.52 19.422 31.4436 18.6038 31.3018 17.8184H20V22.4602H26.4582C26.18 23.9602 25.3345 25.2311 24.0636 26.082V29.0929H27.9418C30.2109 27.0038 31.52 23.9274 31.52 20.2729Z\"\n fill=\"#4285F4\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M20 32.0003C23.24 32.0003 25.9564 30.9257 27.9418 29.093L24.0636 26.0821C22.9891 26.8021 21.6145 27.2275 20 27.2275C16.8745 27.2275 14.2291 25.1166 13.2855 22.2803H9.27637V25.3894C11.2509 29.3112 15.3091 32.0003 20 32.0003Z\"\n fill=\"#34A853\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M13.2855 22.2804C13.0455 21.5604 12.9091 20.7913 12.9091 20.0004C12.9091 19.2095 13.0455 18.4404 13.2855 17.7204V14.6113H9.27636C8.46364 16.2313 8 18.0641 8 20.0004C8 21.9368 8.46364 23.7695 9.27636 25.3895L13.2855 22.2804Z\"\n fill=\"#FBBC05\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M20 12.7727C21.7618 12.7727 23.3436 13.3782 24.5873 14.5673L28.0291 11.1255C25.9509 9.18909 23.2345 8 20 8C15.3091 8 11.2509 10.6891 9.27637 14.6109L13.2855 17.72C14.2291 14.8836 16.8745 12.7727 20 12.7727Z\"\n fill=\"#EA4335\"/>\n </svg>\n\n}","export default function WalletIcon({\n size = 40,\n }: {\n size?: number\n\n}) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"url(#paint0_linear_412_1774)\"/>\n <path\n d=\"M32.3335 19.1112V17.3333C32.3335 15.1242 30.5426 13.3333 28.3335 13.3333H25.6668M32.3335 19.1112H25.1112C23.2089 19.1112 21.6668 20.6533 21.6668 22.5556C21.6668 24.4579 23.2089 26 25.1112 26H32.3335M32.3335 19.1112C33.0699 19.1112 33.6668 19.7081 33.6668 20.4445V24.6667C33.6668 25.403 33.0699 26 32.3335 26M32.3335 26V28C32.3335 30.2091 30.5426 32 28.3335 32H11.0002C8.79102 32 7.00016 30.2091 7.00016 28V17.3333C7.00016 15.5917 8.11324 14.1101 9.66683 13.5609M25.6668 13.3333H11.0002C10.5326 13.3333 10.0839 13.4135 9.66683 13.5609M25.6668 13.3333V11.75C25.6668 9.91548 23.8575 8.62884 22.1247 9.2311L9.66683 13.5609\"\n stroke=\"white\" strokeWidth=\"1.33333\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <circle cx=\"26.1668\" cy=\"22.8335\" r=\"2\" fill=\"white\"/>\n <defs>\n <linearGradient id=\"paint0_linear_412_1774\" x1=\"20\" y1=\"0\" x2=\"20\" y2=\"40\" gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#FFB950\"/>\n <stop offset=\"0.475\" stopColor=\"#FF7A60\"/>\n <stop offset=\"1\" stopColor=\"#FF3C4A\"/>\n </linearGradient>\n </defs>\n </svg>\n}","export default function TelegramIcon({\n size = 40,\n }: {\n size?: number\n}) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"#28A7E8\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M9.65904 18.6099C16.1373 15.7874 20.4571 13.9267 22.6186 13.0277C28.7899 10.4608 30.0723 10.0149 30.9081 10.0002C31.0919 9.99692 31.503 10.0425 31.7692 10.2585C31.994 10.4409 32.0559 10.6874 32.0855 10.8603C32.1151 11.0333 32.1519 11.4273 32.1226 11.7351C31.7882 15.249 30.3411 23.7762 29.605 27.7118C29.2935 29.3771 28.6801 29.9354 28.0863 29.9901C26.7958 30.1088 25.8159 29.1372 24.566 28.3179C22.6101 27.0358 21.5052 26.2377 19.6067 24.9867C17.4127 23.5408 18.835 22.7462 20.0853 21.4475C20.4126 21.1076 26.0985 15.9358 26.2085 15.4667C26.2223 15.408 26.2351 15.1893 26.1051 15.0738C25.9752 14.9583 25.7834 14.9978 25.645 15.0292C25.4489 15.0737 22.3244 17.1389 16.2715 21.2247C15.3847 21.8337 14.5814 22.1304 13.8616 22.1149C13.0682 22.0977 11.5419 21.6663 10.4073 21.2974C9.0156 20.8451 7.90953 20.6059 8.00585 19.8376C8.05601 19.4374 8.60708 19.0282 9.65904 18.6099Z\"\n fill=\"white\"/>\n </svg>\n\n}","export default function EmailIcon({\n size = 40,\n }: {\n size?: number\n\n}) {\n return <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"url(#paint0_linear_124_10994)\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M30.8867 12.5448C30.9585 12.4862 31 12.3997 31 12.3085C31 12.1381 30.8581 12 30.683 12H9.49205C9.2203 12 9 12.2144 9 12.4789C9 12.6212 9.06508 12.7562 9.17759 12.8472L19.5082 21.2008C19.7333 21.3828 20.06 21.3821 20.2842 21.199L30.8867 12.5448ZM9.99246 15.2938C9.59792 14.9748 9 15.2478 9 15.7471V27.9107C9 28.2362 9.27109 28.5 9.6055 28.5H30.3945C30.7289 28.5 31 28.2362 31 27.9107V15.5103C31 15.0098 30.3994 14.7372 30.0054 15.0588L20.353 22.9375C20.0642 23.1732 19.7375 23.1739 19.5124 22.9919L9.99246 15.2938Z\"\n fill=\"white\"/>\n <defs>\n <linearGradient id=\"paint0_linear_124_10994\" x1=\"20\" y1=\"0\" x2=\"20\" y2=\"40\" gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#FFB950\"/>\n <stop offset=\"0.475\" stopColor=\"#FF7A60\"/>\n <stop offset=\"1\" stopColor=\"#FF3C4A\"/>\n </linearGradient>\n </defs>\n </svg>\n}","import {IconProps} from \"types/types\";\n\nexport default function ArrowRightIcon({\n color = \"#000\",\n size = 20,\n className,\n style\n }: IconProps) {\n return <svg className={className} style={style} width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M11.4733 3.97314L10.7367 4.70971L15.3734 9.34641L3.15374 9.34641L3.15374 10.385L15.3734 10.385L10.7367 15.0217L11.4733 15.7583L17.3658 9.8657L11.4733 3.97314Z\"\n fill={color}/>\n </svg>\n\n}","import {IconProps} from \"types/types\";\n\nexport default function CloseRoundIcon({size=30,...props}:IconProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 30 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"30\" height=\"30\" rx=\"15\" fill=\"#F9F9F9\"/>\n <path d=\"M10.7574 10.7573L19.2426 19.2426\" stroke=\"#6E6E6E\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n <path d=\"M19.2426 10.7573L10.7574 19.2426\" stroke=\"#6E6E6E\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n\n}","import React from 'react';\n\ninterface LoadingIconProps {\n size?: number;\n className?: string;\n color?: string;\n rotate?: boolean;\n}\n\nconst LoadingIcon: React.FC<LoadingIconProps> = ({ size = 22, className=\"\",color=\"white\",rotate=false }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 22 22\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className+\" \"+(rotate ? 'matchid-rotate' : '')}\n >\n <path d=\"M11 1V3.5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path opacity=\"0.3\" d=\"M3.92834 3.92871L5.69977 5.70017\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path opacity=\"0.4\" d=\"M1 11H3.5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path opacity=\"0.5\" d=\"M3.92834 18.0722L5.69977 16.3008\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path opacity=\"0.6\" d=\"M11 21V18.5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path opacity=\"0.7\" d=\"M18.0715 18.0722L16.3 16.3008\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path opacity=\"0.8\" d=\"M21 11H18.5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path opacity=\"0.9\" d=\"M18.0715 3.92871L16.3 5.70017\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport default LoadingIcon;","import {IconProps} from \"../../types/types\";\n\nexport default function EmailLineIcon({\n size=24,\n color=\"black\",\n ...props\n }:IconProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M3 8.00049L10.8906 13.2609C11.5624 13.7088 12.4376 13.7088 13.1094 13.2609L21 8.00049M5 19.0005H19C20.1046 19.0005 21 18.1051 21 17.0005V7.00049C21 5.89592 20.1046 5.00049 19 5.00049H5C3.89543 5.00049 3 5.89592 3 7.00049V17.0005C3 18.1051 3.89543 19.0005 5 19.0005Z\"\n stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n\n}","import React from 'react';\nimport {IconProps} from \"../../types/types\";\n\nconst UnLoginIcon: React.FC<IconProps> = ({ size=32, color = 'white',...props }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" {...props}>\n <path\n d=\"M24 14L26 12M24 14L22 12M24 14L22 16M24 14L26 16M18 12C18 14.2091 16.2091 16 14 16C11.7909 16 10 14.2091 10 12C10 9.79086 11.7909 8 14 8C16.2091 8 18 9.79086 18 12ZM10 19H18C20.2091 19 22 20.7909 22 23C22 23.5523 21.5523 24 21 24H7C6.44772 24 6 23.5523 6 23C6 20.7909 7.79086 19 10 19Z\"\n stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nexport default UnLoginIcon;","import React from 'react';\nimport {IconProps} from \"../../types/types\";\n\nconst LoginIcon: React.FC<IconProps> = ({size = 32, color = 'white', ...props}) => (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <rect width=\"32\" height=\"32\" rx=\"16\"/>\n <path\n d=\"M22.5 14L24 15.5L27 12.5M19 11C19 13.2091 17.2091 15 15 15C12.7909 15 11 13.2091 11 11C11 8.79086 12.7909 7 15 7C17.2091 7 19 8.79086 19 11ZM11 18H19C21.2091 18 23 19.7909 23 22C23 22.5523 22.5523 23 22 23H8C7.44772 23 7 22.5523 7 22C7 19.7909 8.79086 18 11 18Z\"\n stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n\n);\n\nexport default LoginIcon;","import {IconProps} from \"../../types/types\";\n\nexport default function CheckRoundIcon({\n size,\n color=\"#2CBF68\",\n ...props\n }:Omit<IconProps, 'width'|'height'>) {\n return <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <g clipPath=\"url(#clip0_418_7699)\">\n <path\n d=\"M14.6668 8.00016C14.6668 11.6821 11.6821 14.6668 8.00016 14.6668C4.31826 14.6668 1.3335 11.6821 1.3335 8.00016C1.3335 4.31826 4.31826 1.3335 8.00016 1.3335C11.6821 1.3335 14.6668 4.31826 14.6668 8.00016Z\"\n fill={color} stroke={color} strokeLinecap=\"round\"/>\n <path\n d=\"M10.6867 5.97994C10.882 6.1752 10.882 6.49179 10.6867 6.68705L7.35339 10.0204C7.15813 10.2156 6.84155 10.2156 6.64628 10.0204L5.31295 8.68705C5.11769 8.49179 5.11769 8.1752 5.31295 7.97994C5.50821 7.78468 5.8248 7.78468 6.02006 7.97994L6.99984 8.95972L8.48973 7.46983L9.97962 5.97994C10.1749 5.78468 10.4915 5.78468 10.6867 5.97994Z\"\n fill=\"white\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_418_7699\">\n <rect width=\"16\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n\n}","export default function PasswordRoundIcon() {\n return <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"0.5\" y=\"0.5\" width=\"39\" height=\"39\" rx=\"7.5\" fill=\"white\"/>\n <rect x=\"0.5\" y=\"0.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"black\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M19.7673 16.1137C19.962 13.9479 21.7831 12.25 24 12.25C26.3472 12.25 28.25 14.1528 28.25 16.5C28.25 18.8472 26.3472 20.75 24 20.75C23.488 20.75 22.9987 20.6598 22.5461 20.495C21.9175 20.2662 21.1115 20.3279 20.5486 20.8908L19.2626 22.1768C19.2157 22.2237 19.1521 22.25 19.0858 22.25H18C17.3096 22.25 16.75 22.8096 16.75 23.5V24.25H15.5C14.8096 24.25 14.25 24.8096 14.25 25.5V26.5C14.25 26.6381 14.1381 26.75 14 26.75H12C11.8619 26.75 11.75 26.6381 11.75 26.5V23.9538C11.75 23.8817 11.7811 23.8131 11.8354 23.7656L19.1524 17.3632C19.5404 17.0238 19.7275 16.556 19.7673 16.1137ZM24 10.75C20.9997 10.75 18.5369 13.0473 18.2733 15.9794C18.2614 16.1115 18.2107 16.1941 18.1646 16.2344L10.8476 22.6368C10.4678 22.9691 10.25 23.4491 10.25 23.9538V26.5C10.25 27.4665 11.0335 28.25 12 28.25H14C14.9665 28.25 15.75 27.4665 15.75 26.5V25.75H17C17.6904 25.75 18.25 25.1904 18.25 24.5V23.75H19.0858C19.5499 23.75 19.995 23.5656 20.3232 23.2374L21.6092 21.9514C21.6738 21.8868 21.8277 21.8298 22.033 21.9045C22.6476 22.1283 23.3104 22.25 24 22.25C27.1756 22.25 29.75 19.6756 29.75 16.5C29.75 13.3244 27.1756 10.75 24 10.75ZM25 16.5C25.5523 16.5 26 16.0523 26 15.5C26 14.9477 25.5523 14.5 25 14.5C24.4477 14.5 24 14.9477 24 15.5C24 16.0523 24.4477 16.5 25 16.5Z\"\n fill=\"black\"/>\n </svg>\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function CloseEyeIcon({\n size = 20,\n color = '#6E6E6E'\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M9.15132 12.5568V11.5464C8.21031 11.4949 7.28023 11.3193 6.38524 11.024L6.04233 11.9579C6.00626 12.0669 5.94867 12.1676 5.87299 12.2539C5.79731 12.3403 5.70508 12.4106 5.60174 12.4607C5.4984 12.5108 5.38607 12.5396 5.27139 12.5455C5.15671 12.5514 5.04201 12.5342 4.93409 12.4949C4.82617 12.4557 4.72722 12.3952 4.6431 12.317C4.55898 12.2389 4.49139 12.1446 4.44435 12.0399C4.3973 11.9351 4.37175 11.822 4.36921 11.7072C4.36667 11.5924 4.38719 11.4783 4.42955 11.3715L4.80788 10.3268C4.04603 9.88461 3.32634 9.37345 2.65789 8.79975C2.54358 8.70488 2.42928 8.61687 2.32184 8.52772C2.1442 8.38554 2.03031 8.17862 2.00523 7.95247C1.98015 7.72633 2.04593 7.49948 2.18811 7.32184C2.33028 7.1442 2.5372 7.03031 2.76335 7.00523C2.98949 6.98015 3.21634 7.04593 3.39398 7.18811C3.50828 7.27955 3.62258 7.37099 3.73689 7.47043C5.46065 9.00826 7.68996 9.85815 10 9.85815C12.31 9.85815 14.5393 9.00826 16.2631 7.47043C16.3774 7.37099 16.4917 7.27955 16.606 7.18811C16.694 7.11771 16.7949 7.06533 16.9031 7.03395C17.0114 7.00257 17.1247 6.99281 17.2367 7.00523C17.3486 7.01765 17.4571 7.052 17.5558 7.10632C17.6545 7.16065 17.7415 7.23388 17.8119 7.32184C17.8823 7.4098 17.9347 7.51077 17.9661 7.61897C17.9974 7.72717 18.0072 7.8405 17.9948 7.95247C17.9824 8.06445 17.948 8.17288 17.8937 8.27158C17.8394 8.37028 17.7661 8.45732 17.6782 8.52772L17.3421 8.79975C16.6737 9.37354 15.954 9.88471 15.1921 10.3268L15.5705 11.3715C15.6128 11.4783 15.6333 11.5924 15.6308 11.7072C15.6283 11.822 15.6027 11.9351 15.5557 12.0399C15.5086 12.1446 15.441 12.2389 15.3569 12.317C15.2728 12.3952 15.1738 12.4557 15.0659 12.4949C14.958 12.5342 14.8433 12.5514 14.7286 12.5455C14.6139 12.5396 14.5016 12.5108 14.3983 12.4607C14.2949 12.4106 14.2027 12.3403 14.127 12.2539C14.0513 12.1676 13.9937 12.0669 13.9577 11.9579L13.6148 11.024C12.7198 11.3193 11.7897 11.4949 10.8487 11.5464V12.5568C10.8487 12.7842 10.7584 13.0022 10.5976 13.163C10.4368 13.3238 10.2188 13.4141 9.99143 13.4141C9.76407 13.4141 9.54602 13.3238 9.38526 13.163C9.22449 13.0022 9.13417 12.7842 9.13417 12.5568H9.15132Z\"\n fill={color}/>\n </svg>\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function OpenEyeIcon({\n size = 20,\n color = '#6E6E6E'\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10 6.4543C11.3373 6.44986 12.6486 6.82287 13.7834 7.53047C14.9181 8.23806 15.8301 9.25151 16.4145 10.4543C15.2145 12.9052 12.7564 14.4543 10 14.4543C7.24364 14.4543 4.78545 12.9052 3.58545 10.4543C4.1699 9.25151 5.08191 8.23806 6.21664 7.53047C7.35136 6.82287 8.66274 6.44986 10 6.4543ZM10 4.99976C6.36364 4.99976 3.25818 7.26157 2 10.4543C3.25818 13.647 6.36364 15.9088 10 15.9088C13.6364 15.9088 16.7418 13.647 18 10.4543C16.7418 7.26157 13.6364 4.99976 10 4.99976ZM10 8.63612C10.4822 8.63617 10.9446 8.82774 11.2855 9.16871C11.6265 9.50968 11.818 9.97212 11.818 10.4543C11.818 10.9365 11.6265 11.3989 11.2855 11.7399C10.9446 12.0809 10.4822 12.2724 10 12.2725C9.51782 12.2724 9.0554 12.0809 8.71447 11.7399C8.37353 11.3989 8.18199 10.9365 8.18199 10.4543C8.18199 9.97212 8.37353 9.50968 8.71447 9.16871C9.0554 8.82774 9.51782 8.63617 10 8.63612ZM10 7.18157C8.19636 7.18157 6.72727 8.65066 6.72727 10.4543C6.72727 12.2579 8.19636 13.727 10 13.727C11.8036 13.727 13.2727 12.2579 13.2727 10.4543C13.2727 8.65066 11.8036 7.18157 10 7.18157Z\"\n fill={color}/>\n </svg>\n\n}","import {IconProps} from \"../../types/types\";\n\nexport default function DeleteRoundIcon({height = 21,width=20, color = \"var(--matchid-error-color)\",...props}:IconProps) {\n return <svg width={width} height={height} viewBox=\"0 0 20 21\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <rect y=\"0.5\" width=\"20\" height=\"20\" rx=\"10\" fill={color}/>\n <path d=\"M7.17139 7.67188L12.8282 13.3287\" stroke=\"white\" strokeLinecap=\"round\"/>\n <path d=\"M12.8286 7.67188L7.17176 13.3287\" stroke=\"white\" strokeLinecap=\"round\"/>\n </svg>\n\n}","export default function FacebookIcon({\n size = 40\n }: {\n size?: number | string\n}) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"#1877F2\"/>\n <path\n d=\"M27.7852 28.9688L28.6719 23.1875H23.125V19.4375C23.125 17.8555 23.8984 16.3125 26.3828 16.3125H28.9062V11.3906C28.9062 11.3906 26.6172 11 24.4297 11C19.8594 11 16.875 13.7695 16.875 18.7813V23.1875H11.7969V28.9688H16.875V42.9453C17.8945 43.1055 18.9375 43.1875 20 43.1875C21.0625 43.1875 22.1055 43.1055 23.125 42.9453V28.9688H27.7852Z\"\n fill=\"white\"/>\n\n </svg>\n\n}","import {IconProps} from \"types/types\";\n\nexport default function ArrowLeftIcon({\n color = \"#000\",\n width = 24,\n height = 25,\n ...props\n }: IconProps) {\n return <svg width={width} height={height} {...props} viewBox=\"0 0 24 25\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M10.2322 5.26777L11.1161 6.15165L5.55207 11.7157H20.2157L20.2157 12.962L5.55207 12.962L11.1161 18.526L10.2322 19.4099L3.16117 12.3388L10.2322 5.26777Z\"\n fill={color}/>\n </svg>\n\n}","export default function GithubIcon({\n size = 40\n }: {\n size?: number | string\n}) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"black\"/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M19.6836 7C16.434 7.00169 13.2909 8.15263 10.8165 10.247C8.34197 12.3414 6.69741 15.2427 6.17684 18.4321C5.65627 21.6215 6.29363 24.8911 7.97496 27.6561C9.6563 30.4211 12.272 32.5013 15.3542 33.5248C16.0343 33.651 16.2904 33.2295 16.2904 32.8712C16.2904 32.5128 16.2768 31.4738 16.2723 30.3379C12.4642 31.1606 11.6596 28.731 11.6596 28.731C11.0385 27.1533 10.1409 26.7386 10.1409 26.7386C8.89876 25.8957 10.2338 25.9115 10.2338 25.9115C11.6097 26.0084 12.3328 27.3156 12.3328 27.3156C13.5523 29.3958 15.5356 28.7941 16.3153 28.4425C16.4377 27.5613 16.7936 26.9618 17.1857 26.6214C14.1438 26.2789 10.9478 25.1114 10.9478 19.8961C10.929 18.5436 11.4338 17.2356 12.3577 16.2428C12.2172 15.9002 11.748 14.5164 12.4914 12.6367C12.4914 12.6367 13.6407 12.2716 16.2564 14.0318C18.5 13.4217 20.8672 13.4217 23.1108 14.0318C25.7243 12.2716 26.8712 12.6367 26.8712 12.6367C27.617 14.5119 27.1478 15.8957 27.0072 16.2428C27.9341 17.2358 28.4399 18.546 28.4194 19.9007C28.4194 25.1272 25.2166 26.2789 22.1701 26.6147C22.6597 27.0384 23.0972 27.8655 23.0972 29.1367C23.0972 30.9577 23.0814 32.4227 23.0814 32.8712C23.0814 33.234 23.3284 33.6577 24.022 33.5248C27.1047 32.5012 29.7206 30.4206 31.4019 27.6551C33.0832 24.8896 33.7202 21.6196 33.1991 18.4299C32.6779 15.2402 31.0325 12.3389 28.5572 10.2449C26.0819 8.15081 22.9381 7.00062 19.6881 7H19.6836Z\"\n fill=\"white\"/>\n <path\n d=\"M11.1789 26.543C11.1495 26.6106 11.0407 26.6309 10.9523 26.5836C10.8639 26.5362 10.7982 26.4483 10.8299 26.3785C10.8616 26.3086 10.9682 26.2906 11.0566 26.3379C11.145 26.3852 11.2129 26.4754 11.1789 26.543Z\"\n fill=\"white\"/>\n <path\n d=\"M11.7339 27.1582C11.687 27.1817 11.6333 27.1883 11.582 27.1768C11.5308 27.1652 11.4851 27.1364 11.4529 27.0951C11.3645 27.0004 11.3463 26.8697 11.4143 26.8111C11.4823 26.7525 11.6048 26.7796 11.6932 26.8742C11.7816 26.9689 11.8019 27.0996 11.7339 27.1582Z\"\n fill=\"white\"/>\n <path\n d=\"M12.2738 27.9394C12.1899 27.998 12.0471 27.9394 11.9678 27.8222C11.9459 27.8012 11.9284 27.776 11.9165 27.7481C11.9046 27.7202 11.8984 27.6902 11.8984 27.6599C11.8984 27.6296 11.9046 27.5996 11.9165 27.5718C11.9284 27.5439 11.9459 27.5187 11.9678 27.4976C12.0517 27.4413 12.1945 27.4976 12.2738 27.6126C12.3531 27.7275 12.3554 27.8808 12.2738 27.9394Z\"\n fill=\"white\"/>\n <path\n d=\"M13.0055 28.6975C12.9307 28.7809 12.7789 28.7584 12.6542 28.6457C12.5295 28.533 12.5001 28.3797 12.5749 28.2986C12.6497 28.2175 12.8015 28.24 12.9307 28.3505C13.0599 28.4609 13.0849 28.6164 13.0055 28.6975Z\"\n fill=\"white\"/>\n <path\n d=\"M14.0325 29.1386C13.9985 29.2445 13.8444 29.2919 13.6902 29.2468C13.5361 29.2017 13.4341 29.0755 13.4636 28.9673C13.493 28.8591 13.6494 28.8095 13.8058 28.8591C13.9622 28.9087 14.062 29.0282 14.0325 29.1386Z\"\n fill=\"white\"/>\n <path\n d=\"M15.1525 29.216C15.1525 29.3264 15.0256 29.421 14.8624 29.4233C14.6992 29.4256 14.5654 29.3354 14.5654 29.225C14.5654 29.1145 14.6924 29.0199 14.8556 29.0176C15.0188 29.0154 15.1525 29.1033 15.1525 29.216Z\"\n fill=\"white\"/>\n <path\n d=\"M16.1947 29.0423C16.2151 29.1527 16.1018 29.2677 15.9386 29.2947C15.7754 29.3218 15.6326 29.2564 15.6122 29.1482C15.5918 29.0401 15.7096 28.9229 15.8683 28.8936C16.027 28.8643 16.1743 28.9319 16.1947 29.0423Z\"\n fill=\"white\"/>\n\n </svg>\n\n}","export default function DiscordIcon({\n size=40\n }:{\n size?: number | string\n}) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"#5865F2\"/>\n <path\n d=\"M29.7032 10.8237C27.9186 9.97958 26.0048 9.35768 24.0039 9.00149C23.9674 8.99462 23.931 9.0118 23.9123 9.04616C23.6661 9.4974 23.3935 10.0861 23.2026 10.5488C21.0505 10.2167 18.9094 10.2167 16.8014 10.5488C16.6104 10.0758 16.3279 9.4974 16.0807 9.04616C16.0619 9.01295 16.0255 8.99577 15.9891 9.00149C13.9892 9.35654 12.0755 9.97844 10.2898 10.8237C10.2743 10.8306 10.261 10.842 10.2523 10.8569C6.62229 16.4471 5.62789 21.9 6.11571 27.2852C6.11792 27.3116 6.13226 27.3368 6.15213 27.3528C8.54708 29.1658 10.867 30.2664 13.1438 30.996C13.1803 31.0075 13.2189 30.9937 13.2421 30.9628C13.7806 30.2046 14.2607 29.4052 14.6724 28.5645C14.6967 28.5153 14.6735 28.4569 14.6238 28.4374C13.8623 28.1396 13.1372 27.7765 12.4397 27.3642C12.3845 27.331 12.3801 27.2497 12.4309 27.2107C12.5776 27.0974 12.7245 26.9794 12.8646 26.8603C12.89 26.8385 12.9253 26.8339 12.9551 26.8477C17.5375 29.0043 22.4985 29.0043 27.0268 26.8477C27.0566 26.8328 27.0919 26.8374 27.1184 26.8591C27.2586 26.9783 27.4054 27.0974 27.5533 27.2107C27.604 27.2497 27.6007 27.331 27.5455 27.3642C26.848 27.7845 26.1229 28.1396 25.3603 28.4362C25.3106 28.4557 25.2885 28.5153 25.3128 28.5645C25.7333 29.404 26.2134 30.2034 26.742 30.9616C26.7641 30.9937 26.8038 31.0075 26.8403 30.996C29.1282 30.2664 31.4481 29.1658 33.843 27.3528C33.864 27.3368 33.8772 27.3127 33.8794 27.2864C34.4633 21.0604 32.9016 15.6523 29.7396 10.858C29.7319 10.842 29.7186 10.8306 29.7032 10.8237ZM15.3567 24.0062C13.9771 24.0062 12.8403 22.7005 12.8403 21.0971C12.8403 19.4937 13.955 18.188 15.3567 18.188C16.7694 18.188 17.8951 19.5051 17.873 21.0971C17.873 22.7005 16.7583 24.0062 15.3567 24.0062ZM24.6605 24.0062C23.281 24.0062 22.1442 22.7005 22.1442 21.0971C22.1442 19.4937 23.2589 18.188 24.6605 18.188C26.0732 18.188 27.199 19.5051 27.1769 21.0971C27.1769 22.7005 26.0732 24.0062 24.6605 24.0062Z\"\n fill=\"white\"/>\n </svg>\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function CheckIcon({\n size=20,\n color=\"black\",\n ...props\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path d=\"M5 9.99996L8.33333 13.3333L15 6.66663\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\"\n strokeLinejoin=\"round\"/>\n </svg>\n\n}","import React from \"react\";\nimport {IconSizeColorProps} from \"./types\";\n\nexport default function CopyIcon({size = 20, color = 'black', ...props}: IconSizeColorProps) {\n\n return (\n <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M4.16673 12.5009C3.24625 12.5009 2.50006 11.7547 2.50006 10.8342V4.16752C2.50006 3.24705 3.24625 2.50085 4.16673 2.50085H10.8334C11.7539 2.50085 12.5001 3.24705 12.5001 4.16752M9.16673 17.5009H15.8334C16.7539 17.5009 17.5001 16.7547 17.5001 15.8342V9.16752C17.5001 8.24705 16.7539 7.50086 15.8334 7.50086H9.16673C8.24625 7.50086 7.50006 8.24705 7.50006 9.16752V15.8342C7.50006 16.7547 8.24625 17.5009 9.16673 17.5009Z\"\n stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n\n </svg>\n )\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function LinkedinIcon({\n size=40,\n ...props\n }:IconSizeColorProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"#0A66C2\"/>\n <path\n d=\"M29.376 9H10.624C10.1933 9 9.78023 9.1711 9.47567 9.47567C9.1711 9.78023 9 10.1933 9 10.624V29.376C9 29.8067 9.1711 30.2198 9.47567 30.5243C9.78023 30.8289 10.1933 31 10.624 31H29.376C29.8067 31 30.2198 30.8289 30.5243 30.5243C30.8289 30.2198 31 29.8067 31 29.376V10.624C31 10.1933 30.8289 9.78023 30.5243 9.47567C30.2198 9.1711 29.8067 9 29.376 9ZM15.5572 27.7413H12.2496V17.2347H15.5572V27.7413ZM13.9011 15.7788C13.5259 15.7766 13.1598 15.6634 12.8488 15.4534C12.5379 15.2434 12.2962 14.946 12.1541 14.5987C12.0121 14.2514 11.9761 13.8699 12.0507 13.5022C12.1253 13.1345 12.3072 12.7971 12.5733 12.5326C12.8395 12.2682 13.178 12.0885 13.5462 12.0163C13.9144 11.944 14.2957 11.9825 14.642 12.1267C14.9884 12.271 15.2842 12.5147 15.4923 12.8269C15.7003 13.1392 15.8111 13.5061 15.8108 13.8813C15.8144 14.1324 15.7673 14.3818 15.6724 14.6144C15.5776 14.847 15.4368 15.0582 15.2586 15.2352C15.0804 15.4123 14.8684 15.5517 14.6351 15.6451C14.4019 15.7384 14.1523 15.7839 13.9011 15.7788ZM27.7489 27.7504H24.4428V22.0106C24.4428 20.3178 23.7232 19.7953 22.7943 19.7953C21.8135 19.7953 20.851 20.5347 20.851 22.0533V27.7504H17.5433V17.2424H20.7242V18.6983H20.7669C21.0863 18.0521 22.2046 16.9475 23.9111 16.9475C25.7567 16.9475 27.7504 18.0429 27.7504 21.2513L27.7489 27.7504Z\"\n fill=\"white\"/>\n </svg>\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function YoutubeIcon({ size=40,...props}: IconSizeColorProps) {\n return (\n <svg width={size} height={size} {...{props}} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"#FF0000\"/>\n <path\n d=\"M33.9855 13.1304C33.656 11.9065 32.691 10.9415 31.4671 10.612C29.231 10 20.287 10 20.287 10C20.287 10 11.3429 10 9.10689 10.5884C7.9065 10.9179 6.91794 11.9065 6.58843 13.1304C6 15.3664 6 20.0032 6 20.0032C6 20.0032 6 24.6636 6.58843 26.876C6.91794 28.1 7.88296 29.065 9.10689 29.3945C11.3664 30.0065 20.287 30.0065 20.287 30.0065C20.287 30.0065 29.231 30.0065 31.4671 29.418C32.691 29.0885 33.656 28.1235 33.9855 26.8996C34.5739 24.6636 34.5739 20.0268 34.5739 20.0268C34.5739 20.0268 34.5975 15.3664 33.9855 13.1304Z\"\n fill=\"white\"/>\n <path d=\"M17.439 24.2867L24.8767 20.003L17.439 15.7192V24.2867Z\" fill=\"#FF0000\"/>\n </svg>\n );\n}","import {IconSizeProps} from \"./types\";\n\nexport default function BTCDarkIcon({size = 40, ...props}: IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M28.763 17.1292C29.1611 14.4674 27.1346 13.0365 24.3634 12.082L25.2624 8.47628L23.0675 7.92936L22.1923 11.4402C21.6153 11.2962 21.0227 11.1606 20.4338 11.0262L21.3152 7.49223L19.1217 6.94531L18.2222 10.5499C17.7447 10.4411 17.2757 10.3337 16.8207 10.2205L16.8232 10.2091L13.7964 9.45329L13.2125 11.7976C13.2125 11.7976 14.841 12.1709 14.8067 12.1939C15.6955 12.4157 15.8562 13.0041 15.8295 13.4704L14.8055 17.5782C14.8667 17.5937 14.9461 17.6162 15.0337 17.6514C14.9604 17.6332 14.8825 17.6134 14.8017 17.594L13.3663 23.3484C13.2577 23.6185 12.982 24.0237 12.3606 23.8698C12.3826 23.9017 10.7653 23.4717 10.7653 23.4717L9.67554 25.9842L12.5319 26.6962C13.0632 26.8295 13.584 26.9689 14.0968 27.1L13.1885 30.7471L15.3809 31.294L16.2803 27.6857C16.8793 27.8483 17.4605 27.9982 18.0295 28.1396L17.1331 31.731L19.3281 32.2779L20.2363 28.6376C23.9791 29.346 26.7934 29.0604 27.9779 25.675C28.9324 22.9494 27.9304 21.3773 25.9613 20.3521C27.3955 20.0213 28.4758 19.0781 28.7638 17.1295L28.7631 17.129L28.763 17.1292ZM23.7481 24.1614C23.0698 26.887 18.4807 25.4136 16.9929 25.0441L18.1982 20.2124C19.6859 20.5838 24.4571 21.3188 23.7482 24.1614H23.7481ZM24.4269 17.0897C23.8082 19.569 19.9886 18.3094 18.7496 18.0006L19.8424 13.6184C21.0814 13.9273 25.0715 14.5037 24.4271 17.0897H24.4269Z\"\n fill=\"black\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function BTCLightIcon({size = 40, ...props}: IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M28.763 17.1292C29.1611 14.4674 27.1346 13.0365 24.3634 12.082L25.2624 8.47628L23.0675 7.92936L22.1923 11.4402C21.6153 11.2962 21.0227 11.1606 20.4338 11.0262L21.3152 7.49223L19.1217 6.94531L18.2222 10.5499C17.7447 10.4411 17.2757 10.3337 16.8207 10.2205L16.8232 10.2091L13.7964 9.45329L13.2125 11.7976C13.2125 11.7976 14.841 12.1709 14.8067 12.1939C15.6955 12.4157 15.8562 13.0041 15.8295 13.4704L14.8055 17.5782C14.8667 17.5937 14.9461 17.6162 15.0337 17.6514C14.9604 17.6332 14.8825 17.6134 14.8017 17.594L13.3663 23.3484C13.2577 23.6185 12.982 24.0237 12.3606 23.8698C12.3826 23.9017 10.7653 23.4717 10.7653 23.4717L9.67554 25.9842L12.5319 26.6962C13.0632 26.8295 13.584 26.9689 14.0968 27.1L13.1885 30.7471L15.3809 31.294L16.2803 27.6857C16.8793 27.8483 17.4605 27.9982 18.0295 28.1396L17.1331 31.731L19.3281 32.2779L20.2363 28.6376C23.9791 29.346 26.7934 29.0604 27.9779 25.675C28.9324 22.9494 27.9304 21.3773 25.9613 20.3521C27.3955 20.0213 28.4758 19.0781 28.7638 17.1295L28.7631 17.129L28.763 17.1292ZM23.7481 24.1614C23.0698 26.887 18.4807 25.4136 16.9929 25.0441L18.1982 20.2124C19.6859 20.5838 24.4571 21.3188 23.7482 24.1614H23.7481ZM24.4269 17.0897C23.8082 19.569 19.9886 18.3094 18.7496 18.0006L19.8424 13.6184C21.0814 13.9273 25.0715 14.5037 24.4271 17.0897H24.4269Z\"\n fill=\"white\"/>\n\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function EVMDarkIcon({ size=40,...props}: IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M20.5956 14.6424L25.0599 7.49951L29.5242 14.6424H20.5956Z\" fill=\"#6E6E6E\"/>\n <path d=\"M11.667 14.6424L16.1313 7.49951L20.5956 14.6424H11.667Z\" fill=\"#6E6E6E\"/>\n <path d=\"M25.0597 7.50021L20.5954 14.6431L16.1311 7.50021H25.0597Z\" fill=\"black\"/>\n <path d=\"M20.5956 14.6423L16.1313 21.7852L11.667 14.6423H20.5956Z\" fill=\"black\"/>\n <path d=\"M20.5952 25.3567L16.1309 32.4995L11.6666 25.3567H20.5952Z\" fill=\"#6E6E6E\"/>\n <path d=\"M29.5243 25.3567L25.06 32.4995L20.5957 25.3567H29.5243Z\" fill=\"#6E6E6E\"/>\n <path d=\"M16.1315 32.5008L20.5958 25.3579L25.06 32.5008H16.1315Z\" fill=\"black\"/>\n <path d=\"M20.5956 25.3572L25.0599 18.2144L29.5242 25.3572H20.5956Z\" fill=\"black\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function EVMLightIcon({ size=40,...props}: IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M20.5955 14.6424L25.0597 7.49951L29.524 14.6424H20.5955Z\" fill=\"#D9D9D9\"/>\n <path d=\"M11.6667 14.6424L16.131 7.49951L20.5953 14.6424H11.6667Z\" fill=\"#EFEFEF\"/>\n <path d=\"M25.0596 7.50021L20.5953 14.6431L16.131 7.50021H25.0596Z\" fill=\"white\"/>\n <path d=\"M20.5955 14.6423L16.1312 21.7852L11.6669 14.6423H20.5955Z\" fill=\"white\"/>\n <path d=\"M20.595 25.3567L16.1307 32.4995L11.6664 25.3567H20.595Z\" fill=\"#D9D9D9\"/>\n <path d=\"M29.5242 25.3567L25.0599 32.4995L20.5956 25.3567H29.5242Z\" fill=\"#EFEFEF\"/>\n <path d=\"M16.1313 32.5008L20.5956 25.3579L25.0599 32.5008H16.1313Z\" fill=\"white\"/>\n <path d=\"M20.5955 25.3572L25.0597 18.2144L29.524 25.3572H20.5955Z\" fill=\"white\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function SOLDarkIcon({ size=40,...props}: IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12.1242 24.7415C12.265 24.6007 12.4586 24.5186 12.6639 24.5186H31.2841C31.6243 24.5186 31.7945 24.9292 31.5539 25.1697L27.8757 28.848C27.7349 28.9888 27.5413 29.0709 27.3359 29.0709H8.71576C8.3755 29.0709 8.20537 28.6603 8.4459 28.4198L12.1242 24.7415Z\"\n fill=\"black\"/>\n <path\n d=\"M12.1243 11.0081C12.271 10.8673 12.4646 10.7852 12.664 10.7852H31.2842C31.6245 10.7852 31.7946 11.1958 31.5541 11.4363L27.8758 15.1146C27.735 15.2554 27.5414 15.3375 27.3361 15.3375H8.71588C8.37562 15.3375 8.20549 14.9269 8.44602 14.6864L12.1243 11.0081Z\"\n fill=\"black\"/>\n <path\n d=\"M27.8757 17.8299C27.7349 17.6891 27.5413 17.6069 27.3359 17.6069H8.71576C8.3755 17.6069 8.20537 18.0176 8.4459 18.2581L12.1242 21.9364C12.265 22.0772 12.4586 22.1593 12.6639 22.1593H31.2841C31.6243 22.1593 31.7945 21.7487 31.5539 21.5081L27.8757 17.8299Z\"\n fill=\"black\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function SOLLightIcon({size = 40, ...props}: IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12.1239 24.7415C12.2647 24.6007 12.4583 24.5186 12.6636 24.5186H31.2838C31.6241 24.5186 31.7942 24.9292 31.5537 25.1697L27.8754 28.848C27.7346 28.9888 27.541 29.0709 27.3357 29.0709H8.71551C8.37526 29.0709 8.20513 28.6603 8.44565 28.4198L12.1239 24.7415Z\"\n fill=\"white\"/>\n <path\n d=\"M12.1242 11.0081C12.2708 10.8673 12.4644 10.7852 12.6639 10.7852H31.2841C31.6243 10.7852 31.7945 11.1958 31.5539 11.4363L27.8757 15.1146C27.7349 15.2554 27.5413 15.3375 27.3359 15.3375H8.71576C8.3755 15.3375 8.20537 14.9269 8.4459 14.6864L12.1242 11.0081Z\"\n fill=\"white\"/>\n <path\n d=\"M27.8754 17.8299C27.7346 17.6891 27.541 17.6069 27.3357 17.6069H8.71551C8.37526 17.6069 8.20513 18.0176 8.44565 18.2581L12.1239 21.9364C12.2647 22.0772 12.4583 22.1593 12.6636 22.1593H31.2838C31.6241 22.1593 31.7942 21.7487 31.5537 21.5081L27.8754 17.8299Z\"\n fill=\"white\"/>\n\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function TRXDarkIcon({size=40,...props}: IconSizeProps) {\n return (\n <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\">\n <mask id=\"mask0_1215_64214\" style={{ maskType: \"alpha\" }} maskUnits=\"userSpaceOnUse\" x=\"6\" y=\"6\" width=\"28\"\n height=\"28\">\n <rect x=\"6.66663\" y=\"6.6665\" width=\"26.6667\" height=\"26.6667\" fill=\"url(#pattern0_1215_64214)\"/>\n </mask>\n <g mask=\"url(#mask0_1215_64214)\">\n <rect x=\"6.66663\" y=\"6.6665\" width=\"26.6667\" height=\"26.6667\" fill=\"black\"/>\n </g>\n <defs>\n <pattern id=\"pattern0_1215_64214\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\n <use xlinkHref=\"#image0_1215_64214\" transform=\"scale(0.01)\"/>\n </pattern>\n <image id=\"image0_1215_64214\" width=\"100\" height=\"100\"\n xlinkHref=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGk2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OTc3NywgMjAyMy8wNi8yNS0yMzo1NzoxNCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjMgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDI1LTAxLTE0VDExOjA4OjEyKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNS0wMS0xNFQxMToxMToyMSswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNS0wMS0xNFQxMToxMToyMSswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDBiNDhmNDgtN2IwNi00N2E2LWI0ZGItYzk3NTdmN2U0OWY0IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOmRjOGI3N2Y3LWRlYzYtNGJkYS04ZjExLTUwYjdkZjdjOWY4YiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmRjOGI3N2Y3LWRlYzYtNGJkYS04ZjExLTUwYjdkZjdjOWY4YiI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZGM4Yjc3ZjctZGVjNi00YmRhLThmMTEtNTBiN2RmN2M5ZjhiIiBzdEV2dDp3aGVuPSIyMDI1LTAxLTE0VDExOjA4OjEyKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMyAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NThjMzllN2EtNDZkYi00N2UzLTgyMjYtMTZkNTZkNTc1NmViIiBzdEV2dDp3aGVuPSIyMDI1LTAxLTE0VDExOjEwOjExKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MDBiNDhmNDgtN2IwNi00N2E2LWI0ZGItYzk3NTdmN2U0OWY0IiBzdEV2dDp3aGVuPSIyMDI1LTAxLTE0VDExOjExOjIxKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5guAj8AAAWbElEQVR4nO2de5xdRZHHv9VnZpJgwICILBDCAiEQXqviBgVBEBQE84EFUcBsQCJEYZWPiIqoIIov2AUVZBNAHmGJ8lwjIsQooiAfjLJRQ0iAhCTkDQkIhMfMPV37R59z7zn3dJ9778ydyUX9fT4Fk/Poru7qrqqurtNXVBUAekZ0I+ZsRM5FdSXwF4SnsboIWISYVaDrgZdBgOS9KhR3vRkIqE0el/z1QrkldaiClPy7KaT1SfjfKplqPe3UDM8ixeckfSZpt6bPpc8K9L4EQFemoPMR+TKqBngz8C+1FwF4BlgCLAUWJrQcWAasbKrt/0BDSHWGDB+5ANU9Wny/F1gBPAU8ATwGLAYexwmuL1DtP2ZIwxmiuhJkj/IOKaAH2Dmh9ybXKsCLwGpgAW4mLQbm4wT3HGBbqeTvCTWBoDNBJgCbt6HMLRMaX3dvFfAI8CSwAGQhTt2tAV4eYL1/E8jMELkH0T+BHNjiLGkF2znKqZZ1OPW2DHQBsAg3kxbj7NbfFTJGXVcBM5xAhhTbJPSvmWsbgWeBp4E/4GzTk8n/1zCII2ZTo2bUe0YCjEZ0IbBZC2X04ezCm4CozfxlEQN/xTkP84ElqC5AZBFOSC+gGr/ejXpGIG9I712ByJm5SsrRC3wVWA3yQdBxONU0qtkCBohenDv+JKrzEHkUp/JWOp6Iy1/vVIF0j0gLfC9G5rSoFJYCn0Z1FiIjQXYCHYPqHoiMB3ZC2ANl25ZK7T9exQnjaZwLvgCn8p5IKCOkThVIT1VLjUBkDsi7PKq6glNRIzydAKpXIvIf1VbV1gXDELbCsj3CW4G9gXHAHrhF6HBvee2Fxam8dThb9AdgIeijwEqQje6ZjhFIpo9FLgC50Nss1asQeSNwUqDhc4CPAU8XmLL1bZHNUd0NYXdgV2BPYCzwFpyhH0yblKIPp+KSWaSPAY+BrACeAX110whkWG6Q7gXRfcDW+ZoFVB8GewRiLgU5ze/wyDLQE0EfqnHka4sksyj3cuRUHmNAdwH2A9kNdAwwmtzaaVCxCieopcA84M/ActClIK/mnhwCgQDmNpDjinwKaHwcIneA+QHoJwINehX4JOh1jj8DUi88r0AyjFbVRzfo1sC2KGMR2TsR1m441TcywEM7YYENwFqcPboBuNOxOShGvdCmiUT2TlRM/rIAOhe1B4LpBf0sYi4JLw3028AXagKxgKmV1ZxAan9XG6MAw0G2AR3vZhH7gL4N+CdgK1xoZzDxQ+AsVF+psd42gbyhvrIejPwFdDcvK2oPBe5DBYyciHAlypZ+vvVW1HwC0fVtFkjmXqoWFWA7hN0Q2QXV8bhZtCOwPU5QbYT8BrVHAUmPDp5AQOTzGP1WYPDfjnI8qmAEhAmo3gKyY4DxBaBHg32qJpAi77UWpDeqLco821Ag7p8i2X+PAkaj7IhzHN4K7I6wKzpgIT2M6onAU4MrEHQcxswHujwqaTXKBOBp0rKtjna2hf38fMsasB8HuStfTcq0TRg1mRvVFmWe7ZdA8kU6vAHYCtUxCHuDjMNFvEfhFrc7+NvhxWJUj0Fkfr5R9FMgPb6lgALRNYgJeFNcgOpFgJslVkFkFDANOKGE+XOA/8pVk2Va6ntv0ARSe0cyD6n2IHIXcHhJG3xYCRwBzO+vQGq6Q8RDBoS7A64twAdAnSRtuuHE86AfBr5dElf6T+AKCrorhRJ2EgYLiWBVRyHcQUgYwSYBItsjcjfwzv5yUesQDZHOAh4svqoAE0COrY3ebCfqF1CdQjiWdCbwS9zaohzNx9WaR7XMXNkHIfIIyFHh97gfZF6wTNXRwCzg/f1hKzBCc6iA/tp/S0A4ErHOpa26tVVci3IC8Hyg7PcADwD7l7PQLoGUzrxjQX4O/HP4ffkpcATYY3ER5xC2RuQ24KBWOcyorBJCr8UtiOqggJyEsnsyOpyOrBYIwB3AgbitXB92RLgX+EjzHPdDQLb0tbOB2yjfdrgUmIhb8C4F3ocbTH4oI4GfUNvabgpNqCxAeQrh1/4iJILomDwztl7NPIrqwcCvAnxsATIT4YLm2NYGMkkYt741Tg4G5EqMXIYEtUUF4Uzg3Lrrq3E29Dcl5Y/CDciJpVxkUNwPCT7JAYRHxCo0Hke6OEpeQEzegxIZBlwOMjXYo8IslNNwO4YO2WyStKw04Fe9l/XEMh6YoTawJHNddTtEfgS8u6TV61A92UW/q5VTaxSgtgeR68GcWD5K9ASQW5v3shpBmQf8X+DudmCOc8Wl5B2arwGfAL0oOHKVicBsSnW5/8UWMBaR2ZQL44/AobjodRl6cZHvaaXTUWQGwvGNGGteILAR5apgnSIno4Yc2SCDF2D1JNz+ig9vBX4DHNkCf83iAyC/RmTP8CN6O8pBKI/673vbNRX4VrhIGQZyK8jpZcxlbIg2Q79EWRNg6J2I7l/1tqpeVxAzUX0fLtHOhx2Au3HucRuggCRRAt0u6Eqrfge3qPWkJaWqKqFiN5wHfM7fP0kfGjMNkVCEPCOQqClagjAzUNZIhA977xRiVVXcBxwAzA0xiFtAXhMsoWnIZSDTg+UIr4CeAXwepPlEPknVc1XAl6D6qeDzqiDmBwif9anZVlRWinsyvm09jkV0x8IskVKvaDlwBMLPg0+InIbwU1x8qVW8EZiJcHYJE+tRORKYnq8XFxJqGtXyv4/qyeScnPrn5BKQL9fz1Kzbm125zybobckYlIO96q7c6G5AdSKq3w1OBOUonF3Zp6ygOuyMcxDK1ji/Q/UA0PtrnlMLNfjg4mg3g34At24JPCcXIXIxmV3QfggEkjB7qJJTQYd7XwxOLMAZ+LNBP03Y2O8C/I5mFpHCOxEeRHMJeHXQW3ELvEW1WGVO/bSCUbgY1mTgYuA2kK9TmoakgHwK0VOrbIe3cEuxGUQLCcWhNH47LofXD4mSNmfWF/nF3lGI3ELZylm5COECb8a7MhmR74FuUdKGb4Ce79Yk5MdXNepMnXlAQEbhcg12RnQ8ylhc9sy45Hp3SZ0hzOG1jYdDLmGgJZv5MugMMF8sjiYBok+jdnLwbbVgTNlA/BluDXAjbt+8COEruBlzBi71NMUFCBeWFN4LdgoqMxpkORpc9ssOuDXRnsBewK64ZMBh7QmxCaAvVP/lyctqFuOTLEEfVqP6dlx4IcCH5Ffg9eEQd30H4GbKF3DzcEG8F4HrcSojAJ2Pyr8jmixwqzajG2EcTsC74LL2x1JNDm8ptbZ5iIDyGKqT6d04F3IC8ee+NSjxFsR8yDsalS+hcnH569lYk1cggA4DfggSygMD5zavx20OhTAd5NxkNO4N7IubfW+jpm7eyIDd62aRqMS4ciTW3kPc664WUklbKlOOR+RW7z3lflTeU/5+UwJJL1wEfLl1JgGXvnMlyNagE3GjfjA73uIGyGa4beIijIFKfB624lb3bREIdCPyK8TzCYMIWHsMLgRdjtSzKRcIwCnAVbSeehpemg4UjvUXcLkFK4GniHUWwkZEZgFFx8IYgOupVE7FJk5YIpCBZgH2Affi+8jHdcExoI0F4nFnArgedBnI7RBKOQpW0A5swCXJLQGWoSwBXYTIapT1IM8DMWg3IrfjE4YYsPogce9ZaJGtAdoQAHZCzO9wyWn16EXjfUFDm1N5RlMXFEIzJLmk+yDmJtC9+8t0CV7BOQhrER5Hk29RkCfALgV5Dhe11lpIX9I4VeIycxciRxXjZQIiK4krB2P7FucCJYUZ0p8gCoCyFHgI+LfiTekBeV9TAmlNq/wZ5xbfiduN7A/SD1PX4j7tfhyXy7s82ZBbQaMpm2aqKFRVjzGXg3qEAQh92MoU0MWhDs/YkIF4dmYCRh/En62+EOK34UZeAySqS6mbISF1JtNdBLek34RelBW4bddFqD6GyFJcys4q3CaUzX9ejUeLCoX0fRe1SP6OwUTnYKJLvREJV/5UbGUaKjUBpijMEI8+ax46D3gIkQM9I2N31ByJ28psVE5t1OVmi5e3kcDeRWEowExEHkB1KSpP4j65e57gd/P9gK3WlbBoJiLmUu/MMBHEfd+j0jetKvhA+D+jsgb06fhrqEwj9MGoyMexzQgks02b62gv8yMSN7a+jA2gnyO8zzJApN5gzra9nSi6xq+mDCh3Ye1n3MxJ95T9EyB7tMZAOX0Ap5OLxl2YAOwL8qfyIiQJQPbR2J7IZkj0Fs+N1SCD8817NXKd/C0GIhkFMgP3JVgdiwIaL8DaKSBxrU3httUsi9WB0lJUb/BWpmyJ4cTSVCMhs1CMyO/P+0jG4D3kQNeBvuI6L9ju1qDqbERxBnQh5haUPbweFbLeJWHL2mb9lX6G30Nk70R40V+VHAmVN7mcgL4Sit3Ia0yhD0hXkzoQBdXXD9gYT1pTGoe7DNXDvXW4hfEZoH9OXmiquuYS5Zol+D3WBjavdB+Qw2oZKeUFNYGiinAIJPS1goSH2LeVkYy+KDoLY87yO38GbPxV4t7bia0TqlVn3EMDLEGDZOt+EPI/wUaKmQTS3VgYTU1H/6cCyrrAppqfLU8BaAXiSs1mZN81Bkz0QUx0mXcnVATU3oTqhS0MrlrxuYLaQjoT9y14saFwlFtdl3V06u01tCOB/XVd7srwkDY6QyAGW0meq+cr7adod0x0NarFsJNz2X+Lxmf0V1VmlottMSIAFuRqf3UCYj5abhvStWUFt/sZIt3aW4Vb7DWJzAi2cWIv6q7nHx8F3Iy1Hu9OAFmO2lMYgJfX34BJA9gf4824UEA+BLpFE4ItQw9uI6keGxHzPBIRpozrqTYzKwof0Rch0Q9xSXyee/Ri49NQXVLz8FozwNB6olyTZJej9rpAA3dA5QxsXZZja7QjfqP+HKovNMdjDLavGMIICsNciphj/Ys/gbhyDtbOqc0yWrS9gyoQQJkVHunmaDdCS6h8QG0NDPMUvBphXeMBKWR6LSQAR6YLTPcUjDknGKOy8eVYe0X9aO8PMka9bJr3h8wcQonKRt+NsYcHjW/2yBE/tsG/SbUG5KWm1EOaWdIIwsEY893gzBC5F/jsAOVQhcn/2Xbyx68UwSW+9Rej8UeWn208e8V9D1meI5ZAxiNyM2qLoXC3dlhEpfdkrI2rrnV/KUF2h6T9pPENuCP7PG2VUzG6G0bxUnmi9jaB60vKXnJIhVE2pBVgS0x0A4jHvRaAl6j0TSKO19c6dEDeKTAobm+OXsZ92OmBbAFyaGmfhHkPrNJlXcOQi8b4D0VNBJR+SGOiaxH2C2w0QaVvKqpzs6vsdiBTWisuWgukehVoIL9VzkB1s3AucFAiO/nL02cbj0LfdUt1DWQi6Or5BiJhj0r1fNBARGJgGCQvK0fzUbm3WLWCyL4g+3sFKUFPy+CfIS/hzl4MQKhFbEst8FSQ84LCgOtAv9EuI16P9gYXg06NXuGtXRHETPXPrCBTW+I/W/hFSgWi1EIiIcjhIN8r2YJ9gLhvKja5b6R9lGCQVur10D8C84qbYOrcSmRsC4WlGYb1eBllg19bZT2rlIc6FSaMI+q6Dm+ytIDqcuLKFKC3XKgDQ5v3Q4L0HKozA+3YhmA+rrewt+A/YmkD6PNh25H9U2v2QrpAukciZgbY7b1sCK+i9qOgfo+xjRiEaG+A4CegRZWigJH3I7K5J5TvozfhP5hsWbiZSbwqVYU2bXpiyKOeq0He4d31EwNqT0f1tw1sT1swFEY9pUXAz71796r7oXpYYVs4Df7lyPpmB8Ba/2Awbm/DNz2dN/dN0I947xsDNv4Wfb0zqtFgaweHCgIZCqjeQPY4vDxOKH7B69VxO/tfl7V+56Bw1EcNUTQZY74Q9KhsfBtqzxuCiVHFUAvkftz3HEWIfARhn7xQBJcYk6XIs0oXwK4sxsS0tvOXZwTQQxAz3cm87r5ba8x1Rryhm9xWDJ0NSUl1up8VAeTDRXtc7y6pJ5ShFmSNx9+u9aUYiLpc9LZr+PYYcw1qe/yzUFahnITIX4dSGJCbISWR1/bSz/Du6im4j3J6an2aVV0K6Fagvu8aK2DX5uoRdYY81c+pkyAynCi6EczOXlWFKDb+OOiTDfpuUDD4oZMiPQPy/QA/OyHmJDSiRokn5GgkIr6t22dRluajIYljkHMiFITpaHyod2aIAfQz2MrdbqMpcUiaS0saGBUEMhSVVivXX4D4P31WcypWqJIqaCWlzXE/i1GPpxB5Iaca43RbNi1XwXRdgJhJfi0loPYHqL18qNVUFkPp9mbpj6C3eTkS3R+jh7hT6jLG2fXim/GvQdY7Adfbj6qaAuREkAuDHpXIbFTP3oSyAIbay8rj7sD1Hkg2r4SkM9MNr9CZwLoqkTSgbr1QNeIRdA+bQFfXVd40IOdoLKTSNxlr+4jtUA/OnBe4KYw6SY7UDOCRonoQEI5HdDRWa53mKLQxlc90z2cc7gpyE974l4DIRuLKFCq9a7B9NVU31FQUSL2/OSR0BwWFroCMATmsyBfbevV7mq2IUBWiw3BEZqC6q19VAXF8GvBgVdX5IglDiIwNMUNPVm/A/chKESKnE8mIfEyL7YsCBJDVVONUGZVjov/GmP297zgjfjGqP97UdiOLodkPCdMKVP+3yJYCsj/uo/4UPbijLjywy0hTRUWd7Yi6zgeZHFhrAGYG8CW/gDcdMh/sDMWP2figV+MNvyvAJ9H4wSTPtwdRn0CeQcyLoFTPjo+6JwFf9280GVD7MJXXplarESX5dnyTowO4kLnA7IDuPghNM0x0S/wHmK0HNrpRr4C8B2VayRbsMqydhI1fJt27T+3PJiWHmkCq4eUhp15U7wyolh2Q7uSHAOLt8P+SzhrQF9EKiNkW0zUddIRXFSkV4srpoE+0O1ukXdjUNiQZHHoX7oSEIkSPTjJCtsCXHCfyDGJehQhM148QxoaNuE5FdbbXU+sQdMowWQF6T6Cj3oX7bCz23ld93NmO6DJIjheshwgo38Qdmd7R6BSBgOqNSO0grzrsiVaVfQYCqo+g9mhEz/YLw4DqHcS9X3TbuLYm206iBNmf7y7rrqHAXBfjkkM89z6KO82tj1xWiK4HDkCi48JG3M5D448NBsODgQa/sDPUkA9holv8Bt6LivNZ6S4MKBdqWUfcdwiwILtv3ZGoFI5n6ghD90uUp2nmR14cfL+NRdKWmDiehLKgM5rWHDpNIBvAXovIhQPSoGLAVs6j77XQ+qZjsamDi0VSfoIGNq+agbMb30ftJZ0xxlpD5nimTrAhCSS6EZFJLTsabq1xL9ZOBO0lbubMlA6BdWOwc9zeHGzgm5ISOCO+ENVTQHpfN4KoQ+Zk634f8TcI0BEQ/R5kr+ZmiYDwArZyGDb9pQWl6S9sOwHJDOmkdUgWr6A6G5G9Gj4pyX/iyplU+ubmfs3gdWbQYeiy31sn7FWgf23cBAFb+QqqN7kQumf5+zrCpsjLapaeBB4u5V4ErN6CtV/rfxd0Fkz+zw4jJZB2Ck5o5mGQU16vs8GHgR6kPNh4CGQ1aN2xgQLCCuLXTkbkFZe/9fpVU1l03sIwT6tQnZHj2BnqXuLKx8Aurm3Tagdo2QFQQSC+343qCLL3JQzW/mfjz6D2F38LM6IeAz2Mf2hgzByE9yZnC1+Kjc91m1Id5aoPDH1tPUh5kGH1O0TyDtAfU/xN2r8p/D/fSXmV5PvMHAAAAABJRU5ErkJggg==\"/>\n </defs>\n </svg>\n\n )\n}","import {IconSizeProps} from \"./types\";\n\nexport default function TRXLightIcon({size= 40, ...props}: IconSizeProps) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\">\n <mask id=\"mask0_1215_64378\" style={{\n maskType: \"alpha\"\n }} maskUnits=\"userSpaceOnUse\" x=\"6\" y=\"6\" width=\"28\"\n height=\"28\">\n <rect x=\"6.66675\" y=\"6.6665\" width=\"26.6667\" height=\"26.6667\" fill=\"url(#pattern0_1215_64378)\"/>\n </mask>\n <g mask=\"url(#mask0_1215_64378)\">\n <rect x=\"6.66675\" y=\"6.6665\" width=\"26.6667\" height=\"26.6667\" fill=\"white\"/>\n </g>\n <defs>\n <pattern id=\"pattern0_1215_64378\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\n <use xlinkHref=\"#image0_1215_64378\" transform=\"scale(0.01)\"/>\n </pattern>\n <image id=\"image0_1215_64378\" width=\"100\" height=\"100\"\n xlinkHref=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGk2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OTc3NywgMjAyMy8wNi8yNS0yMzo1NzoxNCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjMgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDI1LTAxLTE0VDExOjA4OjEyKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNS0wMS0xNFQxMToxMToyMSswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNS0wMS0xNFQxMToxMToyMSswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDBiNDhmNDgtN2IwNi00N2E2LWI0ZGItYzk3NTdmN2U0OWY0IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOmRjOGI3N2Y3LWRlYzYtNGJkYS04ZjExLTUwYjdkZjdjOWY4YiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmRjOGI3N2Y3LWRlYzYtNGJkYS04ZjExLTUwYjdkZjdjOWY4YiI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZGM4Yjc3ZjctZGVjNi00YmRhLThmMTEtNTBiN2RmN2M5ZjhiIiBzdEV2dDp3aGVuPSIyMDI1LTAxLTE0VDExOjA4OjEyKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMyAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NThjMzllN2EtNDZkYi00N2UzLTgyMjYtMTZkNTZkNTc1NmViIiBzdEV2dDp3aGVuPSIyMDI1LTAxLTE0VDExOjEwOjExKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MDBiNDhmNDgtN2IwNi00N2E2LWI0ZGItYzk3NTdmN2U0OWY0IiBzdEV2dDp3aGVuPSIyMDI1LTAxLTE0VDExOjExOjIxKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5guAj8AAAWbElEQVR4nO2de5xdRZHHv9VnZpJgwICILBDCAiEQXqviBgVBEBQE84EFUcBsQCJE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\"/>\n </defs>\n</svg>\n\n}","import {IconProps} from \"./types\";\n\nexport default function ArrowDownIcon({width=20,height=21,color=\"black\",...props}:IconProps) {\n return <svg width={width} height={height} viewBox=\"0 0 20 21\" fill=\"none\" {...props} xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5 7.5L9.29289 11.7929C9.68342 12.1834 10.3166 12.1834 10.7071 11.7929L15 7.5\" stroke={color}\n strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function LeatherIcon({\n size=128,\n ...props\n }:IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"128\" height=\"128\" rx=\"26.8387\" fill=\"#12100F\"/>\n <path\n d=\"M74.9171 52.7114C82.4766 51.5408 93.4087 43.5804 93.4087 37.3761C93.4087 35.5031 91.8968 34.2154 89.6871 34.2154C85.5004 34.2154 78.4061 40.5368 74.9171 52.7114ZM39.911 83.4991C30.0256 83.4991 29.2115 93.3324 39.0969 93.3324C43.5163 93.3324 48.8661 91.5764 51.6573 88.4157C47.5868 84.9038 44.2141 83.4991 39.911 83.4991ZM102.829 79.2848C103.41 95.7907 95.0369 105.039 80.8484 105.039C72.4748 105.039 68.2881 101.878 59.333 96.0249C54.681 101.176 45.8423 105.039 38.5154 105.039C13.2785 105.039 14.3252 72.8463 40.0273 72.8463C45.3771 72.8463 49.9128 74.2511 55.7277 77.88L59.5656 64.4177C43.7489 60.0864 35.8405 47.9118 43.6326 30.4693H56.1929C49.215 42.0586 53.9832 51.6578 62.822 52.7114C67.5903 35.7372 77.8246 22.509 91.4316 22.509C99.1074 22.509 105.155 27.5428 105.155 36.6737C105.155 51.3066 86.0819 63.2471 71.6607 64.4177L65.7295 85.3721C72.4748 93.2153 91.199 100.824 91.199 79.2848H102.829Z\"\n fill=\"#F5F1ED\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function UnisatIcon({\n size=64,\n ...props\n }:IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 51 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n preserveAspectRatio=\"xMidYMid meet\">\n <g clipPath=\"url(#clip0_13_4)\">\n <path\n d=\"M35.9736 5.75869L49.326 18.7667C50.4626 19.8716 51.022 20.9896 51.0044 22.1162C50.9868 23.2428 50.4978 24.2697 49.5419 25.2013C48.5419 26.1763 47.4626 26.6703 46.3084 26.6919C45.1542 26.7093 44.0088 26.1633 42.8722 25.0584L29.2159 11.7557C27.6652 10.2435 26.1674 9.17318 24.7269 8.54488C23.2863 7.91658 21.7709 7.81692 20.185 8.25023C18.5947 8.67921 16.8899 9.78415 15.0617 11.5607C12.5419 14.0176 11.3392 16.3228 11.4626 18.4764C11.5859 20.6299 12.837 22.8658 15.2115 25.1754L28.978 38.5907C30.1278 39.7086 30.6916 40.8265 30.674 41.9358C30.6564 43.0494 30.163 44.0764 29.1894 45.0253C28.2203 45.9699 27.1498 46.4639 25.9868 46.5029C24.8238 46.5419 23.6652 46.0003 22.5198 44.8823L9.1674 31.8743C6.9956 29.7598 5.42731 27.7579 4.46256 25.8686C3.4978 23.9794 3.13657 21.8432 3.38767 19.46C3.61234 17.4191 4.27753 15.4432 5.38767 13.528C6.49339 11.6127 8.0793 9.65416 10.1366 7.64793C12.5859 5.26039 14.9251 3.43182 17.1542 2.15788C19.3789 0.883949 21.533 0.177652 23.6123 0.0303266C25.696 -0.116999 27.7489 0.290313 29.7797 1.25226C31.8106 2.21421 33.8723 3.71347 35.9692 5.75869H35.9736Z\"\n fill=\"url(#paint0_linear_13_4)\"/>\n <path\n d=\"M15.0264 58.2456L1.67842 45.2376C0.541857 44.1283 -0.0176143 43.0147 6.80917e-06 41.8881C0.017628 40.7615 0.506615 39.7346 1.46256 38.8029C2.46256 37.828 3.54186 37.334 4.69604 37.3123C5.85023 37.295 6.9956 37.8366 8.13217 38.9459L21.7841 52.2486C23.3392 53.7608 24.8326 54.8311 26.2731 55.4594C27.7137 56.0877 29.2291 56.183 30.8194 55.754C32.4097 55.3251 34.1145 54.2201 35.9427 52.4392C38.4626 49.9823 39.6652 47.6771 39.5419 45.5236C39.4185 43.37 38.1674 41.1341 35.793 38.8203L28.4582 31.7356C27.3084 30.6177 26.7445 29.4997 26.7621 28.3905C26.7797 27.2769 27.2731 26.2499 28.2467 25.301C29.2159 24.3563 30.2864 23.8624 31.4493 23.8234C32.6123 23.7844 33.7709 24.326 34.9163 25.444L41.8326 32.1213C44.0044 34.2358 45.5727 36.2377 46.5375 38.127C47.5022 40.0162 47.8634 42.1524 47.6123 44.5356C47.3877 46.5765 46.7225 48.5524 45.6123 50.4677C44.5066 52.3829 42.9207 54.3415 40.8634 56.3477C38.4141 58.7352 36.0749 60.5638 33.8458 61.8377C31.6167 63.1117 29.4626 63.8223 27.3789 63.9696C25.2952 64.117 23.2423 63.7096 21.2115 62.7477C19.1806 61.7857 17.1189 60.2865 15.022 58.2413L15.0264 58.2456Z\"\n fill=\"url(#paint1_linear_13_4)\"/>\n <path\n d=\"M23.3524 24.6814C26.0603 24.6814 28.2555 22.5222 28.2555 19.8586C28.2555 17.1951 26.0603 15.0359 23.3524 15.0359C20.6445 15.0359 18.4493 17.1951 18.4493 19.8586C18.4493 22.5222 20.6445 24.6814 23.3524 24.6814Z\"\n fill=\"url(#paint2_radial_13_4)\"/>\n </g>\n <defs>\n <linearGradient id=\"paint0_linear_13_4\" x1=\"47.1299\" y1=\"13.3372\" x2=\"5.9782\" y2=\"31.9299\"\n gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#201C1B\"/>\n <stop offset=\"0.36\" stopColor=\"#77390D\"/>\n <stop offset=\"0.67\" stopColor=\"#EA8101\"/>\n <stop offset=\"1\" stopColor=\"#F4B852\"/>\n </linearGradient>\n <linearGradient id=\"paint1_linear_13_4\" x1=\"5.01376\" y1=\"51.203\" x2=\"52.8347\" y2=\"36.7334\"\n gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#1F1D1C\"/>\n <stop offset=\"0.37\" stopColor=\"#77390D\"/>\n <stop offset=\"0.67\" stopColor=\"#EA8101\"/>\n <stop offset=\"1\" stopColor=\"#F4FB52\"/>\n </linearGradient>\n <radialGradient id=\"paint2_radial_13_4\" cx=\"0\" cy=\"0\" r=\"1\" gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"translate(23.3524 19.863) scale(4.90308 4.82275)\">\n <stop stopColor=\"#F4B852\"/>\n <stop offset=\"0.33\" stopColor=\"#EA8101\"/>\n <stop offset=\"0.64\" stopColor=\"#77390D\"/>\n <stop offset=\"1\" stopColor=\"#211C1D\"/>\n </radialGradient>\n <clipPath id=\"clip0_13_4\">\n <rect width=\"51\" height=\"64\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function XverseIcon({\n size=57,\n ...props\n}:IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <clipPath id=\"clip0_10280_371492\">\n <rect id=\"svg_1\" fill=\"white\" height=\"57\" width=\"57\"/>\n </clipPath>\n </defs>\n <g>\n <title>background</title>\n <rect fill=\"none\" id=\"canvas_background\" height=\"66\" width=\"66\" y=\"-1\" x=\"-1\"/>\n </g>\n <g>\n <title>Layer 1</title>\n <rect id=\"svg_5\" height=\"64\" width=\"64\" rx=\"8\" strokeWidth=\"0\" stroke=\"#000\" fill=\"#000000\"/>\n <g stroke=\"null\" id=\"svg_2\" clipPath=\"url(#clip0_10280_371492)\">\n <path stroke=\"null\" id=\"svg_3\" fill=\"white\"\n d=\"m55.71197,55.048143l0,-8.673641c0,-0.343903 -0.136738,-0.671922 -0.380462,-0.915647l-36.905562,-36.905697c-0.243724,-0.243716 -0.571743,-0.380378 -0.915647,-0.380378l-8.673498,0c-0.428207,0 -0.776699,0.348492 -0.776699,0.776699l0,8.058523c0,0.343987 0.136662,0.671922 0.380378,0.915647l13.247168,13.247168c0.30289,0.302974 0.30289,0.794877 0,1.097852l-13.399773,13.39979c-0.145772,0.14573 -0.227773,0.343903 -0.227773,0.548884l0,8.830801c0,0.427946 0.348492,0.776724 0.776699,0.776724l14.493044,0c0.428198,0 0.776724,-0.348778 0.776724,-0.776724l0,-5.20242c0,-0.20498 0.081942,-0.403153 0.227756,-0.548884l7.188436,-7.18852c0.302974,-0.30289 0.794961,-0.30289 1.097852,0l13.33827,13.338438c0.243724,0.243724 0.571743,0.380462 0.915647,0.380462l8.058447,0c0.428282,0 0.77664,-0.348862 0.77664,-0.776724l0.002353,-0.002353z\"/>\n <path stroke=\"null\" id=\"svg_4\" fill=\"#EE7A30\"\n d=\"m36.37884,19.659638l7.259032,0c0.430467,0 0.781262,0.350795 0.781262,0.781262l0,7.259032c0,0.697051 0.842782,1.045493 1.334768,0.551237l9.958152,-9.974036c0.145562,-0.145814 0.22784,-0.343987 0.22784,-0.551237l0,-8.735034c0,-0.430484 -0.348778,-0.781245 -0.781346,-0.781245l-8.864838,-0.011388c-0.20725,0 -0.405423,0.081992 -0.553506,0.227764l-9.914869,9.89896c-0.491987,0.491903 -0.143461,1.334684 0.551237,1.334684l0.002269,0z\"/>\n </g>\n </g>\n </svg>\n}","import {IconSizeProps} from \"./types\";\n\nexport default function TronLinkIcon({\n size = 64,\n ...props\n }: IconSizeProps) {\n return <img width={size} height={size} {...props}\n src={\"data:image/png;base64,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\"}/>\n}","import {IconSizeProps} from \"./types\";\n\nexport default function OKXIcon({\n size,\n ...props\n }:IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"32\" height=\"32\" rx=\"8\" fill=\"black\"/>\n 、\n <path\n d=\"M19.2942 22.407C19.2942 23.2925 19.2911 24.1781 19.2955 25.0636C19.2976 25.4945 19.4269 25.6328 19.8455 25.6339C21.5935 25.6383 23.3416 25.6384 25.0896 25.6339C25.5146 25.6328 25.6832 25.4672 25.6842 25.0515C25.6885 23.315 25.6886 21.5785 25.6843 19.842C25.6833 19.3997 25.5196 19.2446 25.0741 19.2441C23.3376 19.242 21.601 19.242 19.8645 19.244C19.4101 19.2445 19.2976 19.3566 19.2952 19.8194C19.2905 20.6819 19.2938 21.5445 19.2942 22.407ZM12.6556 22.424C12.6556 21.5501 12.6583 20.6762 12.6546 19.8024C12.6525 19.3268 12.5669 19.2443 12.0829 19.2438C10.3697 19.2421 8.65638 19.2421 6.94314 19.2439C6.42514 19.2445 6.31525 19.3521 6.3145 19.8724C6.31179 21.5857 6.31204 23.299 6.31462 25.0122C6.31538 25.5045 6.43653 25.6328 6.92244 25.6341C8.6472 25.6385 10.372 25.6383 12.0967 25.6339C12.5353 25.6328 12.6526 25.5118 12.6545 25.08C12.6585 24.1948 12.6557 23.3094 12.6556 22.424ZM15.9764 19.0941C16.8734 19.0941 17.7704 19.0978 18.6673 19.0924C19.0566 19.0901 19.1441 19.0064 19.1449 18.6285C19.1486 16.8346 19.1488 15.0406 19.1441 13.2466C19.1432 12.8835 19.0237 12.7611 18.6696 12.7602C16.8872 12.7558 15.1047 12.7556 13.3222 12.7604C12.926 12.7614 12.8077 12.8857 12.8071 13.2813C12.8041 15.0523 12.8044 16.8232 12.807 18.5942C12.8076 19.0143 12.8873 19.0914 13.32 19.0933C14.2054 19.0973 15.0909 19.0945 15.9764 19.0941ZM22.4747 12.6043C23.3598 12.6043 24.2449 12.6072 25.1299 12.603C25.5607 12.601 25.6838 12.4801 25.6847 12.0453C25.6885 10.3212 25.6883 8.59705 25.6849 6.87292C25.684 6.43534 25.5643 6.31476 25.1319 6.31394C23.3503 6.31073 21.5687 6.31073 19.7871 6.31419C19.3808 6.31501 19.2959 6.39972 19.2952 6.79884C19.2922 8.55746 19.2921 10.3161 19.2952 12.0747C19.2961 12.5188 19.3803 12.6017 19.8197 12.6035C20.7046 12.6072 21.5897 12.6046 22.4747 12.6043ZM9.50353 12.6045C10.3886 12.6045 11.2738 12.6076 12.1589 12.6032C12.5708 12.6011 12.6533 12.5235 12.6541 12.1217C12.6578 10.3514 12.6576 8.58119 12.6544 6.81093C12.6536 6.3916 12.5726 6.31438 12.1395 6.31369C10.3808 6.31092 8.62202 6.3106 6.86322 6.31394C6.42621 6.31476 6.31519 6.42923 6.3145 6.87254C6.31173 8.60831 6.31198 10.3441 6.31437 12.0799C6.31494 12.5096 6.40588 12.6004 6.84811 12.603C7.73327 12.6081 8.61844 12.6045 9.50353 12.6045Z\"\n fill=\"white\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function BitgetIcon({\n size=40,\n ...props\n }:IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\">\n <rect width=\"40\" height=\"40\" rx=\"8\" fill=\"#00F0FF\"/>\n <rect x=\"4\" y=\"4\" width=\"32\" height=\"32\" fill=\"url(#pattern0_401_564)\"/>\n <defs>\n <pattern id=\"pattern0_401_564\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\n <use xlinkHref=\"#image0_401_564\" transform=\"scale(0.0005)\"/>\n </pattern>\n <image id=\"image0_401_564\" width=\"2000\" height=\"2000\"\n xlinkHref=\"data:image/png;base64,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\"/>\n </defs>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function TonLightIcon({size = 40, ...props}: IconSizeProps) {\n return (\n <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\">\n <path stroke=\"null\" id=\"svg_2\" fill=\"black\"\n d=\"m28.551235,7.336842l-17.103441,0c-3.144714,0 -5.137911,3.392209 -3.555804,6.134509l10.555606,18.295835c0.688817,1.19463 2.41502,1.19463 3.103838,0l10.557753,-18.295835c1.57996,-2.737917 -0.413237,-6.134509 -3.555804,-6.134509l-0.002147,0zm-10.112226,18.943687l-2.298831,-4.449093l-5.546854,-9.920635c-0.36592,-0.634971 0.086046,-1.448654 0.852323,-1.448654l6.991215,0l0,15.820529l0.002147,-0.002147zm10.962403,-14.371875l-5.544707,9.924928l-2.298831,4.446947l0,-15.820529l6.991215,0c0.766277,0 1.218244,0.813683 0.852323,1.448654z\"/>\n </svg>\n\n )\n}","import {IconSizeProps} from \"./types\";\n\nexport default function TonLightIcon({size = 40, ...props}: IconSizeProps) {\n return (\n <svg width={size} height={size} {...props} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\">\n <path stroke=\"null\" id=\"svg_2\" fill=\"white\"\n d=\"m28.551235,7.336842l-17.103441,0c-3.144714,0 -5.137911,3.392209 -3.555804,6.134509l10.555606,18.295835c0.688817,1.19463 2.41502,1.19463 3.103838,0l10.557753,-18.295835c1.57996,-2.737917 -0.413237,-6.134509 -3.555804,-6.134509l-0.002147,0zm-10.112226,18.943687l-2.298831,-4.449093l-5.546854,-9.920635c-0.36592,-0.634971 0.086046,-1.448654 0.852323,-1.448654l6.991215,0l0,15.820529l0.002147,-0.002147zm10.962403,-14.371875l-5.544707,9.924928l-2.298831,4.446947l0,-15.820529l6.991215,0c0.766277,0 1.218244,0.813683 0.852323,1.448654z\"/>\n </svg>\n\n )\n}","import {IconProps} from \"../../types\";\nimport {IconSizeColorProps} from \"./types\";\n\nexport default function ErrorRoundIcon({\n size,\n color=\"#F14141\",\n ...props\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12Z\"\n fill={color}/>\n <path\n d=\"M8.96967 8.96967C9.26256 8.67678 9.73744 8.67678 10.0303 8.96967L12 10.9394L13.9697 8.96969C14.2626 8.6768 14.7374 8.6768 15.0303 8.96969C15.3232 9.26258 15.3232 9.73746 15.0303 10.0304L13.0607 12L15.0303 13.9696C15.3232 14.2625 15.3232 14.7374 15.0303 15.0303C14.7374 15.3232 14.2625 15.3232 13.9696 15.0303L12 13.0607L10.0304 15.0303C9.73746 15.3232 9.26258 15.3232 8.96969 15.0303C8.6768 14.7374 8.6768 14.2626 8.96969 13.9697L10.9394 12L8.96967 10.0303C8.67678 9.73744 8.67678 9.26256 8.96967 8.96967Z\"\n fill=\"white\"/>\n </svg>\n\n}","import {IconProps} from \"../../types/types\";\n\nexport default function InfoLineIcon({\n size,\n color='#6E6E6E',\n ...props\n }:Omit<IconProps, 'width'|'height'>) {\n return <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <g clipPath=\"url(#clip0_418_7746)\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M7.99984 0.666504C3.94975 0.666504 0.666504 3.94975 0.666504 7.99984C0.666504 12.0499 3.94975 15.3332 7.99984 15.3332C12.0499 15.3332 15.3332 12.0499 15.3332 7.99984C15.3332 3.94975 12.0499 0.666504 7.99984 0.666504ZM1.99984 7.99984C1.99984 4.68613 4.68613 1.99984 7.99984 1.99984C11.3135 1.99984 13.9998 4.68613 13.9998 7.99984C13.9998 11.3135 11.3135 13.9998 7.99984 13.9998C4.68613 13.9998 1.99984 11.3135 1.99984 7.99984ZM8.6665 7.33317C8.6665 6.96498 8.36803 6.6665 7.99984 6.6665C7.63165 6.6665 7.33317 6.96498 7.33317 7.33317V11.3332C7.33317 11.7014 7.63165 11.9998 7.99984 11.9998C8.36803 11.9998 8.6665 11.7014 8.6665 11.3332V7.33317ZM7.99984 5.33317C8.36803 5.33317 8.6665 5.03469 8.6665 4.6665C8.6665 4.29831 8.36803 3.99984 7.99984 3.99984C7.63165 3.99984 7.33317 4.29831 7.33317 4.6665C7.33317 5.03469 7.63165 5.33317 7.99984 5.33317Z\"\n fill={color}/>\n </g>\n <defs>\n <clipPath id=\"clip0_418_7746\">\n <rect width=\"16\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function InfoRoundIcon({\n size = 16,\n color = '#F14141',\n ...props\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"8\" fill={color}/>\n <path d=\"M8 4V8.8\" stroke=\"white\" strokeWidth=\"1.2\" strokeLinecap=\"round\"/>\n <circle cx=\"8.0002\" cy=\"11.2004\" r=\"0.8\" fill=\"white\"/>\n </svg>\n\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function TransferIcon({size=40,...props}:IconSizeProps) {\n return <svg width={size} height={size} viewBox=\"0 0 40 40\" {...props} fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"2\" width=\"36\" height=\"36\" rx=\"18\" fill=\"white\"/>\n <rect x=\"2\" y=\"2\" width=\"36\" height=\"36\" rx=\"18\" stroke=\"#F8F8F8\" strokeWidth=\"4\"/>\n <path d=\"M18.666 12.8913L18.666 26.2246L14.666 21.6413\" stroke=\"black\" strokeWidth=\"1.4\" strokeLinecap=\"round\"\n strokeLinejoin=\"round\"/>\n <path d=\"M22.2217 12.8913L22.2217 26.2246L26.2217 21.6413\" stroke=\"black\" strokeWidth=\"1.4\"\n strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function ArrowSendIcon({\n size=34,\n color=\"#6E6E6E\",\n ...props\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 34 34\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path d=\"M22.6567 11.313L11.343 22.6267M22.6567 11.313L22.6567 19.7982M22.6567 11.313L14.1714 11.313\"\n stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n\n}","import {IconSizeProps} from \"./types\";\n\nexport default function PhantomIcon({\n size=128,\n ...props\n }:IconSizeProps) {\n return <svg width={size} height={size} {...props} viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#ab9ff2\"\n d=\"m53.520552,86.603299c-5.9423,9.106 -15.8999,20.63 -29.1497,20.63c-6.2636,0 -12.2864,-2.578 -12.2866,-13.779c-0.0005,-28.5271 38.946,-72.687 75.0825,-72.6876c20.557,-0.0004 28.749,14.2625 28.749,30.4597c0,20.7903 -13.491,44.5629 -26.901,44.5629c-4.256,0 -6.344,-2.337 -6.344,-6.043c0,-0.967 0.16,-2.015 0.482,-3.143c-4.578,7.816 -13.411,15.07 -21.6822,15.07c-6.0227,0 -9.074,-3.788 -9.0741,-9.107c0,-1.934 0.4015,-3.948 1.1241,-5.963zm26.8222,-43.9027c-3.271,0.0058 -5.501,2.7849 -5.494,6.7495c0.007,3.9646 2.247,6.8152 5.518,6.8095c3.192,-0.0057 5.421,-2.8641 5.414,-6.8288c-0.007,-3.9646 -2.246,-6.7358 -5.438,-6.7302zm17.351,-0.0189c-3.271,0.0058 -5.501,2.7849 -5.494,6.7495c0.007,3.9646 2.246,6.8152 5.518,6.8095c3.192,-0.0056 5.421,-2.8641 5.414,-6.8288c-0.007,-3.9646 -2.246,-6.7358 -5.438,-6.7302z\"\n clipRule=\"evenodd\" fillRule=\"evenodd\"/>\n\n </svg>\n}","import {IconHWColorProps} from \"./types\";\n\nexport default function MoreIcon({\n width=\"11\",\n height=\"3\",\n color=\"black\",\n ...props\n }:IconHWColorProps) {\n return <svg xmlns=\"http://www.w3.org/2000/svg\" width={width} height={height} viewBox=\"0 0 11 3\" fill=\"none\" {...props}>\n <path\n d=\"M2.3335 1.33325C2.3335 1.88554 1.88578 2.33325 1.3335 2.33325C0.781211 2.33325 0.333496 1.88554 0.333496 1.33325C0.333496 0.780967 0.781211 0.333252 1.3335 0.333252C1.88578 0.333252 2.3335 0.780967 2.3335 1.33325Z\"\n fill={color}/>\n <path\n d=\"M6.3335 1.33325C6.3335 1.88554 5.88578 2.33325 5.3335 2.33325C4.78121 2.33325 4.3335 1.88554 4.3335 1.33325C4.3335 0.780967 4.78121 0.333252 5.3335 0.333252C5.88578 0.333252 6.3335 0.780967 6.3335 1.33325Z\"\n fill={color}/>\n <path\n d=\"M10.3335 1.33325C10.3335 1.88554 9.88578 2.33325 9.3335 2.33325C8.78121 2.33325 8.3335 1.88554 8.3335 1.33325C8.3335 0.780967 8.78121 0.333252 9.3335 0.333252C9.88578 0.333252 10.3335 0.780967 10.3335 1.33325Z\"\n fill={color}/>\n </svg>\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function CheckboxIcon({\n size=16,\n color=\"#E3E3E3\",\n ...props\n}:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 16 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <rect x=\"2.08203\" y=\"2.58325\" width=\"11.8333\" height=\"11.8333\" rx=\"3.25\" stroke={color} strokeWidth=\"1.5\"/>\n </svg>\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function CheckboxCheckedIcon({\n size=16,\n color=\"#FC802D\",\n ...props\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 16 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <rect x=\"1.33203\" y=\"1.83325\" width=\"13.3333\" height=\"13.3333\" rx=\"4\" fill={color}/>\n <path\n d=\"M5.96094 7.63565L7.23226 8.90697L9.87499 6.26424C10.113 6.02621 10.4989 6.02621 10.737 6.26424C10.975 6.50227 10.975 6.8882 10.737 7.12623L7.80211 10.0611C7.48739 10.3758 6.97714 10.3758 6.66242 10.0611L5.09896 8.49764C4.86093 8.25961 4.86093 7.87368 5.09896 7.63565C5.33699 7.39762 5.72291 7.39762 5.96094 7.63565Z\"\n fill=\"white\"/>\n </svg>\n\n\n}","import {IconSizeColorProps} from \"./types\";\n\nexport default function InputLengthIcon({\n size=12,\n color=\"#B6B6B6\",\n ...props\n }:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M1.10097 12L12 1.10097L10.899 0L0 10.899L1.10097 12ZM7.19277 11.4594L11.6684 6.98378L10.5675 5.88281L6.0918 10.3585L7.19277 11.4594Z\"\n fill={color}/>\n </svg>\n\n}","import {LoadingIcon} from \"assets/icon\";\nimport {ButtonProps} from \"../../types/types\";\n\nexport default function Button({\n size = \"df\",\n disabled = false,\n loading = false,\n children,\n onClick,\n highlight = false,\n block = false,\n type = \"button\",\n rounded = true,\n className = '',\n style = {},\n dataset = {}\n }: ButtonProps & { dataset?: { [key: string]: string } }) {\n\n const onAction = () => {\n if (!disabled && !loading) {\n onClick && onClick()\n }\n }\n return <button\n type={type}\n className={`${className} matchid-btn ${'matchid-btn-' + size} ${highlight ? \"matchid-btn-highlight\" : ''} ${loading ? \"matchid-btn-loading\" : ''} ${block ? \"matchid-btn-block\" : ''} ${rounded ? \"matchid-btn-rounded\" : ''}`}\n disabled={disabled || loading}\n style={{\n ...style\n }}\n onClick={onAction}\n {...dataset}\n >\n {\n loading ?\n <LoadingIcon className=\"matchid-btn-loading-icon\" color=\"var(--matchid-btn-loading-color)\"/> :\n children\n }\n </button>\n}","import React, {PropsWithChildren, useEffect} from \"react\";\n\nexport default function Overlay({\n isOpen = false,\n children,\n zIndex = 100,\n }: {\n isOpen?: boolean\n zIndex?: number\n} & PropsWithChildren) {\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"\";\n }\n\n return () => {\n document.body.style.overflow = \"\";\n };\n }, [isOpen]);\n return isOpen ? <div\n className=\"matchid-overlay\"\n style={{\n zIndex\n }}\n >\n {children}\n </div> : <></>\n}","import React, {PropsWithChildren} from \"react\";\nimport Overlay from \"../Overlay\";\nimport {CloseRoundIcon} from \"assets/icon\";\nimport {DrawerProps} from \"../../types\";\nimport ArrowLeftIcon from \"../../assets/icon/ArrowLeftIcon\";\n\nexport default function Drawer({\n children,\n showClose = true,\n onClose,\n isOpen = false,\n title,\n zIndex = 100,\n onBack\n }: DrawerProps) {\n\n if (!isOpen) {\n return <></>\n }\n\n\n return <Overlay isOpen={isOpen} zIndex={zIndex}>\n <div className={\"matchid-drawer\"}>\n <div className={`matchid-drawer-header matchid-flex`}>\n <div className={`matchid-drawer-header-content matchid-flex`}>\n {onBack && <ArrowLeftIcon height={25} width={24} className=\"matchid-drawer-header-back\" onClick={onBack}/>}\n {title}\n </div>\n {\n showClose && <CloseRoundIcon className={\"matchid-drawer-header-close\"} onClick={onClose}/>\n }\n </div>\n\n {children}\n </div>\n </Overlay>\n}","import {PropsWithChildren, ReactNode} from \"react\";\n\nexport default function Field({\n label,\n children,\n error,\n required,\n className=''\n }:{\n label: ReactNode,\n error?: ReactNode,\n required?: boolean\n className?: string\n\n}&PropsWithChildren){\n return <div className={`matchid-field-box ${className}`}>\n <div className=\"matchid-field-label\">{required&&<span className={\"matchid-field-required\"}>*</span>}{label}</div>\n {children}\n {error && <div className=\"matchid-field-error\">{error}</div>}\n </div>\n\n}","import {\n Hash,\n Chain,\n} from \"viem\";\nimport {useEffect, useState} from \"react\";\nimport ModalDrawer from \"../ModalDrawer\";\nimport Button from \"../Button\";\nimport {Lottie} from \"../../ui\";\nimport {successImg, failImg, confirmImg,pendingImg} from \"assets/lottie\";\nimport useHash from \"../../hooks/useHash\";\n\ntype statusType = 'pending' | 'success' | 'fail' | 'confirm'\ntype HashPanelProps = {\n hash?: Hash | null,\n chain?: Chain | null,\n isOpen: boolean,\n onClose: () => void\n zIndex?: number,\n error?: string\n}\n\nfunction HashPanel({\n hash,\n chain,\n isOpen,\n onClose,\n zIndex,\n error\n }: HashPanelProps) {\n const [status, setStatus] = useState<statusType>('confirm')\n\n const statusMaps: Record<statusType, {\n text: string;\n color: string\n lottie?: any\n }> = {\n 'confirm': {\n text: 'Confirming...',\n color: '#FC802D',\n lottie: confirmImg\n },\n 'pending': {\n lottie: pendingImg,\n text: 'Pending...',\n color: '#FC802D'\n },\n 'success': {\n text: 'Successful!',\n color: '#2CBF68',\n lottie: successImg\n },\n 'fail': {\n text: 'Failed!',\n color: '#F14141',\n lottie: failImg\n }\n }\n\n const statusValue = error ? statusMaps.fail : statusMaps[status]\n const [shouldRefetch, setShouldRefetch] = useState(true)\n\n useEffect(() => {\n if (hash) {\n setShouldRefetch(true)\n setStatus('pending')\n } else {\n setStatus('confirm')\n }\n }, [hash])\n const hashQuery = useHash({\n hash,\n chain,\n refetchInterval: shouldRefetch ? 3000 : false\n })\n useEffect(() => {\n if (hashQuery.data == 1 || hashQuery.data == -1) {\n setShouldRefetch(false)\n }\n if (hashQuery.data == 1) {\n setStatus('success')\n } else if (hashQuery.data == -1) {\n setStatus('fail')\n } else if (hashQuery.data == 0) {\n setStatus('pending')\n }\n }, [hashQuery.data]);\n\n const link = chain ? `${chain?.blockExplorers?.default.url}/tx/${hash}` : '';\n\n return <ModalDrawer isOpen={isOpen}\n showClose\n onClose={onClose}\n zIndex={zIndex}\n title={\n <div className={\"matchid-hashpanel-header\"}\n style={{\n color: statusValue.color\n }}>{statusValue.text}</div>\n }\n >\n <div className=\"matchid-hashpanel-box\">\n <div className=\"matchid-hashpanel-content\">\n <div className={`matchid-hashpanel-status`} style={{\n color: statusValue.color\n }}>{statusValue.text}</div>\n {\n statusValue.lottie && <Lottie animationData={statusValue.lottie} style={{\n width: \"96px\",\n height: \"96px\",\n }}/>\n }\n\n {hash && <div className=\"matchid-hashpanel-hash\">\n Hash:<a href={link} target=\"_blank\">{hash}</a>\n </div>}\n {error && <div className=\"matchid-hashpanel-text\">\n {error}\n </div>}\n </div>\n <Button onClick={onClose} size=\"lg\" block>Back</Button>\n </div>\n </ModalDrawer>\n}\n\nexport default function (props: HashPanelProps) {\n return props.isOpen && <HashPanel {...props}/>\n\n}","import { useState ,useEffect} from \"react\";\n\nexport function useDownMd(): boolean {\n const [isBelowMd, setIsBelowMd] = useState(window.matchMedia('(max-width: 767px)').matches);\n\n useEffect(() => {\n const handleResize = () => {\n setIsBelowMd(window.matchMedia('(max-width: 767px)').matches);\n };\n\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return isBelowMd;\n}","import React, {PropsWithChildren, useEffect, useState} from \"react\";\nimport {ModalProps, ModalWithHeaderProps} from \"../../types\";\nimport ArrowLeftIcon from \"../../assets/icon/ArrowLeftIcon\";\nimport {CloseRoundIcon} from \"../../assets/icon\";\nimport {useDownMd} from \"../../hooks/useLayout\";\nimport Overlay from \"../Overlay\";\nimport { Button } from \"components\";\nimport { useIntl } from \"react-intl\";\n\nexport default function Modal({\n children,\n isOpen,\n width = 480,\n zIndex = 100,\n className = ''\n }: ModalProps) {\n\n return <Overlay isOpen={isOpen} zIndex={zIndex}>\n <div className={`matchid-modal ${className}`} style={{\n width\n }}>\n <div className=\"matchid-modal-mobile-header\"></div>\n {children}\n </div>\n </Overlay>\n}\n\nexport function ModalWithHeader({\n children,\n onBack,\n onClose,\n title,\n showBorder = true,\n showClose = true,\n ...props\n\n }: ModalWithHeaderProps) {\n const isDownMd = useDownMd()\n return <Modal {...props}>\n <div className={`matchid-modal-header ${showBorder ? 'matchid-modal-header-border' : ''}`}>\n <div className=\"matchid-modal-header-content\">\n {\n onBack &&\n <ArrowLeftIcon height={isDownMd ? 20 : 25} width={isDownMd ? 20 : 24} className=\"matchid-modal-header-back\" onClick={onBack}/>\n }\n <span className=\"matchid-modal-header-title\">{title}</span>\n </div>\n {onClose &&\n <CloseRoundIcon size={isDownMd ? 24 : 30} className=\"matchid-modal-header-close\" onClick={onClose}/>}\n </div>\n {children}\n </Modal>\n\n}\n\nexport function ConfirmModal({\n title,\n children,\n onClose,\n onConfirm,\n isOpen,\n confirmText,\n zIndex=100\n }: {\n title?: string\n onClose: () => void,\n onConfirm: () => Promise<void>,\n isOpen: boolean,\n confirmText?: React.ReactNode,\n zIndex?:number\n} & PropsWithChildren) {\n const intl = useIntl()\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n useEffect(() => {\n if (isOpen) {\n setError('')\n setLoading(false)\n }\n }, [isOpen]);\n const onSubmit = async () => {\n setError('')\n setLoading(true)\n try {\n await onConfirm()\n } catch (e: any) {\n setError(e.message)\n console.error(e)\n } finally {\n setLoading(false)\n }\n }\n\n return <ModalWithHeader isOpen={isOpen} onClose={onClose} title={title} zIndex={zIndex}>\n <div className=\"matchid-confirm-modal\">\n <div className=\"matchid-w-full\">{children}</div>\n {error && <div className={`matchid-error`}>{error}</div>}\n <Button size={\"lg\"} onClick={onSubmit} loading={loading} block highlight>{confirmText ?? intl.formatMessage({\n id:\"Confirm\"\n })}</Button>\n </div>\n </ModalWithHeader>\n}","import {useEffect, useState} from \"react\";\nimport {ModalWithHeader} from \"../../ui/Modal\";\nimport StepEmail from \"./StepEmail\";\nimport StepVerify from \"./StepVerify\";\nimport {EmailModalProps} from \"../../types/types\";\nimport {useIntl} from \"react-intl\";\n\nexport default function EmailModal({\n isOpen = false,\n width = 480,\n onClose,\n onBack,\n onLogin\n }: EmailModalProps) {\n const [step, setStep] = useState<\"input\" | \"verify\">(\"input\")\n const [emailVal, setEmailVal] = useState('')\n const intl = useIntl()\n\n useEffect(() => {\n if (!isOpen) {\n setStep('input')\n setEmailVal('')\n }\n }, [isOpen])\n\n return <ModalWithHeader\n isOpen={isOpen}\n width={width}\n onClose={onClose}\n title={intl.formatMessage({\n id:\"email\"\n })}\n onBack={step == 'verify' ? () => setStep(\"input\") : onBack}\n >\n {\n step === \"input\" ? <StepEmail email={emailVal} onContinue={(email) => {\n setEmailVal(email)\n setStep(\"verify\")\n }}/> : <StepVerify email={emailVal} onSuccess={onLogin}/>}\n </ModalWithHeader>\n}","import {useEffect, useMemo, useState} from \"react\";\nimport {isValidEmail} from \"utils\";\nimport Button from \"../../ui/Button\";\nimport Input from \"../../ui/Input\";\nimport Field from \"../../ui/Field\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nexport default function StepEmail(props: {\n email: string\n onContinue: (email: string) => void\n}) {\n const intl = useIntl()\n const [emailVal, setEmailVal] = useState('')\n useEffect(() => {\n if (props.email) {\n setEmailVal(props.email)\n }\n }, []);\n\n const canContinue = useMemo(() => {\n return isValidEmail(emailVal)\n }, [emailVal])\n\n const onContinue = async () => {\n props.onContinue(emailVal)\n }\n\n return <div className=\"matchid-email-email-box\">\n <Field label={intl.formatMessage({\n id:\"emailAddress\"\n })}>\n <Input\n placeholder={intl.formatMessage({\n id:\"emailAddressPlaceholder\"\n })}\n onChange={e => setEmailVal(e.target.value)}\n value={emailVal}\n />\n </Field>\n\n <Button disabled={!canContinue} style={{\n marginTop:\"64px\"\n }} onClick={onContinue} size={\"lg\"} block highlight><FormattedMessage id={\"continue\"}/></Button>\n\n </div>\n}\n","import {InputProps} from \"types/types\";\nimport {DeleteRoundIcon, CloseEyeIcon, OpenEyeIcon, InputLengthIcon} from \"assets/icon\";\nimport {PropsWithChildren, useEffect, useRef, useState} from \"react\";\nimport {useDownMd} from \"../../hooks/useLayout\";\n\nexport default function Input({\n onChange,\n type,\n after,\n showLength = false,\n showClear = true,\n className = '',\n rows = 1,\n maxRows = 4,\n children,\n ...props\n }: InputProps & PropsWithChildren) {\n const [inputType, setInputType] = useState(type)\n const isDownMd = useDownMd()\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n useEffect(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.height = 'auto';\n const lineHeight = 24;\n const maxHeight = lineHeight * 4;\n textarea.style.height = Math.min(textarea.scrollHeight, maxHeight) + 'px';\n }\n }, [props.value]);\n return <div\n className={`matchid-input-box matchid-input-${type} ${props.value && props.value.length > 0 ? 'matchid-input-has-content' : ''} ${className}`}\n style={{\n // @ts-ignore\n '--max-rows': maxRows\n }}\n >\n {children ?? (type == \"textarea\" ?\n <textarea rows={1} onChange={onChange} {...props} className=\"matchid-input-field\" ref={textareaRef} style={{\n maxHeight: maxRows * 24 + 'px'\n }}/> :\n <input type={inputType} onChange={onChange} {...props} className=\"matchid-input-field\"/>)}\n {\n type != \"textarea\" && showClear && props.value && props.value.length > 0\n && <div className=\"matchid-input-delete-icon\" onClick={(e) => {\n if (onChange) {\n onChange({target: {value: ''}});\n }\n }}>\n <DeleteRoundIcon height={isDownMd ? 16 : 21} width={isDownMd ? 16 : 20}\n color=\"var(--matchid-input-delete-icon-color)\"/>\n </div>\n }\n {\n type === 'password' && <div className=\"matchid-input-eye-icon\" onClick={() => {\n setInputType(inputType === 'password' ? 'text' : 'password')\n }}>\n {\n inputType === 'password' ? <CloseEyeIcon size={isDownMd ? 16 : 20}/> :\n <OpenEyeIcon size={isDownMd ? 16 : 20}/>\n }\n </div>\n }\n {\n showLength && props.maxLength && <div className={`matchid-input-length`}>\n <span>{props.value?.length || 0}/{props.maxLength}</span>\n <InputLengthIcon color={'var(--icon-color)'}/>\n </div>\n }\n {\n after\n }\n </div>\n\n}","import useUserInfo from \"../../hooks/useUserInfo\";\nimport {useEffect, useMemo, useRef, useState} from \"react\";\nimport Button from \"../../ui/Button\";\nimport {EmailLineIcon} from \"assets/icon\";\nimport Input from \"../../ui/Input\";\nimport Field from \"../../ui/Field\";\nimport {EMAIL_CODE_LENGTH, EMAIL_INTERVAL} from \"../../config\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport {useDownMd} from \"../../hooks/useLayout\";\n\nexport default function StepVerify(props: {\n email: string\n onSuccess?: () => void\n}) {\n const intl = useIntl()\n const {getLoginEmailCode, loginByEmail} = useUserInfo()\n const [error, setError] = useState('')\n const [code, setCode] = useState('')\n const [sending, setSending] = useState(false)\n const [submitting, setSubmitting] = useState(false)\n const sendTimeRef = useRef(0)\n const [sendBtnText, setSendBtnText] = useState(intl.formatMessage({\n id: \"send\"\n }))\n const intervalTime = EMAIL_INTERVAL\n const codeLength = EMAIL_CODE_LENGTH\n const intervalRef = useRef<NodeJS.Timeout | null>(null);\n const isDownMd = useDownMd()\n\n const onSend = async () => {\n if (sendTimeRef.current > 0) {\n return\n }\n try {\n setError(\"\")\n setSending(true)\n await getLoginEmailCode(props.email)\n sendTimeRef.current = intervalTime\n setSendBtnText(`${sendTimeRef.current}s`)\n intervalRef.current = setInterval(() => {\n sendTimeRef.current--;\n setSendBtnText(`${sendTimeRef.current}s`)\n if (sendTimeRef.current <= 0) {\n setSendBtnText(intl.formatMessage({\n id: \"resend\"\n }))\n clearInterval(intervalRef.current!);\n setSending(false);\n }\n }, 1000);\n } catch (err: any) {\n console.error(\"Send email error\", err)\n setError(intl.formatMessage({\n id: \"sendCodeErrorTip\",\n }, {error: err.message}))\n setSending(false)\n }\n\n }\n useEffect(() => {\n onSend()\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n }\n }, []);\n const canContinue = useMemo(() => {\n return code.length === codeLength\n }, [code])\n\n const onContinue = async () => {\n if (submitting) {\n return\n }\n try {\n setError(\"\")\n setSubmitting(true)\n const res = await loginByEmail({\n email: props.email,\n code\n })\n if (res) {\n props.onSuccess && props.onSuccess()\n }\n setSubmitting(false)\n\n } catch (err: any) {\n console.error(\"Verify email code error\", err)\n setError(err.message)\n setSubmitting(false)\n }\n }\n\n return <div className=\"matchid-email-verify-box\">\n <div className=\"matchid-email-verify-header\">\n <div className=\"matchid-email-verify-header-icon\"><EmailLineIcon size={isDownMd ? 19:24}/></div>\n <div className=\"matchid-email-verify-header-content\">\n <div className=\"matchid-email-verify-header-value\">{props.email}</div>\n <div className=\"matchid-email-verify-header-tips\"><FormattedMessage id=\"sendEmailTips\"/></div>\n </div>\n </div>\n <Field label={intl.formatMessage({\n id:\"verificationCode\"\n })} error={error}>\n <Input\n placeholder={intl.formatMessage({\n id:\"codePlaceholder\"\n })}\n className={\"matchid-email-verify-field\"}\n maxLength={codeLength}\n onChange={e => setCode(e.target.value)}\n value={code}\n after={<Button\n highlight\n disabled={sending}\n style={{\n height: '100%',\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n borderTopRightRadius: 'inherit',\n borderBottomRightRadius: 'inherit',\n width: \"80px\"\n }}\n onClick={onSend}>{sendBtnText}</Button>}\n >\n\n </Input>\n </Field>\n\n <Button disabled={!canContinue} loading={submitting} highlight block size=\"lg\" onClick={onContinue}><FormattedMessage id={\"continue\"}/></Button>\n </div>\n}","import {useState} from \"react\";\nimport {PopoverProps} from \"../../types/types\";\n\nexport default function Popover({\n children,\n content,\n position = \"right\",\n type = \"hover\",\n className = \"\",\n gap = '20px'\n }: PopoverProps) {\n const [active, setActive] = useState(false)\n return children && <div\n onClick={() => {\n if (type == 'click') {\n setActive(!active)\n }\n }}\n className={`matchid-popover-box matchid-popover-${position} matchid-popover-${type} ${className} ${type == 'click' && active ? 'matchid-popover-click-active' : ''}`}>\n {children}\n <div style={{\n paddingTop: gap\n }} className={`matchid-popover-area`}>\n <div className={`matchid-popover-content`}>\n {content}\n </div>\n </div>\n </div>\n\n}","import useUserInfo from \"hooks/useUserInfo\";\nimport {LoginBoxProps, OtherLoginMethodType} from \"types/types\";\nimport React, {PropsWithChildren, useMemo, useState} from \"react\";\nimport {\n EmailIcon,\n GoogleIcon,\n TelegramIcon,\n WalletIcon,\n XIcon,\n ArrowRightIcon,\n GithubIcon,\n DiscordIcon,\n LinkedinIcon,\n FacebookIcon,\n ArrowDownIcon,\n EVMDarkIcon,\n EVMLightIcon,\n SOLDarkIcon,\n SOLLightIcon,\n YoutubeIcon,\n BTCDarkIcon,\n BTCLightIcon,\n TRXDarkIcon, TRXLightIcon, TonDarkIcon, TonLightIcon\n} from \"assets/icon\";\nimport EmailModal from \"../EmailModal\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport {useDownMd} from \"../../hooks/useLayout\";\nimport {DEFAULT_WALLET_METHODS, useWalletConfig, WALLET_METHODS} from \"../../hooks/useConfig\";\nimport useAppConfig from \"../../hooks/useAppConfig\";\n\nexport const RecommendItem = ({\n icon,\n name,\n onClick,\n showChildren = false,\n children,\n footer\n }: {\n icon: React.ReactNode,\n name: string,\n onClick: () => void,\n showChildren?: boolean\n footer?: React.ReactNode\n} & PropsWithChildren) => {\n return <div className=\"matchid-login-recommend-method\">\n <div className=\"matchid-login-recommend-method-item\" onClick={onClick}>\n <div className=\"matchid-login-recommend-method-content\">\n <div className=\"matchid-login-recommend-method-icon\">\n {icon}\n </div>\n <span className=\"matchid-login-recommend-method-name\">{name}</span>\n </div>\n {\n footer ? footer : children ? <ArrowDownIcon\n className={`matchid-login-recommend-method-arrow ${showChildren ? 'matchid-login-recommend-method-arrow-active' : ''}`}\n size={20}\n color={\"var(--matchid-arrow-color)\"}/> :\n <ArrowRightIcon className=\"matchid-login-recommend-method-arrow\" size={20}\n color={\"var(--matchid-arrow-color)\"}/>\n }\n\n </div>\n {children && <div\n className={`matchid-login-recommend-method-popover ${showChildren ? 'matchid-login-recommend-method-popover-active' : ''}`}>\n {children}\n </div>}\n </div>\n}\nexport default function LoginBox({\n recommendMethods,\n methods ,\n walletMethods ,\n inModal = false\n }: LoginBoxProps) {\n\n const config = useAppConfig()\n const methodConfig = useMemo(()=>{\n if(recommendMethods||methods||walletMethods){\n return {\n recommendMethods:recommendMethods?recommendMethods:(walletMethods?['wallet']:[]),\n methods:methods||[],\n walletMethods:walletMethods||[]\n }\n }\n if(!config.platform){\n return {\n recommendMethods:[],\n methods:[],\n walletMethods:[]\n }\n }\n const platform = config.platform.map(p=>{\n // @ts-ignore\n if(p=='x'||p=='X'){\n return 'twitter'\n }\n return p.toLowerCase()\n })\n console.log('platform',platform)\n const walletMethodList = WALLET_METHODS.filter(m=>platform.includes(m))\n let recommendMethodList = walletMethodList.length>0?['wallet']:[]\n let methodList:any[] = []\n const otherMethodList = platform.filter(m=>!walletMethodList.includes(m as any))\n if(otherMethodList.length>0){\n const recommendMethodListLength = recommendMethodList.length\n const maxRecommendMethodListLength = 3\n if(recommendMethodListLength<maxRecommendMethodListLength){\n recommendMethodList = recommendMethodList.concat(otherMethodList.slice(0,Math.min(maxRecommendMethodListLength-recommendMethodListLength,otherMethodList.length)))\n methodList = otherMethodList.slice(maxRecommendMethodListLength-recommendMethodListLength)\n }else{\n methodList = otherMethodList\n }\n }\n return {\n recommendMethods:recommendMethodList,\n methods:methodList,\n walletMethods:walletMethodList\n }\n },[config.platform,recommendMethods,methods,walletMethods])\n\n const [emailOpen, setEmailOpen] = useState(false)\n const {login} = useUserInfo()\n const [showWallet, setShowWallet] = useState(false)\n const intl = useIntl()\n const isDownMd = useDownMd()\n const methodMap: {\n [key: string]: {\n icon: React.ReactNode,\n name: string,\n onClick: () => void,\n type?: \"wallet\"\n }\n } = {\n wallet: {\n icon: <WalletIcon size={isDownMd ? 36 : 40}/>,\n name: intl.formatMessage({id: \"wallet\"}),\n onClick: () => setShowWallet(!showWallet),\n type: \"wallet\"\n },\n email: {\n icon: <EmailIcon size={isDownMd ? 36 : 40}/>,\n name: intl.formatMessage({id: \"email\"}),\n onClick: () => {\n setEmailOpen(true)\n }\n },\n google: {\n icon: <GoogleIcon size={isDownMd ? 36 : 40}/>,\n name: \"Google\",\n onClick: () => login('google')\n },\n twitter: {\n icon: <XIcon size={isDownMd ? 36 : 40}/>,\n name: \"X\",\n onClick: () => login('twitter')\n },\n telegram: {\n icon: <TelegramIcon size={isDownMd ? 36 : 40}/>,\n name: \"Telegram\",\n onClick: () => login('telegram')\n },\n github: {\n icon: <GithubIcon size={isDownMd ? 36 : 40}/>,\n name: \"Github\",\n onClick: () => login('github')\n },\n discord: {\n icon: <DiscordIcon size={isDownMd ? 36 : 40}/>,\n name: \"Discord\",\n onClick: () => login('discord')\n },\n linkedin: {\n icon: <LinkedinIcon size={isDownMd ? 36 : 40}/>,\n name: \"LinkedIn\",\n onClick: () => login('linkedin')\n },\n facebook: {\n icon: <FacebookIcon size={isDownMd ? 36 : 40}/>,\n name: \"Facebook\",\n onClick: () => login('facebook')\n },\n youtube: {\n icon: <YoutubeIcon size={isDownMd ? 36 : 40}/>,\n name: \"Youtube\",\n onClick: () => login('youtube')\n }\n\n }\n\n const {walletMap} = useWalletConfig()\n\n\n return <>\n {(!inModal || !emailOpen) && <div className=\"matchid-login-box\">\n <div className=\"matchid-login-recommend-list\">\n {\n methodConfig.recommendMethods.map((m) => {\n return <RecommendItem\n icon={methodMap[m]?.icon}\n name={methodMap[m]?.name}\n onClick={methodMap[m]?.onClick}\n key={m}\n showChildren={m == 'wallet' && showWallet}\n >\n {\n m == 'wallet' && <>\n <div className={\"matchid-login-recommend-wallet-divider\"}></div>\n <div className={\"matchid-login-recommend-wallet-list\"}>\n {\n methodConfig.walletMethods.map((n) => {\n const m = walletMap[n]\n return <div className={\"matchid-login-recommend-wallet-item\"}\n key={m.name}\n onClick={()=>{\n login(m.method)\n }}>\n <div className={\"matchid-login-recommend-wallet-item-content\"}>\n <div className={\"matchid-login-recommend-wallet-item-icon\"}>\n {m.icon}\n </div>\n <div\n className={\"matchid-login-recommend-wallet-item-hover-icon\"}>\n {m.activeIcon}\n </div>\n\n <span\n className={\"matchid-login-recommend-wallet-item-name\"}>{m.name}</span>\n </div>\n <ArrowRightIcon\n className=\"matchid-login-recommend-wallet-item-arrow\"\n size={20}\n color={\"var(--matchid-arrow-color)\"}/>\n </div>\n })\n }\n </div>\n </>\n }\n </RecommendItem>\n })\n }\n </div>\n {methodConfig.methods.length > 0 &&\n <div className=\"matchid-login-other\">\n <div className=\"matchid-login-other-text\"><FormattedMessage id={\"otherLoginMethods\"}/></div>\n <div className=\"matchid-login-method-box\">\n {\n methodConfig.methods.map((m) => {\n return <div className=\"matchid-login-method-item\" key={m}\n onClick={methodMap[m]?.onClick} title={methodMap[m]?.name}>\n {methodMap[m]?.icon}\n </div>\n })\n }\n </div>\n </div>\n }\n </div>\n }\n <EmailModal\n isOpen={emailOpen}\n onClose={() => {\n setEmailOpen(false)\n }}\n onBack={inModal ? () => {\n setEmailOpen(false)\n } : undefined}\n />\n </>\n\n}\n","import React from \"react\";\nimport {\n BTCDarkIcon,\n BTCLightIcon,\n EVMDarkIcon,\n EVMLightIcon,\n SOLDarkIcon,\n SOLLightIcon, TonDarkIcon, TonLightIcon,\n TRXDarkIcon, TRXLightIcon\n} from \"../assets/icon\";\nimport {useDownMd} from \"./useLayout\";\nimport {WalletType} from \"../types\";\nexport const DEFAULT_WALLET_METHODS:WalletType[] = [\"evm\", 'sol', 'btc', 'tron', 'ton']\nexport const WALLET_METHODS:WalletType[] = [\"evm\", 'sol', 'btc', 'tron', 'ton']\nexport function useWalletConfig(){\n const isDownMd = useDownMd()\n const walletMap: {\n [key: string]: {\n icon: React.ReactNode,\n activeIcon: React.ReactNode,\n name: string,\n method: WalletType,\n }\n } = {\n evm: {\n icon: <EVMDarkIcon size={isDownMd ? 36 : 40}/>,\n activeIcon: <EVMLightIcon size={isDownMd ? 36 : 40}/>,\n name: \"EVM\",\n method: 'evm'\n },\n sol: {\n icon: <SOLDarkIcon size={isDownMd ? 36 : 40}/>,\n activeIcon: <SOLLightIcon size={isDownMd ? 36 : 40}/>,\n name: \"SOL\",\n method: 'sol'\n },\n btc: {\n icon: <BTCDarkIcon size={isDownMd ? 36 : 40}/>,\n activeIcon: <BTCLightIcon size={isDownMd ? 36 : 40}/>,\n name: \"BTC\",\n method: 'btc'\n },\n tron: {\n icon: <TRXDarkIcon size={isDownMd ? 36 : 40}/>,\n activeIcon: <TRXLightIcon size={isDownMd ? 36 : 40}/>,\n name: \"TRON\",\n method: 'tron'\n },\n ton: {\n icon: <TonDarkIcon size={isDownMd ? 36 : 40}/>,\n activeIcon: <TonLightIcon size={isDownMd ? 36 : 40}/>,\n name: \"TON\",\n method: 'ton'\n }\n }\n\n return {\n walletMap\n }\n}","import {useQuery} from \"@tanstack/react-query\";\nimport {getAppConfigApi} from \"../api\";\nimport {isSuccess} from \"../api/request\";\n\nexport default function useAppConfig(){\n const query = useQuery({\n queryKey: ['appConfig'],\n queryFn: async () => {\n const res = await getAppConfigApi()\n if(!isSuccess(res)){\n return null\n }\n return res.data\n },\n })\n\n return {\n isFetched: query.isFetched,\n isLoading: query.isLoading,\n ...query.data\n }\n}","import useUserInfo from \"../../hooks/useUserInfo\";\nimport {ReactNode, useState} from \"react\";\nimport {\n ButtonProps,\n OtherLoginMethodType,\n PopoverPositionType,\n PopoverTypeType,\n RecommendLoginMethodType, WalletType,\n} from \"../../types/types\";\nimport {truncateAddress} from \"../../utils\";\nimport Button from \"../../ui/Button\";\nimport {LoginIcon, UnLoginIcon} from \"../../assets/icon\";\nimport LoginModal from \"../LoginModal\";\nimport UserPopover from \"../UserPopover\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nexport default function LoginButton({\n loginRender,\n methods,\n recommendMethods,\n onLoginClick,\n popoverPosition = \"right\",\n popoverType = \"hover\",\n popoverGap = 20,\n walletMethods,\n ...props\n }: Omit<ButtonProps, 'onClick' | 'highlight'> & {\n loginRender?: ReactNode\n methods?: OtherLoginMethodType[],\n recommendMethods?: RecommendLoginMethodType[]\n walletMethods?: WalletType[]\n onLoginClick?: () => void\n popoverPosition?: PopoverPositionType\n popoverType?: PopoverTypeType,\n popoverGap?: number | string\n}) {\n const intl = useIntl()\n const {isLogin, username} = useUserInfo()\n const [loginOpen, setLoginOpen] = useState(false)\n if (!isLogin) {\n return <>\n <LoginModal methods={methods} walletMethods={walletMethods} recommendMethods={recommendMethods} isOpen={loginOpen}\n onClose={() => setLoginOpen(false)}/>\n <Button className={'matchid-unlogin-btn'} {...props} highlight onClick={() => setLoginOpen(true)}>\n <UnLoginIcon/>\n <span><FormattedMessage id=\"login\"/></span>\n </Button>\n </>\n }\n return loginRender ? <>{loginRender}</> :\n <UserPopover position={popoverPosition} type={popoverType} gap={popoverGap}>\n <Button onClick={onLoginClick} className={'matchid-login-btn'} {...props}>\n <LoginIcon/>\n <span>{username ? truncateAddress(username) : ('MatchID ' + intl.formatMessage({\n id: 'user'\n }))}</span>\n </Button>\n </UserPopover>\n\n}","import {LoginPanelProps} from \"types/types\";\nimport LoginBox from \"../LoginBox\";\nimport {CloseRoundIcon} from \"assets/icon\";\nimport {FormattedMessage} from \"react-intl\";\nimport {useDownMd} from \"../../hooks/useLayout\";\n\nexport default function LoginPanel({\n\n header,\n onClose,\n ...props\n }: LoginPanelProps) {\n\n const isDownMd = useDownMd()\n return <div className=\"matchid-login-panel\">\n {header ? header : <div className=\"matchid-login-panel-header\">\n <div className=\"matchid-login-panel-header-content\">\n <div className=\"matchid-login-panel-header-title\"><FormattedMessage id=\"loginTitle\"/></div>\n <div className=\"matchid-login-panel-header-subtilte\"><FormattedMessage id=\"loginTips\"/></div>\n </div>\n {\n onClose && <div className={\"matchid-login-panel-header-close\"} onClick={onClose}><CloseRoundIcon size={isDownMd?24:30}/></div>\n }\n\n </div>}\n <div className=\"matchid-login-panel-divide\"/>\n <div className={\"matchid-login-panel-box\"}>\n <LoginBox {...props}/>\n </div>\n </div>\n\n}\n","import Modal from \"ui/Modal\";\nimport LoginPanel from \"../LoginPanel\";\nimport {LoginModalProps} from \"../../types/types\";\nimport {useUserInfo} from \"../../hooks\";\n\nexport default function LoginModal({\n isOpen = false,\n width = 480,\n ...props\n }: LoginModalProps) {\n const {isLogin} = useUserInfo()\n return <Modal\n isOpen={isOpen && !isLogin}\n width={width}\n >\n <LoginPanel {...props} inModal/>\n </Modal>\n}","import {PopoverProps, UserPopoverProps} from \"../../types/types\";\nimport Popover from \"../../ui/Popover\";\nimport Button from \"../../ui/Button\";\nimport {useCopyClipboard, useUserInfo} from \"../../hooks\";\nimport {PropsWithChildren, useState} from \"react\";\nimport ProfileIcon from \"../../assets/icon/ProfileIcon\";\nimport {ArrowRightIcon, CheckIcon, CopyIcon} from \"../../assets/icon\";\nimport {truncateAddress} from \"../../utils\";\nimport {UsernameModal} from \"../index\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nfunction UserContent() {\n const {logout,address,username} = useUserInfo()\n const [logouting, setLogouting] = useState(false)\n\n const onLogout = async () => {\n if (logouting) return\n try {\n setLogouting(true)\n await logout()\n } catch (error) {\n console.error(error)\n } finally {\n setLogouting(false)\n }\n }\n const UserItem = ({\n children,\n icon,\n rightIcon,\n onClick\n }:PropsWithChildren&{\n icon?:React.ReactNode,\n rightIcon?:React.ReactNode,\n onClick?:()=>void\n })=>{\n return <div className={\"matchid-user-popover-item\"} onClick={onClick}>\n <div className={`matchid-user-popover-item-content`}>\n {icon}\n <div className={\"matchid-user-popover-item-text\"}>\n {children}\n </div>\n </div>\n {rightIcon}\n </div>\n\n }\n const UserDivider = ()=>{\n return <div className={`matchid-user-popover-divider`}></div>\n }\n\n const [usernameOpen,setUsernameOpen] = useState(false)\n const [copied, setCopied] = useCopyClipboard();\n const intl = useIntl()\n return <div className={\"matchid-user-popover-content\"}>\n <div className={\"matchid-user-popover-list\"}>\n <UserItem onClick={()=>{\n setCopied(address)\n }} icon={copied ?<CheckIcon size={20} color=\"#0ecb81\"/> : <CopyIcon size={20} color=\"var(--icon-color)\"/>} rightIcon={<CheckIcon size={20} color=\"var(--icon-color)\"/>}>\n {truncateAddress(address)}\n </UserItem>\n <UserDivider/>\n <UserItem onClick={()=>{\n setUsernameOpen(true)\n }} icon={<ProfileIcon size={20} color=\"var(--icon-color)\"/>} rightIcon={<ArrowRightIcon size={20} color=\"var(--icon-color)\"/>}>\n {username || intl.formatMessage({\n id:\"setUsername\"\n })}\n </UserItem>\n </div>\n <Button onClick={onLogout} loading={logouting}><FormattedMessage id=\"disconnect\"/></Button>\n <UsernameModal isOpen={usernameOpen} onClose={()=>{\n setUsernameOpen(false)\n }} onSuccess={()=>{\n setUsernameOpen(false)\n }}/>\n </div>\n}\n\nexport default function UserPopover({\n children,\n ...props\n }: UserPopoverProps) {\n return <Popover {...props} content={<UserContent/>}>\n {children}\n </Popover>\n\n}","import { IconSizeColorProps} from \"./types\";\n\nexport default function ProfileIcon({size=24,color='black',...props}:IconSizeColorProps) {\n return <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M7.5 6.75C7.5 4.95507 8.95507 3.5 10.75 3.5C12.5449 3.5 14 4.95507 14 6.75C14 8.54493 12.5449 10 10.75 10C8.95507 10 7.5 8.54493 7.5 6.75ZM10.75 2C8.12665 2 6 4.12665 6 6.75C6 9.37335 8.12665 11.5 10.75 11.5C13.3734 11.5 15.5 9.37335 15.5 6.75C15.5 4.12665 13.3734 2 10.75 2ZM8.75 13C5.57436 13 3 15.5744 3 18.75V19.75C3 20.7165 3.7835 21.5 4.75 21.5H13.6646L13.0292 20.8646C12.7764 20.6118 12.5733 20.3185 12.4263 20H4.75C4.61193 20 4.5 19.8881 4.5 19.75V18.75C4.5 16.4028 6.40279 14.5 8.75 14.5H12.6452C13.0508 13.8858 13.676 13.4295 14.4091 13.243C13.8838 13.0849 13.3268 13 12.75 13H8.75Z\"\n fill={color}/>\n <path fillRule=\"evenodd\" clipRule=\"evenodd\"\n d=\"M19.0677 22.4771L21.4771 20.0677C21.841 19.7038 21.841 19.1139 21.4771 18.75L17.75 15.0229C17.5753 14.8482 17.3383 14.75 17.0911 14.75H14.6818C14.1672 14.75 13.75 15.1672 13.75 15.6818V18.0911C13.75 18.3383 13.8482 18.5753 14.0229 18.75L17.75 22.4771C18.1139 22.841 18.7038 22.841 19.0677 22.4771ZM15.6135 17.3124C15.9995 17.3124 16.3124 16.9995 16.3124 16.6135C16.3124 16.2276 15.9995 15.9147 15.6135 15.9147C15.2276 15.9147 14.9147 16.2276 14.9147 16.6135C14.9147 16.9995 15.2276 17.3124 15.6135 17.3124Z\"\n fill={color}/>\n </svg>\n\n}","import {ModalWithHeaderProps} from \"types/types\";\nimport {ModalWithHeader} from \"../../ui/Modal\";\nimport {useEffect, useMemo, useState} from \"react\";\nimport {isValidUsername} from \"../../utils\";\nimport Input from \"../../ui/Input\";\nimport Field from \"../../ui/Field\";\nimport Button from \"../../ui/Button\";\nimport InfoLineIcon from \"../../assets/icon/InfoLineIcon\";\nimport {useUserInfo} from \"../../hooks\";\nimport CheckRoundIcon from \"../../assets/icon/CheckRoundIcon\";\nimport {setUserNameApi} from \"../../api\";\nimport {isSuccess} from \"../../api/request\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport {useDownMd} from \"../../hooks/useLayout\";\n\nconst ValidItem = ({\n success = false,\n text\n }: {\n success?: boolean,\n text: string\n}) => {\n const isDownMd = useDownMd()\n return <div className={`matchid-valid-status-item matchid-valid-status-${success ? 'success' : 'error'}`}>\n\n {success ? <CheckRoundIcon size={isDownMd ? 12 : 16}/> : <InfoLineIcon size={isDownMd ? 12 : 16}/>}\n <span>\n {text}\n </span>\n </div>\n}\n\nexport default function UsernameModal({\n title,\n isOpen,\n onSuccess,\n ...props\n }: ModalWithHeaderProps & {\n onSuccess?: () => void\n}) {\n const {username, refreshOverview} = useUserInfo()\n const {isLogin} = useUserInfo()\n const [val, setVal] = useState(username)\n const [error, setError] = useState('')//error from api\n const isDownMd = useDownMd()\n\n useEffect(() => {\n if (isOpen) {\n setVal(username)\n setError('')\n }\n }, [isOpen]);\n\n const isValid = useMemo(() => {\n return isValidUsername(val)\n }, [val])\n\n const isLength = useMemo(() => {\n return val.length >= 2 && val.length <= 32\n }, [val])\n\n const isSafe = isValid && isLength\n\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n const onSubmit = async () => {\n if (isSubmitting) return\n try {\n setIsSubmitting(true)\n const res = await setUserNameApi({\n username: val\n })\n\n if (isSuccess(res)) {\n await refreshOverview()\n onSuccess && onSuccess()\n } else {\n setError(res.message)\n }\n\n } catch (error: any) {\n setError(error.message)\n } finally {\n setIsSubmitting(false)\n }\n }\n const intl = useIntl()\n\n return <ModalWithHeader isOpen={isOpen && isLogin} {...props} title={title || intl.formatMessage({\n id: username ? \"editUsernameTitle\" : \"setUsernameTitle\"\n })}>\n <div className=\"matchid-username-box\">\n <Field label={intl.formatMessage({\n id: \"username\"\n })} error={error}>\n <Input\n placeholder={intl.formatMessage({\n id: \"usernamePlaceholder\"\n })}\n onChange={e => {\n setVal(e.target.value)\n setError('')\n }}\n value={val}\n />\n </Field>\n <div className=\"matchid-valid\">\n <ValidItem success={isValid}\n text={intl.formatMessage({\n id: \"usernameValidError\"\n })}/>\n <ValidItem success={isLength} text={intl.formatMessage({\n id: \"usernameLengthError\"\n })}/>\n {/*<ValidItem success={isSafe} text={\"Cannot contain sensitive words\"}/>*/}\n </div>\n\n <Button disabled={!isSafe} loading={isSubmitting} style={{\n marginTop: isDownMd ? \"36px\" : \"64px\"\n }} onClick={onSubmit} size={\"lg\"} block highlight><FormattedMessage id=\"confirm\"/></Button>\n <Button style={{\n marginTop: isDownMd ? \"12px\" : \"24px\"\n }} onClick={props.onClose} size={\"lg\"} block><FormattedMessage id=\"cancel\"/></Button>\n </div>\n </ModalWithHeader>\n}","import {BindWalletParam, ILoginWalletReq, ModalWithHeaderProps} from \"types/types\";\nimport {ModalWithHeader} from \"ui\";\nimport React, {useCallback, useEffect, useState} from \"react\";\nimport {getWalletInitApi, getWalletNonceApi, loginByWalletApi, toBindWalletApi} from \"../../api\";\nimport {isSuccess} from \"../../api/request\";\nimport matchlog from \"../../utils/matchlog\";\nimport {useMatch} from \"../../MatchContext\";\nimport eventManager from \"../../hooks/eventManager\";\nimport {useIntl} from \"react-intl\";\nimport {WalletModalContentV2} from \"../WalletModalContent\";\n\nimport {RainbowKitProvider, useConnectModal} from \"@rainbow-me/rainbowkit\";\nimport {useAccount, useChainId, useConfig, useDisconnect} from \"wagmi\";\nimport useWalletBox from \"../../hooks/useWalletBox\";\nimport {getEthersSigner} from \"hooks/useEthersSigner\";\nimport {SiweMessage} from \"siwe\";\nimport \"@rainbow-me/rainbowkit/styles.css\";\n\n\nfunction WalletContent({\n onSuccess,\n type,\n }: {\n onSuccess?: () => void\n type: 'login' | 'bind' | ''\n}) {\n const config = useConfig();\n const {openConnectModal, connectModalOpen} = useConnectModal();\n const {address, connector, isConnected} = useAccount();\n const {disconnectAsync} = useDisconnect({config});\n const chainId = useChainId()\n const {events, login} = useMatch()\n const [inited, setInited] = useState(false)\n\n\n const {status, setStatus, error, setError, statusRef, nonce, setNonce, init} = useWalletBox({\n onInit: async ({setStatus}) => {\n setStatus('start')\n }\n })\n\n useEffect(() => {\n matchlog.log(`status=${status}`, `connectModalOpen=${connectModalOpen}`, `address=${address}`, `isConnected=${isConnected}`)\n }, [status, connectModalOpen, isConnected, address]);\n useEffect(() => {\n if (connectModalOpen) {\n setStatus(\"connecting\")\n return\n }\n if (!connectModalOpen && address) {\n toLoginInWallet(address)\n return\n }\n if (!connectModalOpen && !address) {\n setStatus('start')\n }\n }, [connectModalOpen, address]);\n useEffect(() => {\n if (openConnectModal && !isConnected && !inited) {\n openConnectModal && openConnectModal()\n setInited(true)\n }\n }, [openConnectModal, inited]);\n // useAccountEffect({\n // onDisconnect() {\n // matchlog.log('onDisconnect')\n // setStatus('start')\n // },\n // onConnect(data) {\n // matchlog.log('onConnect',data)\n // setStatus('connecting')\n // toLoginInWallet(data.address)\n // },\n // });\n\n\n // useEffect(() => {\n // if ( status != 'start') {\n // visible && setVisible(false)\n // } else if(status=='start'){\n // !visible && setVisible(true)\n // }\n // }, [ status])\n\n\n const toLoginInWallet = async (address: string) => {\n if (statusRef.current != 'start' && statusRef.current != 'connecting') return\n\n try {\n if (!address) {\n throw new Error('Wallet address is empty')\n }\n setStatus('nonce')\n const res = type == 'bind' ? await getWalletInitApi({\n address,\n type: \"EVM\"\n }) : await getWalletNonceApi({address, type: \"EVM\"});\n\n if (!isSuccess(res)) {\n throw new Error(res.message)\n }\n setNonce(res.data.nonce)\n } catch (error: any) {\n console.error('toLoginInWallet', error)\n setStatus('error')\n setError(error.message)\n }\n }\n\n const signature = useCallback(async () => {\n if (!nonce || status != 'nonce') {\n return\n }\n try {\n const signer = await getEthersSigner(config);\n if (!signer) return;\n matchlog.log('signature', nonce, status)\n if (!address) {\n throw new Error('Wallet address is empty')\n }\n setStatus('signer')\n const params: ILoginWalletReq = {\n domain: window.location.host,\n address,\n statement: 'By signing, you are proving you own this wallet and logging in. This does not initiate a transaction or cost any fees.',\n uri: window.location.origin,\n nonce,\n version: \"1\",\n chainId,\n };\n const message = new SiweMessage({...params});\n const signature = await signer.signMessage(message.prepareMessage());\n const obj: BindWalletParam = {\n type: 'EVM',\n address: address,\n signature: signature,\n message: `${message.prepareMessage()}`,\n connector_type: connector?.type || '',\n wallet_client_type: connector?.name || '',\n }\n const res = type == 'bind' ? await toBindWalletApi(obj) : await loginByWalletApi(obj)\n if (!isSuccess(res)) {\n throw new Error(res.message)\n }\n\n matchlog.log(res)\n setStatus('success')\n if (type == 'bind') {\n events!.onBind && events!.onBind({\n type: 'evm'\n })\n eventManager.emit('onBind', {\n type: 'evm'\n })\n } else {\n await login({\n token: `${res.data.token_type} ${res.data.access_token}`\n })\n }\n onSuccess && onSuccess()\n\n\n } catch (error: any) {\n console.error('signature', error)\n setStatus('error')\n setError(error.reason || error.message)\n }\n\n\n }, [nonce, status, address])\n useEffect(() => {\n if (signature) {\n signature()\n }\n }, [signature])\n\n const onError = async () => {\n if (isConnected) {\n try {\n await disconnectAsync()\n } catch (error: any) {\n console.error('disconnectAsync', error)\n }\n }\n\n setError('')\n setNonce(undefined)\n setStatus('start')\n openConnectModal?.()\n }\n const onConnect = async () => {\n // console.log('onConnect')\n if (isConnected) {\n try {\n await disconnectAsync()\n } catch (error: any) {\n console.error('disconnectAsync', error)\n }\n }\n setError('')\n setNonce(undefined)\n openConnectModal?.()\n }\n const onDisconnect = async () => {\n if (isConnected) {\n try {\n await disconnectAsync()\n } catch (error: any) {\n console.error('disconnectAsync', error)\n }\n }\n\n setError('')\n setNonce(undefined)\n setStatus('start')\n }\n\n return <WalletModalContentV2\n status={status}\n onSuccess={async () => onSuccess?.()}\n error={error}\n onError={onError}\n onConnect={onConnect}\n onDisconnect={onDisconnect}\n />\n}\n\ntype EVMModalProps = ModalWithHeaderProps & {\n type?: 'login' | 'bind' | ''\n onSuccess?: () => void\n}\n\nfunction EVMConnectModal({\n type = 'login',\n onSuccess,\n ...props\n }: EVMModalProps) {\n const intl = useIntl()\n return <ModalWithHeader {...props} title={props.title || (intl.formatMessage({\n id: type == \"bind\" ? \"bindWith\" : \"loginWith\"\n }, {\n name: \"EVM\"\n }))}>\n <WalletContent onSuccess={onSuccess} type={type}/>\n </ModalWithHeader>\n}\n\nexport default function EVMModal(props: EVMModalProps) {\n return props.isOpen && <RainbowKitProvider><EVMConnectModal {...props}/></RainbowKitProvider>\n}","import {Button} from \"../index\";\nimport React, {useMemo, useState} from \"react\";\nimport {\n walletConnectedImage,\n walletConnectImage,\n walletConnectingImage,\n walletErrorImage,\n walletSigningImage\n} from \"../../assets/wallet\";\nimport {Lottie} from \"../../ui\";\n\nexport default function WalletModalContent({\n status,\n error,\n disconnect,\n setError,\n setVisible,\n visible,\n address,\n connected\n }: {\n status: string,\n error: string,\n disconnect: () => Promise<void>,\n setError: (error: string) => void,\n setVisible: (visible: boolean) => void,\n visible: boolean,\n address?: string,\n connected: boolean\n\n}) {\n const pageData: {\n btnText?: string,\n btnLoading?: boolean,\n btnDisabled?: boolean,\n btnClick?: () => void\n statusImage: any\n text: string,\n isError?: boolean\n } = useMemo(() => {\n\n if (status == 'success') {\n return {\n btnText: 'Disconnect Wallet',\n btnClick: async () => {\n await disconnect()\n },\n text: 'Wallet connection successful!',\n statusImage: walletConnectedImage\n }\n }\n if (status == 'error') {\n return {\n text: error,\n btnText: \"Reconnect Wallet\",\n btnClick: async () => {\n console.log('click error')\n setError('')\n try {\n await disconnect()\n } catch (error: any) {\n console.error(error)\n }\n setVisible(true)\n },\n statusImage: walletErrorImage,\n isError: true\n }\n }\n if (status == 'nonce') {\n return {\n btnLoading: true,\n text: 'Connecting',\n statusImage: walletConnectingImage\n }\n }\n if (status == 'signer') {\n return {\n btnLoading: true,\n text: 'Signing',\n statusImage: walletSigningImage\n }\n }\n if (visible) {\n return {\n btnLoading: true,\n text: 'Connecting',\n statusImage: walletConnectingImage,\n }\n }\n\n return {\n btnText: 'Connect Wallet',\n btnClick: () => {\n setVisible(true)\n },\n text: 'Please Connect your wallet',\n statusImage: walletConnectImage\n }\n }, [visible, connected, status, error, address])\n return <div className=\"matchid-wallet-container\">\n <div className={`matchid-wallet-box`}>\n <div className={`matchid-wallet-content`}>\n <Lottie animationData={pageData.statusImage} style={{\n width: 128,\n height: 128\n }}/>\n <div className={pageData.isError ? 'matchid-error' : ''}>{pageData.text}</div>\n </div>\n <Button block size=\"lg\" onClick={pageData.btnClick} loading={pageData.btnLoading}\n disabled={pageData.btnDisabled}>\n {pageData.btnText}\n </Button>\n </div>\n </div>\n}\n\nexport function WalletModalContentV2(props: {\n status: string,\n error?: string,\n onError?: () => Promise<void>,\n onConnect?: () => Promise<void>,\n onSuccess?: () => Promise<void>,\n onDisconnect?: () => Promise<void>,\n\n}) {\n const [submitting, setSubmitting] = useState(false)\n const pageData: {\n btnText?: string,\n btnLoading?: boolean,\n btnDisabled?: boolean,\n btnClick?: () => Promise<void>\n statusImage: any\n text: string,\n } = useMemo(() => {\n const {status} = props\n if (status == 'success') {\n return {\n btnText: 'Disconnect Wallet',\n btnClick: async () => {\n setSubmitting(true)\n await props.onDisconnect?.()\n setSubmitting(false)\n },\n text: 'Wallet connection successful!',\n statusImage: walletConnectedImage,\n btnLoading: submitting\n }\n }\n if (status == 'error') {\n return {\n text: props.error || 'Unknown Error',\n btnText: \"Reconnect Wallet\",\n btnClick: async () => {\n setSubmitting(true)\n await props.onError?.()\n setSubmitting(false)\n },\n statusImage: walletErrorImage,\n isError: true,\n btnLoading: submitting\n }\n }\n if (status == 'nonce') {\n return {\n btnLoading: true,\n text: 'Connecting',\n statusImage: walletConnectingImage\n }\n }\n if (status == 'signer') {\n return {\n btnLoading: true,\n text: 'Signing',\n statusImage: walletSigningImage\n }\n }\n if (status == 'connecting') {\n return {\n btnLoading: true,\n text: 'Connecting',\n statusImage: walletConnectingImage,\n }\n }\n\n return {\n btnText: 'Connect Wallet',\n btnClick: async () => {\n setSubmitting(true)\n await props.onConnect?.()\n setSubmitting(false)\n },\n text: 'Please Connect your wallet',\n statusImage: walletConnectImage\n }\n }, [props, submitting])\n return <div className=\"matchid-wallet-container\">\n <div className={`matchid-wallet-box`}>\n <div className={`matchid-wallet-content`}>\n <Lottie animationData={pageData.statusImage} style={{\n width: 128,\n height: 128\n }}/>\n <div className={props.status=='error' ? 'matchid-error' : ''}>{pageData.text}</div>\n </div>\n <Button block size=\"lg\" onClick={pageData.btnClick} loading={pageData.btnLoading}\n disabled={pageData.btnDisabled}>\n {pageData.btnText}\n </Button>\n </div>\n </div>\n}","import { WalletStatusType } from \"types/types\"\nimport { useEffect, useRef, useState } from \"react\"\n\nexport default function useWalletBox({\n onInit\n }:{\n onInit:(data:{\n setStatus:(status:WalletStatusType)=>void,\n })=>void\n}) {\n const [status, setStateStatus] = useState<WalletStatusType>('start')\n const [error, setError] = useState('')\n const statusRef = useRef(status)\n const [nonce,setNonce] = useState<any>()\n\n const setStatus = (status: WalletStatusType) => {\n statusRef.current = status\n setStateStatus(status)\n }\n const init = ()=>{\n setError('')\n setNonce(null)\n }\n useEffect(()=>{\n init()\n\n onInit({\n setStatus\n })\n return ()=>{\n setStatus('start')\n setNonce(null)\n setError('')\n }\n },[])\n return {\n status,\n statusRef,\n setStatus,\n error,\n setError,\n nonce,\n setNonce,\n init\n }\n}","import * as React from 'react'\nimport { useWalletClient } from 'wagmi'\nimport { providers } from 'ethers'\nimport { Config, getConnectorClient } from '@wagmi/core'\nimport type { Account, Chain, Client, Transport } from 'viem'\n\nexport function walletClientToSigner(walletClient: any) {\n const { account, chain, transport } = walletClient\n const network = {\n chainId: chain?.id || 1,\n name: chain?.name,\n ensAddress: chain?.contracts?.ensRegistry?.address,\n }\n const provider = new providers.Web3Provider(transport, network)\n const signer = provider.getSigner(account.address)\n return signer\n}\n\n/** Hook to convert a viem Wallet Client to an ethers.js Signer. */\nexport function useEthersSigner({ chainId }: { chainId?: number } = {}) {\n const { data: walletClient } = useWalletClient({ chainId })\n return React.useMemo(\n () => (walletClient ? walletClientToSigner(walletClient) : undefined),\n [walletClient],\n )\n}\n\n\nexport function clientToSigner(client: Client<Transport, Chain, Account>) {\n const { account, chain, transport } = client\n const network = {\n chainId: chain.id,\n name: chain.name,\n ensAddress: chain.contracts?.ensRegistry?.address,\n }\n const provider = new providers.Web3Provider(transport, network)\n const signer = provider.getSigner(account.address)\n return signer\n}\n\n/** Action to convert a Viem Client to an ethers.js Signer. */\nexport async function getEthersSigner(\n config: any,\n { chainId }: { chainId?: number } = {},\n) {\n const client: any = await getConnectorClient(config, { chainId })\n return clientToSigner(client)\n}","import {BindWalletParam, ModalWithHeaderProps} from \"../../types/types\";\nimport {ModalWithHeader} from \"../../ui/Modal\";\nimport React, {useEffect, useMemo, useState} from \"react\";\nimport {getWalletInitApi, getWalletNonceApi, loginByWalletApi, toBindWalletApi} from \"../../api\";\nimport {isSuccess} from \"../../api/request\";\nimport matchlog from \"../../utils/matchlog\";\nimport {useMatch} from \"../../MatchContext\";\nimport eventManager from \"../../hooks/eventManager\";\nimport {useIntl} from \"react-intl\";\nimport WalletModalContent from \"../WalletModalContent\";\nimport {useTRONWallet} from \"../../hooks/useTRONWallet\";\nimport {RecommendItem} from \"../LoginBox\";\nimport {BitgetIcon, OKXIcon, TronLinkIcon} from \"../../assets/icon\";\nimport {useDownMd} from \"../../hooks/useLayout\";\nimport {Button} from \"../index\";\ntype TRONConnectModalProps = ModalWithHeaderProps & {\n type?: 'login' | 'bind' | ''\n onSuccess?: () => void\n}\nfunction TRONConnectModal({\n type = 'login',\n onSuccess,\n ...props\n }:TRONConnectModalProps) {\n const isDownMd = useDownMd()\n const intl = useIntl()\n const {wallets, installedWallets, chooseWallet, wallet, address, onConnect} = useTRONWallet()\n const iconMaps = {\n tronlink: <TronLinkIcon size={isDownMd ? 36 : 40}/>,\n bitget: <BitgetIcon size={isDownMd ? 36 : 40}/>,\n okx:<OKXIcon size={isDownMd ? 36 : 40}/>\n }\n\n const {events, login} = useMatch()\n const [status, setStatus] = useState<'' | 'nonce' | 'signer' | 'success' | 'error'>('')\n const statusRef = React.useRef(status)\n const [error, setError] = useState('')\n const connected = useMemo(() => {\n return !!address\n }, [address])\n const disconnect = async () => {\n setStatus('')\n chooseWallet(null)\n statusRef.current = ''\n setError('')\n }\n\n const onBack = ()=>{\n setStatus('')\n chooseWallet(null)\n statusRef.current = ''\n setError('')\n }\n\n const toLoginInWallet = async () => {\n if (statusRef.current || !address || !wallet) return\n try {\n setStatus('nonce')\n statusRef.current = 'nonce'\n const res = type == 'bind' ? await getWalletInitApi({address,type:\"TRON\"}) : await getWalletNonceApi({address,type:\"TRON\"});\n if (!isSuccess(res)) {\n throw new Error(res.message)\n }\n const nonce = res.code >= 0 ? res.data.nonce : null;\n if (nonce) {\n setStatus('signer')\n statusRef.current = 'signer'\n const message = \"By signing, you are proving you own this wallet and logging in. This does not initiate a transaction or cost any fees.Nonce:\" + res.data.nonce;\n const signedMessage = await wallet.signMessage(message);\n let obj: BindWalletParam = {\n type: 'TRON',\n address: address,\n signature: signedMessage,\n message: message,\n connector_type: 'TRON',\n wallet_client_type: wallet.walletKey\n }\n const res1 = type == 'bind' ? await toBindWalletApi(obj) : await loginByWalletApi(obj)\n if (res1) {\n if (!isSuccess(res1)) {\n throw new Error(res1.message)\n }\n matchlog.log(res1)\n setStatus('success')\n statusRef.current = 'success'\n if (type == 'bind') {\n events!.onBind && events!.onBind({\n type: 'tron'\n })\n eventManager.emit('onBind', {\n type: 'tron'\n })\n } else {\n await login({\n // mid: res1.data.mid,\n token: `${res1.data.token_type} ${res1.data.access_token}`\n })\n }\n onSuccess && onSuccess()\n }\n }\n } catch (error: any) {\n // toast.error(error.message)\n // disconnect()\n setStatus('error')\n setError(error.message)\n statusRef.current = ''\n }\n }\n\n useEffect(() => {\n if (wallet) {\n console.log('onConnect')\n onConnect()\n } else {\n setStatus('')\n }\n }, [wallet]);\n\n useEffect(() => {\n if (address) {\n toLoginInWallet()\n }\n }, [address]);\n\n useEffect(() => {\n if (!props.isOpen) {\n disconnect()\n }\n }, [props.isOpen]);\n\n return <ModalWithHeader {...props} title={props.title || (intl.formatMessage({\n id: type == \"bind\" ? \"bindWith\" : \"loginWith\"\n }, {\n name: \"TRON\"\n }))} onBack={wallet ? onBack : undefined}>\n {\n wallet ? <WalletModalContent error={error} setError={setError} status={status} disconnect={disconnect}\n address={address || ''} connected={connected} visible setVisible={() => {\n }}/> : <div className=\"matchid-login-box\">\n <div className=\"matchid-login-recommend-list\">\n {\n installedWallets.map(wallet => {\n return <RecommendItem\n key={wallet.walletKey}\n icon={iconMaps[wallet.walletKey as keyof typeof iconMaps]}\n name={wallet.name} onClick={() => {\n chooseWallet(wallet)\n }}/>\n })\n }\n {\n wallets.filter(wallet => !installedWallets.find(installedWallet => installedWallet.walletKey == wallet.walletKey)).map(wallet => {\n return <RecommendItem key={wallet.walletKey}\n icon={iconMaps[wallet.walletKey as keyof typeof iconMaps]}\n name={wallet.name} onClick={() => {\n }}\n footer={<Button size=\"sm\" onClick={() => {\n window.open(wallet.website)\n }}>Install</Button>}/>\n })\n }\n\n\n </div>\n </div>\n }\n </ModalWithHeader>\n}\n\nexport default function TRONModal(props: TRONConnectModalProps) {\n return props.isOpen&&<TRONConnectModal {...props} type={props.type}/>\n}","import {TRONWalletAdapter} from \"../lib/WalletAdapter\";\nimport {TronLinkAdapter} from \"../lib/tron/TronLinkAdapter\";\nimport {useEffect, useState} from \"react\";\nimport {BitgetAdapter} from \"../lib/tron/BitgetAdapter\";\nimport {OKXAdapter} from \"../lib/tron/OKXAdapter\";\n\nexport const useTRONWallet = () => {\n\n const wallets: TRONWalletAdapter[] = [new TronLinkAdapter(), new BitgetAdapter(),new OKXAdapter()];\n const [installedWallets, setInstalledWallets] = useState<TRONWalletAdapter[]>([]);\n const [address, setAddress] = useState<string | null>(null);\n useEffect(() => {\n const getInstalled = async () => {\n const installed = await Promise.all(wallets.map(wallet => wallet.isInstalled().then(isInstalled => ({\n wallet,\n isInstalled\n }))));\n setInstalledWallets(installed.filter(({isInstalled}) => isInstalled).map(({wallet}) => wallet));\n };\n // console.log('getInstalled');\n getInstalled();\n }, []);\n\n const [wallet, chooseWallet] = useState<TRONWalletAdapter | null>(null);\n\n const onConnect = async () => {\n setAddress(await wallet!.connect());\n }\n useEffect(() => {\n\n if (!wallet) {\n setAddress(null)\n }\n }, [wallet]);\n\n return {\n installedWallets,\n wallets,\n chooseWallet,\n wallet,\n address,\n onConnect\n\n }\n\n}","import {BindWalletParam, ModalWithHeaderProps} from \"../../types/types\";\nimport {ModalWithHeader} from \"../../ui/Modal\";\nimport React, {useEffect, useState} from \"react\";\nimport {getWalletInitApi, getWalletNonceApi, loginByWalletApi, toBindWalletApi} from \"../../api\";\nimport {isSuccess} from \"../../api/request\";\nimport matchlog from \"../../utils/matchlog\";\nimport {useMatch} from \"../../MatchContext\";\nimport eventManager from \"../../hooks/eventManager\";\nimport {useIntl} from \"react-intl\";\nimport WalletModalContent from \"../WalletModalContent\";\nimport {\n TonConnectUIProvider,\n useTonAddress,\n useTonConnectModal,\n useTonConnectUI,\n useTonWallet,\n} from '@tonconnect/ui-react';\nimport useLocalStore from \"../../store/useLocalStore\";\n\nfunction WalletContent({\n onSuccess,\n type,\n }: {\n onSuccess?: () => void\n type: 'login' | 'bind' | ''\n}) {\n const {events, login} = useMatch()\n const [connected, setConnected] = useState(false);\n const wallet = useTonWallet();\n const userFriendlyAddress = useTonAddress();\n const [tonConnectUI] = useTonConnectUI();\n const {state, open, close} = useTonConnectModal();\n const [status, setStatus] = useState<'' | 'nonce' | 'signer' | 'success' | 'error'>('')\n const statusRef = React.useRef(status)\n const [error, setError] = useState('')\n\n\n useEffect(() => {\n const init = async () => {\n if (tonConnectUI.connected) {\n await tonConnectUI.disconnect();\n }\n open()\n };\n init();\n tonConnectUI.onStatusChange(wallet => {\n matchlog.log('onStatusChange:', wallet, wallet?.connectItems?.tonProof, JSON.stringify(wallet?.connectItems?.tonProof));\n if (wallet?.connectItems?.tonProof && 'proof' in wallet!.connectItems.tonProof) {\n matchlog.log(wallet?.connectItems.tonProof.proof, wallet?.account);\n const toLoginInWallet = async () => {\n if (statusRef.current || !wallet) return\n setStatus('signer')\n statusRef.current = 'signer'\n try {\n const signature = {\n \"address\": wallet?.account?.address,\n \"network\": wallet?.account?.chain,\n \"public_key\": wallet?.account?.publicKey,\n \"proof\": {\n //@ts-ignore\n ...wallet?.connectItems?.tonProof?.proof,\n \"state_init\": wallet?.account?.walletStateInit\n }\n }\n let obj: BindWalletParam = {\n type: 'TON',\n address: wallet?.account?.publicKey as string,\n signature: JSON.stringify(signature),\n //@ts-ignore\n message:wallet?.connectItems?.tonProof?.proof.payload,\n connector_type: \"TON\",\n wallet_client_type: wallet?.name\n }\n console.log('signature', {\n signature,\n obj\n })\n\n const res1 = type == 'bind' ? await toBindWalletApi(obj) : await loginByWalletApi(obj)\n if (res1) {\n if (!isSuccess(res1)) {\n throw new Error(res1.message)\n }\n matchlog.log(res1)\n setStatus('success')\n statusRef.current = 'success'\n if (type == 'bind') {\n events!.onBind && events!.onBind({\n type: 'ton'\n })\n eventManager.emit('onBind', {\n type: 'ton'\n })\n } else {\n await login({\n // mid: res1.data.mid,\n token: `${res1.data.token_type} ${res1.data.access_token}`\n })\n }\n onSuccess && onSuccess()\n }\n\n } catch (error: any) {\n // toast.error(error.message)\n // disconnect()\n setStatus('error')\n setError(error.message)\n statusRef.current = ''\n }\n }\n toLoginInWallet()\n }\n })\n }, []);\n useEffect(() => {\n if (wallet) {\n setConnected(true);\n console.log('Wallet connected:', wallet);\n } else {\n setConnected(false);\n open()\n statusRef.current = ''\n setStatus('')\n }\n }, [wallet]);\n\n useEffect(() => {\n console.log({\n state,\n wallet\n })\n if (state.status=='opened') {\n const init = async () => {\n tonConnectUI.setConnectRequestParameters({state: 'loading'});\n const res = type == 'bind' ? await getWalletInitApi({\n address: \"tonconnect\",\n type: \"TON\"\n }) : await getWalletNonceApi({address: \"tonconnect\", type: \"TON\"});\n if (!isSuccess(res)) {\n tonConnectUI.setConnectRequestParameters(null);\n throw new Error(res.message)\n }\n tonConnectUI.setConnectRequestParameters({\n state: \"ready\",\n value: {tonProof: res.data.nonce}\n });\n };\n init();\n }else{\n if(!wallet){\n setStatus('')\n statusRef.current = ''\n }\n }\n }, [state]);\n\n\n return <WalletModalContent\n connected={connected}\n disconnect={tonConnectUI.disconnect}\n address={userFriendlyAddress}\n visible={state.status=='opened'}\n setVisible={async(v)=>{\n console.log('setVisible',v)\n\n if(v){\n if (tonConnectUI.connected) {\n await tonConnectUI.disconnect();\n }\n setStatus('')\n statusRef.current = ''\n open()\n }else{\n close()\n }\n }}\n error={error}\n setError={setError}\n status={status}\n />\n}\ntype TonModalProps = ModalWithHeaderProps & {\n type?: 'login' | 'bind' | ''\n onSuccess?: () => void\n}\nfunction TONConnectModal({\n type = 'login',\n onSuccess,\n ...props\n }: TonModalProps) {\n const intl = useIntl()\n const {endpoints, appid} = useLocalStore()\n const manifestUrl = `${endpoints.back}api/v1/wallet/ton?appid=${appid}&url=` + encodeURIComponent(window.location.origin)\n return <ModalWithHeader {...props} title={props.title || (intl.formatMessage({\n id: type == \"bind\" ? \"bindWith\" : \"loginWith\"\n }, {\n name: \"TON\"\n }))}>\n\n <TonConnectUIProvider\n manifestUrl={manifestUrl}>\n <WalletContent onSuccess={onSuccess} type={type}/>\n </TonConnectUIProvider>\n </ModalWithHeader>\n}\nexport default function TONModal(props: TonModalProps) {\n return props.isOpen && <TONConnectModal {...props}/>\n}","import {BindWalletParam, ModalWithHeaderProps} from \"../../types/types\";\nimport {ModalWithHeader} from \"../../ui/Modal\";\nimport React, {useEffect, useMemo, useState} from \"react\";\nimport {getWalletInitApi, getWalletNonceApi, loginByWalletApi, toBindWalletApi} from \"../../api\";\nimport {isSuccess} from \"../../api/request\";\nimport matchlog from \"../../utils/matchlog\";\nimport {useMatch} from \"../../MatchContext\";\nimport eventManager from \"../../hooks/eventManager\";\nimport {useIntl} from \"react-intl\";\nimport WalletModalContent from \"../WalletModalContent\";\nimport {useBTCWallet} from \"../../hooks/useBTCWallet\";\nimport {RecommendItem} from \"../LoginBox\";\nimport {LeatherIcon, PhantomIcon, UnisatIcon, XverseIcon} from \"../../assets/icon\";\nimport {useDownMd} from \"../../hooks/useLayout\";\nimport {Button} from \"../index\";\ntype BTCConnectModalProps = ModalWithHeaderProps & {\n type?: 'login' | 'bind' | ''\n onSuccess?: () => void\n}\nfunction BTCConnectModal({\n type = 'login',\n onSuccess,\n ...props\n }: BTCConnectModalProps) {\n const isDownMd = useDownMd()\n const intl = useIntl()\n const {wallets, installedWallets, chooseWallet, wallet, address, onConnect} = useBTCWallet()\n const iconMaps = {\n leather: <LeatherIcon size={isDownMd ? 36 : 40}/>,\n unisat: <UnisatIcon size={isDownMd ? 36 : 40}/>,\n xverse: <XverseIcon size={isDownMd ? 36 : 40}/>,\n phantom:<PhantomIcon size={isDownMd ? 36 : 40}/>,\n }\n\n const {events, login} = useMatch()\n const [status, setStatus] = useState<'' | 'nonce' | 'signer' | 'success' | 'error'>('')\n const statusRef = React.useRef(status)\n const [error, setError] = useState('')\n const connected = useMemo(() => {\n return !!address\n }, [address])\n const disconnect = async () => {\n wallet&& wallet.disconnet &&wallet!.disconnet!()\n setStatus('')\n chooseWallet(null)\n statusRef.current = ''\n setError('')\n }\n\n const toLoginInWallet = async () => {\n if (statusRef.current || !address || !wallet) return\n try {\n setStatus('nonce')\n statusRef.current = 'nonce'\n const res = type == 'bind' ? await getWalletInitApi({address,type:\"BTC\"}) : await getWalletNonceApi({address,type:\"BTC\"});\n if (!isSuccess(res)) {\n throw new Error(res.message)\n }\n const nonce = res.code >= 0 ? res.data.nonce : null;\n if (nonce) {\n setStatus('signer')\n statusRef.current = 'signer'\n const message = \"By signing, you are proving you own this wallet and logging in. This does not initiate a transaction or cost any fees.Nonce:\" + res.data.nonce;\n const signedMessage = await wallet.signMessage(message);\n let obj: BindWalletParam = {\n type: 'BTC',\n address: address,\n signature: signedMessage,\n message: message,\n connector_type: 'BTC',\n wallet_client_type: wallet.walletKey\n }\n const res1 = type == 'bind' ? await toBindWalletApi(obj) : await loginByWalletApi(obj)\n if (res1) {\n if (!isSuccess(res1)) {\n throw new Error(res1.message)\n }\n matchlog.log(res1)\n setStatus('success')\n statusRef.current = 'success'\n if (type == 'bind') {\n events!.onBind && events!.onBind({\n type: 'btc'\n })\n eventManager.emit('onBind', {\n type: 'btc'\n })\n } else {\n await login({\n // mid: res1.data.mid,\n token: `${res1.data.token_type} ${res1.data.access_token}`\n })\n }\n onSuccess && onSuccess()\n }\n }\n } catch (error: any) {\n // toast.error(error.message)\n // disconnect()\n console.error('btc error',error)\n setStatus('error')\n setError(error.message)\n statusRef.current = ''\n }\n }\n\n useEffect(() => {\n if (wallet) {\n console.log('onConnect')\n try{\n onConnect()\n }catch(err:any){\n setStatus('error')\n setError(err.message)\n }\n } else {\n setStatus('')\n }\n }, [wallet]);\n\n useEffect(() => {\n if (address) {\n toLoginInWallet()\n }\n }, [address]);\n\n useEffect(() => {\n if (!props.isOpen) {\n disconnect()\n }\n }, [props.isOpen]);\n\n const onBack = ()=>{\n wallet&& wallet.disconnet &&wallet!.disconnet!()\n setStatus('')\n chooseWallet(null)\n statusRef.current = ''\n setError('')\n }\n\n return <ModalWithHeader {...props} title={props.title || (intl.formatMessage({\n id: type == \"bind\" ? \"bindWith\" : \"loginWith\"\n }, {\n name: \"BTC\"\n }))} onBack={wallet ? onBack: undefined}>\n {\n wallet ? <WalletModalContent error={error} setError={setError} status={status} disconnect={disconnect}\n address={address || ''} connected={connected} visible setVisible={() => {\n }}/> : <div className=\"matchid-login-box\">\n <div className=\"matchid-login-recommend-list\">\n {\n installedWallets.map(wallet => {\n return <RecommendItem\n key={wallet.walletKey}\n icon={iconMaps[wallet.walletKey as keyof typeof iconMaps]}\n name={wallet.name} onClick={() => {\n chooseWallet(wallet)\n }}/>\n })\n }\n {\n wallets.filter(wallet => !installedWallets.find(installedWallet => installedWallet.walletKey == wallet.walletKey)).map(wallet => {\n return <RecommendItem key={wallet.walletKey}\n icon={iconMaps[wallet.walletKey as keyof typeof iconMaps]}\n name={wallet.name} onClick={() => {\n }}\n footer={<Button size=\"sm\" onClick={() => {\n window.open(wallet.website)\n }}>Install</Button>}/>\n })\n }\n\n\n </div>\n </div>\n }\n </ModalWithHeader>\n}\n\nexport default function BTCModal(props: BTCConnectModalProps) {\n return props.isOpen && <BTCConnectModal {...props}/>\n}","import {BTCWalletAdapter} from \"../WalletAdapter\";\nimport {\n AddressPurpose,\n BitcoinNetworkType, Capability,\n getCapabilities,\n signMessage,\n request,\n} from \"sats-connect\";\nimport matchlog from \"../../utils/matchlog\";\n\nexport class XverseAdapter implements BTCWalletAdapter {\n name = \"Xverse Wallet\";\n website = \"https://www.xverse.app/\"\n capabilities: Set<Capability> | null = null;\n address = '';\n network = BitcoinNetworkType.Mainnet;\n walletKey = \"xverse\"\n\n async isInstalled() {\n return new Promise<boolean>(async (resolve) => {\n try {\n await getCapabilities({\n onFinish: (response: any) => {\n matchlog.log(response)\n this.capabilities = (new Set(response));\n resolve(true);\n },\n onCancel() {\n },\n payload: {\n network: {\n type: this.network\n },\n },\n });\n } catch (err) {\n matchlog.error(err)\n resolve(false);\n }\n\n\n });\n }\n\n async connect(): Promise<string> {\n if (!await this.isInstalled()) throw new Error(\"Xverse Wallet is not installed\");\n const response = await request('getAccounts', {\n purposes: [AddressPurpose.Ordinals],\n message: 'SATS Connect Demo',\n });\n matchlog.log(\"getAccounts ~ response:\", response)\n if (response.status === 'success') {\n const ordinalsAddressItem = response.result.find(\n (address) => address.purpose === AddressPurpose.Ordinals\n );\n this.address = ordinalsAddressItem?.address || '';\n return ordinalsAddressItem?.address || '';\n\n } else {\n if (response.error) {\n console.error(response.error)\n throw new Error(\"Error getting accounts. Check console for error logs\");\n }\n throw new Error(\"Error getting accounts\");\n }\n }\n\n async signMessage(message: string): Promise<string> {\n if (!await this.isInstalled()) throw new Error(\"Xverse Wallet is not installed\");\n return new Promise<string>(async (resolve, reject) => {\n await signMessage({\n payload: {\n network: {\n type: this.network,\n },\n address: this.address,\n message,\n },\n onFinish: (response) => {\n resolve(response);\n },\n onCancel: () => {\n reject(\"User cancelled\")\n }\n });\n\n });\n }\n\n async disconnet(): Promise<void> {\n if (!await this.isInstalled()) throw new Error(\"Xverse Wallet is not installed\");\n await request('wallet_disconnect', null);\n }\n}\n","import {BTCWalletAdapter} from \"../lib/WalletAdapter\";\nimport {UnisatAdapter} from \"../lib/btc/UnisatAdapter\";\nimport {XverseAdapter} from \"../lib/btc/XverseAdapter\";\nimport {LeatherAdapter} from \"../lib/btc/LeatherAdapter\";\nimport {useEffect, useState} from \"react\";\nimport {PhantomAdapter} from \"../lib/btc/PhantomAdapter\";\n\nexport const useBTCWallet = () => {\n\n const wallets: BTCWalletAdapter[] = [new UnisatAdapter(), new XverseAdapter(), new LeatherAdapter(),new PhantomAdapter()];\n const [installedWallets, setInstalledWallets] = useState<BTCWalletAdapter[]>([]);\n const [address, setAddress] = useState<string | null>(null);\n useEffect(() => {\n const getInstalled = async () => {\n const installed = await Promise.all(wallets.map(wallet => wallet.isInstalled().then(isInstalled => ({\n wallet,\n isInstalled\n }))));\n setInstalledWallets(installed.filter(({isInstalled}) => isInstalled).map(({wallet}) => wallet));\n };\n // console.log('getInstalled');\n getInstalled();\n }, []);\n\n const [wallet, chooseWallet] = useState<BTCWalletAdapter | null>(null);\n\n const onConnect = async () => {\n setAddress(await wallet!.connect());\n }\n useEffect(() => {\n\n if (!wallet) {\n setAddress(null)\n }\n }, [wallet]);\n\n return {\n installedWallets,\n wallets,\n chooseWallet,\n wallet,\n address,\n onConnect\n\n }\n\n}","import {ModalWithHeader} from \"../../ui/Modal\";\nimport React, {useMemo} from \"react\";\nimport {ModalWithHeaderProps, WalletType} from \"../../types\";\nimport {useIntl} from \"react-intl\";\nimport {DEFAULT_WALLET_METHODS, useWalletConfig, WALLET_METHODS} from \"../../hooks/useConfig\";\nimport {RecommendItem} from \"../LoginBox\";\nimport {useUserInfo} from \"../../hooks\";\nimport useAppConfig from \"../../hooks/useAppConfig\";\n\ntype WalletModalProps = ModalWithHeaderProps & {\n type?: 'login' | 'bind' | ''\n methods?: WalletType[]\n}\n\nfunction WalletConnectModal({\n type,\n methods: _methods,\n ...props\n }: WalletModalProps) {\n const intl = useIntl()\n const {walletMap} = useWalletConfig()\n const {bind, login} = useUserInfo()\n const config = useAppConfig()\n const methods = useMemo(() => {\n if (_methods) return _methods\n if (!config.platform) {\n return []\n }\n const platform = config.platform.map(p => p.toLowerCase())\n return WALLET_METHODS.filter(m => platform.includes(m))\n }, [config.platform, _methods])\n return <ModalWithHeader {...props} title={props.title || (intl.formatMessage({\n id: type == \"bind\" ? \"bindWith\" : \"loginWith\"\n }, {\n name: \"\"\n }))}>\n <div className=\"matchid-login-box\">\n <div className=\"matchid-login-recommend-list\">\n {\n methods.map((method, index) => {\n const m = walletMap[method]\n return <RecommendItem\n icon={m?.icon}\n name={m?.name}\n onClick={() => {\n type == 'bind' ? bind(method) : login(method)\n }\n }\n key={method}\n />\n })\n }\n </div>\n </div>\n </ModalWithHeader>\n}\n\nexport default function WalletModal(props: WalletModalProps) {\n return props.isOpen && <WalletConnectModal {...props}/>\n}","import {useEffect, useState} from \"react\";\n\nexport default function AlphaAvatar({name, size = 40, className = ''}: {\n name: string,\n size?: number,\n className?: string\n}) {\n const [avatar, setAvatar] = useState<string | undefined>(undefined)\n useEffect(() => {\n if (name) {\n const char = name[0].toUpperCase()\n // if (char.match(/[a-zA-Z]/)) {\n setAvatar(char)\n // }\n }\n }, [name])\n return <div className={`matchid-alpha-avatar ${className}`} style={{\n width: size,\n height: size,\n fontSize: Math.ceil(size / 2)\n }}>\n {avatar}\n </div>\n}","import {useMatchChain, useMatchWalletAssetList, useMatchWalletAssets} from \"hooks\";\nimport AlphaAvatar from \"../AlphaAvatar\";\nimport {NumberFormatter} from \"../../utils\";\nimport {useMatchWalletAssetsProps, WalletAssetMergeType} from \"../../types\";\n\nexport default function WalletAsset({\n onAssetClick,\n matchWalletAssetsOptions\n }: {\n onAssetClick?: (asset: WalletAssetMergeType) => () => void\n matchWalletAssetsOptions?: useMatchWalletAssetsProps\n}) {\n const walletAssets = useMatchWalletAssets(matchWalletAssetsOptions)\n const matchWalletAssetList = useMatchWalletAssetList({\n list: walletAssets.mergedAssets\n })\n const {list} = useMatchChain()\n return (\n <div className={\"matchid-wallet-asset-list\"}>\n {\n matchWalletAssetList.list.map((n, index) => {\n const clickFunc = onAssetClick && onAssetClick(n)\n const chain = list?.find((m) => m.id.toString() === n.chain_id)\n const getFooterColor = () => {\n if (!n.price_change_24h) {\n return ''\n }\n if (n.price_change_24h > 0) {\n return 'matchid-wallet-asset-up'\n }\n if (n.price_change_24h < 0) {\n return 'matchid-wallet-asset-down'\n }\n return ''\n }\n return <div className={`matchid-wallet-asset-item`} onClick={clickFunc} style={{\n cursor: clickFunc ? 'pointer' : 'default'\n }} key={index}>\n <div className={\"matchid-wallet-asset-logo\"} title={n.symbol || n.name || ''}>\n {n.icon ? <img src={n.icon} alt={n.symbol} className={`matchid-wallet-asset-icon`}/> :\n <AlphaAvatar className={`matchid-wallet-asset-icon`} size={40}\n name={n.symbol || n.name || ''}/>}\n {chain?.iconUrl &&\n <img src={chain.iconUrl} alt={chain.name} className={`matchid-wallet-asset-chain`}/>}\n </div>\n <div className={`matchid-wallet-asset-info`}>\n <div className={`matchid-wallet-asset-name`}>{n.symbol}</div>\n {\n ('price' in n) && <div className={`matchid-wallet-asset-content`}>\n <div className={\"matchid-wallet-asset-price\"}><NumberFormatter value={n.price}\n prefix={\"$ \"}\n tFixNum={2}/></div>\n\n <div className={\"matchid-wallet-asset-value\"}><NumberFormatter value={n.value}\n prefix={\"$ \"}\n tFixNum={2}/></div>\n </div>\n }\n\n <div className={`matchid-wallet-asset-footer`}>\n <div className={`matchid-wallet-asset-balance`}><NumberFormatter value={n.balance}\n tFixNum={3}/></div>\n {'price_change_24h' in n &&\n <div className={`matchid-wallet-asset-change ${getFooterColor()}`}><NumberFormatter\n prefix={`${(n?.price_change_24h || 0) < 0 ? '-' : '+'} `}\n value={Math.abs(n.price_change_24h || 0)} suffix={\"%\"} tFixNum={3}/></div>}\n\n </div>\n </div>\n </div>\n })\n }\n </div>\n )\n}","import {Address, WalletAssetMergeType} from \"types/types\";\nimport {AlphaAvatar, Button, ModalDrawer} from \"../../ui\";\nimport {useMatchChain, useWallet} from \"hooks\";\nimport {useEffect, useMemo, useState} from \"react\";\nimport {NumberFormatter} from \"../../utils\";\nimport {TransferIcon} from \"../../assets/icon\";\nimport {defineChain, encodeFunctionData, erc20Abi, http, parseUnits} from \"viem\";\nimport {NATIVE_TOKEN_ADDRESS} from \"../../config\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nfunction Input({\n onChange,\n placeholder,\n value,\n maxLength,\n type,\n error,\n size = \"df\"\n }: {\n onChange: (e: any) => void\n placeholder: string\n value: string\n maxLength: number\n type: string\n error: string\n size?: \"sm\" | \"df\"\n}) {\n return <div className={`matchid-token-input-box ${\"matchid-token-input-\" + size}`}>\n <input placeholder={placeholder} onChange={onChange} maxLength={maxLength} type={type} value={value}\n className={`matchid-token-input ${error ? 'matchid-token-input-error' : ''}`}/>\n {error && <div className={\"matchid-token-input-error-text\"}>{error}</div>}\n </div>\n}\n\nexport default function TokenSend({\n onClose,\n zIndex,\n token,\n onBack\n }: {\n onBack: () => void\n onClose: () => void\n zIndex: number\n token: WalletAssetMergeType\n}) {\n const {list: chainList} = useMatchChain()\n const intl = useIntl()\n const {createWalletClient} = useWallet()\n const isNative = token.address.toLowerCase() == NATIVE_TOKEN_ADDRESS\n const chain = useMemo(() => {\n return chainList?.find((m) => m.id.toString() === token.chain_id)\n }, [chainList, token.chain_id])\n const walletClient = useMemo(() => {\n return createWalletClient({\n // @ts-ignore\n chain: defineChain(chain),\n transport: http()\n })\n }, [chain])\n\n const [amount, setAmount] = useState('')\n const [address, setAddress] = useState('')\n const [loading, setLoading] = useState(false)\n const [sending, setSending] = useState(false)\n\n const [txError, setTxError] = useState('')\n const transaction = useMemo(() => {\n const reg = /^0x[a-fA-F0-9]{40}$/\n if(!amount || !address || !reg.test(address)){\n return\n }\n //@ts-ignore\n const viemChain = defineChain(chain)\n const to = isNative ? address as `0x${string}` : token.address\n const value = isNative ? parseUnits(amount, parseInt(token?.decimals || \"18\")) : BigInt(0)\n const data = isNative ? \"0x\" : encodeFunctionData({\n abi:erc20Abi,\n functionName: 'transfer',\n args: [address as Address, parseUnits(amount, parseInt(token?.decimals || \"18\"))]\n })\n return {\n to:to as `0x${string}`,\n value,\n data,\n chain: viemChain\n }\n }, [amount, address])\n const onCal = async () => {\n try {\n setLoading(true)\n // @ts-ignore\n await walletClient?.prepareTransactionRequest(transaction)\n } catch (error: any) {\n console.error(error)\n setTxError(error.details || error.message)\n } finally {\n setLoading(false)\n }\n }\n\n const error = useMemo(() => {\n setTxError('')\n let amountError = ''\n let addressError = ''\n\n if (amount) {\n if (parseFloat(amount) <= 0) {\n amountError = intl.formatMessage({\n id:\"tokenAmountMin\"\n })\n } else if ('balance' in token && parseFloat(amount) > (token.balance || 0)) {\n amountError = intl.formatMessage({\n id:\"tokenAmountMax\"\n })\n }\n }\n\n if (address) {\n if (address.length < 42) {\n addressError = intl.formatMessage({\n id:\"tokenAddressError\"\n })\n } else {\n const reg = /^0x[a-fA-F0-9]{40}$/\n if (!reg.test(address)) {\n addressError = intl.formatMessage({\n id:\"tokenAddressError\"\n })\n }\n }\n }\n if (amount && address && !amountError && !addressError && walletClient) {\n onCal()\n }\n\n return {\n amount: amountError,\n address: addressError,\n }\n }, [amount, token, chain, address,walletClient])\n\n const onChangeAmount = (e: any) => {\n const value = e.target.value\n if (value.match(/^\\d*\\.?\\d*$/)) {\n setAmount(value)\n }\n }\n\n const canSend = useMemo(() => {\n return !error.amount && !error.address && amount && address\n }, [error])\n\n const onNext = async () => {\n setSending(true)\n if(transaction){\n await walletClient?.sendTransaction(transaction)\n }\n onClose()\n\n }\n\n useEffect(() => {\n const receiveMessage = (event: any) => {\n if(event.data){\n if(event.data.source==\"match-wallet\"){\n if(event.data.method==\"sendTransaction\" && event.data.messageId==\"openIframe\"){\n onBack()\n setSending(false)\n }\n }\n }\n }\n window.addEventListener('message', receiveMessage)\n return () => {\n window.removeEventListener('message', receiveMessage)\n }\n }, []);\n return <ModalDrawer isOpen onClose={onClose} zIndex={zIndex} title={<FormattedMessage id={\"send\"}/>} onBack={onBack}>\n <div className={`matchid-token-send-box`}>\n <div className={\"matchid-token-send-content\"}>\n <div className={`matchid-token-amount-content`}>\n <div className={`matchid-token-amount-header`}>\n <div className={`matchid-token-amount-title`}><FormattedMessage id={\"amount\"}/></div>\n <div className={`matchid-token-amount-chain`}>\n {token.icon ? <img src={token?.icon} alt={token?.symbol}\n className={`matchid-token-amount-chain-icon`}/> :\n <AlphaAvatar name={token.symbol||token.name||''} size={16}/>}\n <span>{token?.symbol}</span>\n </div>\n </div>\n <Input\n type={\"text\"}\n onChange={onChangeAmount}\n placeholder={intl.formatMessage({\n id:\"amountPlaceholder\"\n })}\n value={amount}\n maxLength={40}\n error={error.amount || txError}\n />\n <div className={`matchid-token-amount-footer`}>\n <div className={`matchid-token-amount-title`}><FormattedMessage id={\"balance\"}/>:</div>\n <div className={`matchid-token-amount-value`}>\n <NumberFormatter value={token.balance} tFixNum={10} suffix={\" \" + token.symbol}/>\n </div>\n </div>\n <TransferIcon className={\"matchid-token-amount-transfer\"}/>\n </div>\n\n <div className={`matchid-token-address-content`}>\n <div className={`matchid-token-address-header`}>\n <div className={`matchid-token-address-title`}><FormattedMessage id={\"receiveTitle\"}/></div>\n </div>\n <Input\n type={\"text\"}\n size={\"sm\"}\n onChange={(e) => setAddress(e.target.value)}\n placeholder={intl.formatMessage({\n id:\"receivePlaceholder\"\n })}\n value={address}\n maxLength={42}\n error={error.address}\n />\n </div>\n </div>\n <Button size={\"lg\"} block highlight disabled={!canSend || !!txError} onClick={onNext}\n loading={loading||sending}><FormattedMessage id={\"next\"}/></Button>\n </div>\n </ModalDrawer>\n}","import {ModalDrawer} from \"../../ui\";\nimport {WalletAssetMergeType} from \"../../types\";\nimport {useMatchChain, useModal} from \"../../hooks\";\nimport {AlphaAvatar} from \"ui\";\nimport {Button} from \"../index\";\nimport TokenSend from \"../TokenSend\";\nimport {NATIVE_TOKEN_ADDRESS} from \"../../config\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport {NumberFormatter} from \"../../utils\";\n\nexport default function TokenDetail({\n onClose,\n token\n }:{\n onClose:()=>void\n token:WalletAssetMergeType\n}){\n const {list:chainList} = useMatchChain()\n const modal = useModal()\n const chain = chainList?.find((m)=>m.id.toString() === token.chain_id)\n const onSend = ()=>{\n modal.show((props)=>{\n return <TokenSend onClose={()=>{\n props.close()\n onClose()\n }} onBack={props.close} zIndex={props.zIndex} token={token}/>\n })\n }\n const intl = useIntl()\n return <ModalDrawer isOpen title={intl.formatMessage({\n id: \"tokenDetails\"\n })} onClose={onClose}>\n <div className={`matchid-token-detail`}>\n <div className={`matchid-token-main`}>\n <div className={`matchid-token-info`}>\n <div className={`matchid-token-logo`}>\n {token.icon ? <img src={token.icon} alt={token.symbol} className={`matchid-token-icon`}/> :\n <AlphaAvatar className={`matchid-token-icon`} size={48} name={token.symbol||token.name||''}/>}\n {chain?.iconUrl &&\n <img src={chain.iconUrl} alt={chain.name} className={`matchid-token-chain`}/>}\n </div>\n <div className={`matchid-token-name`}><NumberFormatter value={token.balance} tFixNum={10}/> {token.symbol}</div>\n </div>\n {token.address.toLowerCase()!=NATIVE_TOKEN_ADDRESS && <div className={`matchid-token-contract`}>\n <div className={\"matchid-token-contract-title\"}>Contract address</div>\n <div className={\"matchid-token-contract-address\"}>{token.address}</div>\n </div>}\n </div>\n <Button size={\"lg\"} block highlight onClick={onSend}><FormattedMessage id={\"send\"}/></Button>\n </div>\n </ModalDrawer>\n}","import {useMatchChain, useMatchWalletAssetList, useMatchWalletAssets, useModal} from \"hooks\";\nimport AlphaAvatar from \"../AlphaAvatar\";\nimport {NumberFormatter} from \"../../utils\";\nimport {WalletAssetMergeType} from \"../../types\";\nimport {Radio} from \"../../ui\";\nimport {useState} from \"react\";\nimport {Button} from \"../index\";\nimport TokenSend from \"../TokenSend\";\nimport {FormattedMessage} from \"react-intl\";\nimport {useDownMd} from \"../../hooks/useLayout\";\n\nexport default function TokenSendList({close}: {\n close: () => void\n}) {\n const isDownMd = useDownMd();\n const walletAssets = useMatchWalletAssets()\n const matchWalletAssetList = useMatchWalletAssetList({\n list: walletAssets.mergedAssets\n })\n const {list} = useMatchChain()\n const [checked, setChecked] = useState<WalletAssetMergeType | null>()\n const modal = useModal()\n const onNext = () => {\n checked && modal.show((props) => {\n return <TokenSend onClose={() => {\n props.close()\n close()\n }} onBack={props.close} zIndex={props.zIndex} token={checked}/>\n })\n }\n return (\n <div className={\"matchid-token-send-list-box\"}>\n <div className={\"matchid-token-send-list\"}>\n {\n matchWalletAssetList.list.map((n, index) => {\n const chain = list?.find((m) => m.id.toString() === n.chain_id)\n return <div\n className={`matchid-token-send-item ${checked?.address == n.address ? \"matchid-token-send-chekced\" : \"\"}`}\n onClick={() => {\n setChecked(n)\n }} key={index}>\n <Radio checked={checked?.address == n.address} size={isDownMd ? 18 : 24}/>\n <div className={\"matchid-token-send-content\"}>\n <div className={\"matchid-token-send-logo\"}>\n {n.icon ? <img src={n.icon} alt={n.symbol} className={`matchid-token-send-icon`}/> :\n <AlphaAvatar className={`matchid-token-send-icon`} size={isDownMd ? 28 :40}\n name={n.symbol || n.name || ''}/>}\n {chain?.iconUrl &&\n <img src={chain.iconUrl} alt={chain.name}\n className={`matchid-token-send-chain`}/>}\n </div>\n <div className={`matchid-token-send-info`}>\n <div className={`matchid-token-send-name`}>{n.symbol}</div>\n\n <div className={`matchid-token-send-balance`}>\n <NumberFormatter value={n.balance} tFixNum={3}/>\n </div>\n\n </div>\n </div>\n </div>\n })\n }\n </div>\n <Button size={\"lg\"} highlight block disabled={!checked} onClick={onNext}><FormattedMessage id={\"next\"}/></Button>\n </div>\n )\n}","import InfiniteScroll from \"react-infinite-scroll-component\";\nimport {useMatchWalletRecords, useWallet, useMatchChain, useReceipt} from \"../../hooks\";\nimport {Address, UserTransactionType} from \"../../types\";\nimport {ReactNode, useEffect, useMemo, useState} from \"react\";\nimport {ArrowSendIcon, CheckRoundIcon, InfoRoundIcon, LoadingIcon} from \"../../assets/icon\";\nimport {formatAddress, formatDate, NumberFormatter,} from \"../../utils\";\nimport {decodeFunctionData, defineChain, formatUnits} from \"viem\";\nimport {erc20Abi} from \"viem\";\nimport useContractStore from \"../../store/useContractStore\";\nimport {TransactionInfo} from \"../../store/useTransactionStore\";\nimport useHash from \"../../hooks/useHash\";\nimport {FormattedMessage} from \"react-intl\";\n\nconst Item = ({data}: { data: UserTransactionType | TransactionInfo }) => {\n const {address} = useWallet()\n const isOut = data.from.toLowerCase() == address.toLowerCase()\n\n const {chain, chainId, explorerLink, formatUnits: chainFormatUnits} = useMatchChain()\n const {contracts} = useContractStore()\n const [shouldRefetch,setShouldRefetch] = useState(true)\n\n // const receiptQuery = useReceipt({\n // chainId: chain?.id || 698,\n // hash: data.hash\n // })\n const transferType = useMemo(() => {\n const methodId = data.input.substring(2, 10)\n if (methodId == \"095ea7b3\") {\n return \"erc20_approve\"\n }\n if (methodId == \"a9059cbb\") {\n return \"erc20_transfer\"\n }\n return \"unknown\"\n }, [data.input])\n\n const to = useMemo(() => {\n if(!isOut){\n return data.from\n }\n if (transferType == \"erc20_transfer\") {\n const decodeData = decodeFunctionData({\n abi: erc20Abi,\n data: data.input,\n })\n return decodeData.args[0] as Address\n }\n return data.to\n }, [data.input, transferType, data.to,isOut])\n\n const amount = useMemo(() => {\n if (transferType == \"erc20_transfer\") {\n const decodeData = decodeFunctionData({\n abi: erc20Abi,\n data: data.input,\n })\n const value = decodeData.args[1] as bigint\n return formatUnits(value, contracts[`${chainId}-${data.to.toLowerCase()}`]?.decimals || 18)\n // return value.toString();\n }\n return chainFormatUnits(BigInt(data.value))\n }, [data.input, transferType, data.value, contracts, chainId, data.to])\n\n const hashQuery = useHash({\n hash:data.hash,\n //@ts-ignore\n chain:defineChain(chain),\n refetchInterval: shouldRefetch ? 3000 : false,\n enabled:shouldRefetch && data.source == 'local'\n })\n const status = useMemo(() => {\n if (data.source == 'matchain') {\n switch (data.extra.status) {\n case \"ok\":\n return \"success\"\n case \"error\":\n return \"error\"\n }\n\n } else if(data.source=='auto') {\n if (data.extra.receipt_status == 1) {\n return \"success\"\n } else {\n return \"error\"\n }\n }else {\n if(hashQuery.data==1){\n return 'success'\n }\n if(hashQuery.data==-1){\n return 'error'\n }\n if(Date.now()/1000-parseInt(data.timestamp)>3600){\n return 'error'\n }\n }\n\n return 'loading'\n }, [data.extra?.status, data.source,hashQuery.data])\n\n useEffect(() => {\n if(data.hash){\n setShouldRefetch(status=='loading')\n }\n }, [status,data.hash]);\n\n const symbol = useMemo(() => {\n if (transferType == \"erc20_transfer\") {\n const contract = contracts[`${chainId}-${data.to.toLowerCase()}`]\n return contract?.symbol || contract?.name || \"unknown\"\n }\n return chain?.nativeCurrency.symbol || chain?.nativeCurrency.name\n }, [transferType, chain, contracts, chainId, data.to])\n\n\n return <a\n href={explorerLink(`tx/${data.hash}`)}\n target=\"_blank\"\n className={`matchid-transaction-item`}\n >\n <div className={`matchid-transacton-item-container`}>\n <div className={\"matchid-transaction-item-icon\"}>\n <ArrowSendIcon className={!isOut ? \"rotate-180\" : \"\"}/>\n </div>\n <div className={`matchid-transaction-item-details`}>\n <div className={`matchid-transaction-item-address`}>\n {formatAddress(to, 6, 4)}\n </div>\n <div\n className={`matchid-transaction-item-timestamp`}>{formatDate(data.timestamp, 'MM/DD HH:mm:ss')}</div>\n </div>\n </div>\n <div className={`matchid-transaction-item-amount ${'matchid-transaction-item-' + status}`}>\n <NumberFormatter value={amount} tFixNum={6} prefix={isOut ? '-' : '+'} suffix={\" \" + symbol}/>\n\n {status == 'loading' && <LoadingIcon color=\"#000000\" size={16} rotate/>}\n {status == 'success' && <CheckRoundIcon size={16}/>}\n {status == 'error' && <InfoRoundIcon size={16}/>}\n\n </div>\n </a>\n}\n\nexport default function TransactionList({\n scrollableTarget\n }: {\n scrollableTarget?: ReactNode;\n}) {\n const {fetchMoreData, hasMore, items} = useMatchWalletRecords()\n\n return (\n <InfiniteScroll\n scrollableTarget={scrollableTarget}\n dataLength={items.length}\n next={fetchMoreData}\n hasMore={hasMore}\n loader={<div className={\"matchid-list-nomore\"}><LoadingIcon rotate size={16} color={\"black\"}/>Loading...\n </div>}\n endMessage={\n items.length > 0 ?\n <div className={`matchid-list-nomore`}><FormattedMessage id={\"noMoreRecords\"}/></div> :\n <div className={`matchid-list-nomore`}><FormattedMessage id={\"noRecords\"}/></div>\n }\n >\n {\n items.length == 0 && !hasMore ?\n <div className={\"mt-[150px]\"}/> :\n <div className={`matchid-transaction-list`}>\n {\n items.map((item, index) => <Item data={item} key={index}/>)\n }\n </div>\n }\n </InfiniteScroll>\n )\n}","import { create } from 'zustand';\nimport { devtools, persist } from 'zustand/middleware';\nexport interface ContractInfo {\n symbol?: string;\n decimals?: number;\n name?:string\n}\n\ninterface ContractStore {\n contracts: Record<string, ContractInfo>;\n\n getContract: (chainId: number, contractAddress: string) => ContractInfo | undefined;\n\n setContractSymbol: (chainId: number, contractAddress: string, symbol: string) => void;\n\n setContractDecimals: (chainId: number, contractAddress: string, decimals: number) => void;\n\n setContractName: (chainId: number, contractAddress: string, name: string) => void;\n\n setContracts: (data: { chainId: number; contractAddress: string; info: ContractInfo }[]) => void;\n}\n\nconst persistedState = persist<ContractStore>(\n (set, get) => ({\n contracts: {},\n\n getContract: (chainId, contractAddress) => {\n const key = `${chainId}-${contractAddress.toLowerCase()}`;\n return get().contracts[key];\n },\n\n setContractName: (chainId, contractAddress, name) => {\n const key = `${chainId}-${contractAddress.toLowerCase()}`;\n set((state) => {\n const updatedContracts = {\n ...state.contracts,\n [key]: { ...state.contracts[key], name },\n };\n return { contracts: updatedContracts };\n });\n },\n\n setContractSymbol: (chainId, contractAddress, symbol) => {\n const key = `${chainId}-${contractAddress.toLowerCase()}`;\n set((state) => {\n const updatedContracts = {\n ...state.contracts,\n [key]: { ...state.contracts[key], symbol },\n };\n return { contracts: updatedContracts };\n });\n },\n\n setContractDecimals: (chainId, contractAddress, decimals) => {\n const key = `${chainId}-${contractAddress.toLowerCase()}`;\n set((state) => {\n const updatedContracts = {\n ...state.contracts,\n [key]: { ...state.contracts[key], decimals },\n };\n return { contracts: updatedContracts };\n });\n },\n\n setContracts: (data) => {\n set((state) => {\n const newContracts = { ...state.contracts };\n data.forEach(({ chainId, contractAddress, info }) => {\n const key = `${chainId}-${contractAddress.toLowerCase()}`;\n newContracts[key] = { ...newContracts[key], ...info };\n });\n return { contracts: newContracts };\n });\n },\n }),\n { name: 'match-contract-local' }\n);\n\nconst useContractStore = create(devtools(persistedState));\n\nexport default useContractStore;\n","import {useQuery} from \"@tanstack/react-query\";\nimport {Chain, createPublicClient, http} from \"viem\";\nimport matchlog from \"../utils/matchlog\";\n\nexport default function useHash({\n hash,\n chain,\n refetchInterval,\n enabled=true\n }:{\n hash?: `0x${string}` | null,\n chain?: Chain | null,\n refetchInterval?:false|number\n enabled?:boolean\n}){\n return useQuery(\n {\n queryKey: ['txhash', hash, chain],\n queryFn: async () => {\n if (!chain || !hash) return false\n const publicClient = createPublicClient({\n chain,\n transport: http(),\n });\n try {\n const receipt = await publicClient.getTransactionReceipt({hash});\n\n if (!receipt) {\n return 0\n }\n matchlog.log('getTransactionReceipt', receipt)\n if (receipt.status === 'success') {\n return 1\n }\n return -1\n\n } catch (error) {\n console.error('getTransactionReceiptError', error)\n }\n return -99\n },\n enabled: !!chain && !!hash && enabled,\n refetchInterval,\n // refetchIntervalInBackground: false\n }\n );\n}","import {useDownMd} from \"hooks/useLayout\";\nimport {ModalWithHeader} from \"../Modal\";\nimport Drawer from \"../Drawer\";\nimport {WalletPanelProps} from \"../../types\";\n\nexport default function ModalDrawer({\n title,\n drawerTitleVisible=true,\n ...props}:WalletPanelProps){\n\n const isDownMd = useDownMd()\n if(isDownMd){\n return <ModalWithHeader {...props} title={title}/>\n }\n return <Drawer {...props} title={drawerTitleVisible ? title : null}/>\n}","import {UIProps} from \"../../types\";\nimport {LoadingIcon} from \"../../assets/icon\";\n\nexport default function Switch({\n size=\"default\",\n checked=false,\n loading=false,\n onChange,\n className,\n disabled=false,\n ...props\n }:{\n size?:\"default\"|\"sm\",\n checked?:boolean,\n loading?:boolean,\n disabled?:boolean,\n onChange?:(checked:boolean)=>void,\n}&UIProps){\n const onClick = ()=>{\n if(!disabled && !loading){\n onChange && onChange(!checked)\n }\n }\n return <div onClick={onClick} className={`matchid-switch matchid-switch-${size} ${checked ? \"matchid-switch-checked\":\"\"} ${disabled ? \"matchid-switch-disabled\":\"\"} ${loading ? \"matchid-switch-loading\":\"\"}`} {...props}>\n\n {\n loading ?\n <LoadingIcon className=\"matchid-switch-loading-icon\" size={size==\"default\"?24:18} color=\"var(--matchid-swicth-loading-color)\"/> :\n <div className={\"matchid-switch-ball\"}></div>\n }\n </div>\n}","import { useMemo} from \"react\";\nimport {UIProps} from \"../../types\";\n\nexport default function AlphaAvatar({\n name,\n size = \"default\", className = '',style}: {\n name: string,\n size?: number|\"sm\"|\"default\"|\"lg\",\n}&UIProps) {\n\n const avatar = useMemo(()=>{\n if (name) {\n const char = name[0].toUpperCase()\n if (char.match(/[a-zA-Z0-9]/)) {\n return char\n }\n }\n return ''\n },[name])\n\n const numberSize = typeof size === 'number' ? size : size === 'sm' ? 24 : size === 'default' ? 40 : 64\n return <div className={`matchid-alpha-avatar ${className}`} style={{\n width: numberSize,\n height: numberSize,\n fontSize: Math.ceil(numberSize / 2),\n ...style\n }}>\n {avatar}\n </div>\n}","import {CSSProperties} from \"react\";\n\nexport default function Radio({\n checked = false,\n onChange,\n size = 24,\n color = \"#FC802D\",\n className = \"\",\n style = {}\n }: {\n checked?: boolean,\n onChange?: () => void\n size?: number,\n color?: string,\n className?: string,\n style?: CSSProperties\n}) {\n return <div onClick={onChange} className={`matchid-radio ${className} ${checked ? 'matchid-radio-checked' :''}`} style={{\n width: size,\n height: size,\n ...style,\n // @ts-ignore\n '--matchid-radio-checked': color\n }}>\n {checked && <div className={`matchid-radio-content`} style={{\n width:Math.floor(size*0.7),\n height:Math.floor(size*0.7),\n }}></div>}\n </div>\n}","import React from \"react\";\n\ninterface SkeletonProps {\n style?: React.CSSProperties;\n className?: string;\n width?: string | number;\n height?: string | number;\n radius?: string | number;\n loading?: boolean;\n children?: React.ReactNode;\n}\n\nconst Skeleton: React.FC<SkeletonProps> = ({\n style={},\n className=\"\",\n width = 40,\n height = 40,\n radius = 5,\n loading = true,\n children,\n }) => {\n if (!loading) {\n return <>{children}</>;\n }\n\n const skeletonStyle: React.CSSProperties = {\n width,\n height,\n borderRadius: radius,\n ...style,\n };\n\n return (\n <div\n className={\"matchid-skeleton \"+className}\n style={skeletonStyle}\n ></div>\n );\n};\n\nexport default Skeleton;","type TabsProps = {\n tabs: string[]\n activeTab: number\n setActiveTab: (tab: number) => void\n}\nexport default function Tabs(props:TabsProps){\n\n return <div className={`matchid-tabs`}>\n {props.tabs.map((tab, index) => {\n return <div key={index} onClick={() => props.setActiveTab(index)} className={`matchid-tab ${props.activeTab === index ? \"matchid-tab-active\" : \"\"}`}>\n {tab}\n </div>\n })}\n\n </div>\n}","import { useEffect, useState } from \"react\";\nimport {LottieComponentProps, useLottie} from \"lottie-react\";\n\nconst LazyLottie = (props: {\n animationData: any;\n style?: React.CSSProperties;\n}) => {\n const options = {\n animationData: props.animationData,\n loop: true,\n autoplay: true,\n };\n\n const { View } = useLottie(options, props.style);\n\n return View;\n};\n\nexport default LazyLottie;","import {CheckboxCheckedIcon,CheckboxIcon} from \"../../assets/icon\";\n\nexport default function Checkbox({\n checked=false,\n onChange\n }:{\n checked?:boolean,\n onChange?:(checked:boolean)=>void\n}){\n return checked ? <CheckboxCheckedIcon onClick={()=>onChange?.(false)}/> : <CheckboxIcon onClick={()=>onChange?.(true)}/>\n}","import {create} from 'zustand';\nimport {devtools, persist} from 'zustand/middleware';\nimport {Address, AnyObject, Hash} from \"../types\";\n\nexport interface TransactionInfo {\n from: Address;\n hash: Hash;\n input: Hash;\n timestamp: string;\n to: Address;\n value: string;\n source:\"local\"\n extra?:AnyObject\n}\n\ninterface TransactionStore {\n transactions: Record<string, TransactionInfo[]>;\n\n\n addTransaction: (data: { chainId: number;address:Address; hash: string; info: TransactionInfo }) => void;\n\n removeTransaction: (data: { chainId: number;address:Address; hash: string }) => void;\n}\n\nconst persistedState = persist<TransactionStore>(\n (set, get) => ({\n transactions: {},\n\n addTransaction: (data) => {\n set((state) => {\n const updatedTransactions = {\n ...state.transactions,\n [`${data.chainId}-${data.address}`]: [data.info,...(state.transactions[`${data.chainId}-${data.address}`] || [])],\n };\n return {transactions: updatedTransactions};\n });\n },\n removeTransaction: (data) => {\n set((state) => {\n const updatedTransactions = {\n ...state.transactions,\n [`${data.chainId}-${data.address}`]: (state.transactions[`${data.chainId}-${data.address}`] || [])\n .filter((tx) => tx.hash !== data.hash)\n };\n return {transactions: updatedTransactions};\n });\n },\n }),\n {name: 'match-transactions-local'}\n);\n\nconst useTransactionStore = create(devtools(persistedState));\n\nexport default useTransactionStore;\n","import copy from 'copy-to-clipboard'\nimport { useCallback, useEffect, useState } from 'react'\n\nexport default function useCopyClipboard(timeout = 500): [boolean, (toCopy: string) => void] {\n const [isCopied, setIsCopied] = useState(false)\n\n const staticCopy = useCallback((text: string) => {\n const didCopy = copy(text)\n setIsCopied(didCopy)\n }, [])\n\n useEffect(() => {\n if (isCopied) {\n const hide = setTimeout(() => {\n setIsCopied(false)\n }, timeout)\n\n return () => {\n clearTimeout(hide)\n }\n }\n return undefined\n }, [isCopied, setIsCopied, timeout])\n\n return [isCopied, staticCopy]\n}\n","import { useState, useCallback, createContext, useContext, ReactNode, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {CheckRoundIcon, ErrorRoundIcon} from \"assets/icon\";\n\ninterface ToastContextType {\n show: (options: { icon?: ReactNode; timeout?: number; text: ReactNode }) => void;\n success: (text: ReactNode, timeout?: number) => void;\n error: (text: ReactNode, timeout?: number) => void;\n}\n\nconst ToastContext = createContext<ToastContextType | null>(null);\n\nexport function ToastProvider({ children,zIndex=299 }: { children: ReactNode,zIndex?:number }) {\n const [toasts, setToasts] = useState<{ id: number; icon?: ReactNode; text: ReactNode }[]>([]);\n\n const removeToast = useCallback((id: number) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const show = useCallback(({ icon, timeout = 3000, text }: { icon?: ReactNode; timeout?: number; text: ReactNode }) => {\n const id = Date.now()+Math.random();\n setToasts((prev) => [...prev, { id, icon, text }]);\n setTimeout(() => removeToast(id), timeout);\n }, [removeToast]);\n\n const success = useCallback((text: ReactNode, timeout?: number) => {\n show({ icon: <CheckRoundIcon color={\"#2FCC00\"} size={24}/>, text, timeout });\n }, [show]);\n\n const error = useCallback((text: ReactNode, timeout?: number) => {\n show({ icon: <ErrorRoundIcon size={24}/>, text, timeout });\n }, [show]);\n\n const ToastComponent = createPortal(\n <div className=\"matchid-toast-box\" style={{\n zIndex\n }}>\n {toasts.reverse().map(({ id, icon, text }) => (\n <div\n key={id}\n className=\"matchid-toast\"\n >\n {icon && <span>{icon}</span>}\n <span>{text}</span>\n </div>\n ))}\n </div>,\n document.body\n );\n\n return (\n <ToastContext.Provider value={{ show, success, error }}>\n {children}\n {ToastComponent}\n </ToastContext.Provider>\n );\n}\n\nexport function useToast(): ToastContextType {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\");\n }\n return context;\n}\n","import {useQuery} from \"@tanstack/react-query\";\nimport {\n getUserChainListApi,\n getUserImportTokenListApi,\n getUserWalletAssetApi, getWalletAssetListApi, getWalletChainListApi, getWalletNftListApi,\n} from \"../../api\";\nimport {isSuccess} from \"../../api/request\";\nimport type {UseQueryOptions} from \"@tanstack/react-query/src/types\";\nimport {\n UserAssetToken,\n UserChainType,\n UserImportTokenType,\n UserTransactionType, WalletAssetType,\n WalletChainType,\n WalletNFTType\n} from \"../../types\";\nimport useUserInfo from \"../useUserInfo\";\n\nexport {userImportTokenApi, getUserWalletTransactionsApi, getWalletAssetListApi, getWalletListApi} from \"../../api\"\n\nexport function useChainListQuery(options?: Partial<Omit<UseQueryOptions<UserChainType[]>, 'queryKey' | 'queryFn'>>) {\n const {isLogin, token} = useUserInfo()\n return useQuery({\n queryKey: [\"match-user-chain-list\", token],\n queryFn: async () => {\n const res = await getUserChainListApi()\n if (!isSuccess(res)) {\n return []\n }\n return res.data\n },\n enabled: isLogin,\n ...options\n })\n\n}\n\n\nexport function useAssetListQuery({\n chainId,\n ...options\n }: {\n chainId: number\n} & Partial<Omit<UseQueryOptions<UserAssetToken[]>, 'queryKey' | 'queryFn'>>) {\n const {isLogin, token} = useUserInfo()\n return useQuery({\n queryKey: [\"match-user-asset-list\", token, chainId],\n queryFn: async () => {\n const res = await getUserWalletAssetApi({chain_id: chainId.toString()})\n if (!isSuccess(res)) {\n return []\n }\n return res.data || []\n },\n enabled: isLogin,\n ...options\n })\n}\nexport const USER_IMPORT_TOKEN_LIST_KEY = \"match-user-import-token-list\"\nexport function useImportTokenListQuery({\n chainId,\n ...options\n }: {\n chainId: number\n} & Partial<Omit<UseQueryOptions<UserImportTokenType[]>, 'queryKey' | 'queryFn'>>) {\n const {isLogin, token} = useUserInfo()\n return useQuery({\n queryKey: [USER_IMPORT_TOKEN_LIST_KEY, token, chainId],\n queryFn: async () => {\n const res = await getUserImportTokenListApi({chain_id: chainId.toString()})\n if (!isSuccess(res)) {\n return []\n }\n return res.data || []\n },\n enabled: isLogin,\n ...options\n })\n}\n\nexport function useWalletChainListQuery(options?: Partial<Omit<UseQueryOptions<WalletChainType[]>, 'queryKey' | 'queryFn'>>) {\n const {isLogin, token} = useUserInfo()\n return useQuery({\n queryKey: [\"match-wallet-chain-list\", token],\n queryFn: async () => {\n const res = await getWalletChainListApi()\n if (!isSuccess(res)) {\n return []\n }\n return res.data\n },\n enabled: isLogin,\n ...options\n })\n\n}\n\nexport function useWalletNftListQuery({\n chainId,\n address,\n ...options\n }: {\n chainId: string,\n address: string\n} & Partial<Omit<UseQueryOptions<WalletNFTType[]>, 'queryKey' | 'queryFn'>>) {\n const {isLogin, token} = useUserInfo()\n return useQuery({\n queryKey: [\"match-wallet-nft-list\", token, chainId, address],\n queryFn: async () => {\n const res = await getWalletNftListApi({\n chain_id: chainId.toString(),\n address\n })\n if (!isSuccess(res)) {\n return []\n }\n return res.data\n },\n enabled: isLogin,\n ...options\n })\n\n}\n\nexport function useWalletAssetListQuery({\n chainId,\n address,\n ...options\n }: {\n chainId: string,\n address: string\n} & Partial<Omit<UseQueryOptions<{\n asset_list:WalletAssetType[]\n asset_total_balance:string\n}|null>, 'queryKey' | 'queryFn'>>) {\n const {isLogin, token} = useUserInfo()\n return useQuery({\n queryKey: [\"match-wallet-asset-list\", token, chainId, address],\n queryFn: async () => {\n const res = await getWalletAssetListApi({\n chain_id: chainId,\n address\n })\n if (!isSuccess(res)) {\n return null\n }\n return res.data\n },\n enabled: isLogin,\n ...options\n })\n\n}","import {useChainListQuery} from \"./api/wallet\";\nimport useLocalStore from \"../store/useLocalStore\";\nimport {useMemo, useState} from \"react\";\nimport {useModal} from \"../context/ModalContext\";\nimport {Button, Radio} from \"../ui\";\nimport {createPublicClient, formatUnits, http, parseUnits} from \"viem\";\nimport {useDownMd} from \"./useLayout\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nexport default function useMatchChain() {\n const chainListQuery = useChainListQuery()\n const modal = useModal()\n const intl = useIntl()\n const {chainId: storeChainId, setChainId} = useLocalStore()\n const chainId = useMemo(() => {\n if (!chainListQuery.data || !chainListQuery.data.length) {\n return null\n }\n if (chainListQuery.data.find((item) => item.id === storeChainId)) {\n return storeChainId\n }\n return chainListQuery.data[0].id\n }, [storeChainId, chainListQuery.data])\n\n const chain = useMemo(() => {\n if (!chainListQuery.data || !chainListQuery.data.length) {\n return null\n }\n return chainListQuery.data.find((item) => item.id === chainId)\n }, [chainId, chainListQuery.data])\n\n const explorerLink = (url: string) => {\n const explorer = chain?.blockExplorers.default.url as string\n return explorer.lastIndexOf('/') === explorer.length - 1 ? explorer + url : explorer + '/' + url\n }\n\n function ChangeNetwork({\n close,\n }: {\n close: () => void\n }) {\n const {chainId: storeChainId, setChainId} = useLocalStore()\n const [selectedChainId, setSelectedChainId] = useState(storeChainId)\n const isDownMd = useDownMd()\n return <div className={`matchid-change-network-box`}>\n <div className={`matchid-change-network-list`}>\n {\n chainListQuery.data?.map((item, index) => {\n return <div key={index} onClick={() => setSelectedChainId(item.id)}\n className={`matchid-change-network-item ${selectedChainId == item.id ? 'matchid-change-network-selected' : ''}`}>\n <div className={`matchid-change-network-item-content`}>\n <img src={item.iconUrl} className={`matchid-change-network-item-icon`}/>\n <span className={\"matchid-change-network-item-name\"}>{item.name}</span>\n </div>\n <Radio checked={selectedChainId === item.id} size={isDownMd ? 18 :24}/>\n </div>\n })\n }\n </div>\n <Button size={\"lg\"} highlight onClick={() => {\n setChainId(selectedChainId || 0)\n close()\n }} block><FormattedMessage id={\"confirm\"}/></Button>\n </div>\n }\n\n const showChangeNetwork = () => {\n modal.open({\n title: intl.formatMessage({id: 'changeNetwork'}),\n content: ChangeNetwork\n })\n }\n\n const publicClient = useMemo(() => {\n if (!chain) {\n return null\n }\n return createPublicClient({\n chain,\n transport:http()\n })\n }, [chain])\n\n return {\n list: chainListQuery.data,\n chainId,\n setChainId,\n chain,\n explorerLink,\n showChangeNetwork,\n publicClient,\n formatUnits: (value: bigint) => {\n return formatUnits(value, chain?.nativeCurrency.decimals || 18)\n },\n parseUnits: (value: string) => {\n return parseUnits(value, chain?.nativeCurrency.decimals || 18)\n }\n }\n}","import {useModal} from \"../context/ModalContext\";\nimport {useCopyClipboard, useMatchChain, useToast, useUserInfo, useWallet} from \"./index\";\nimport {Button, TokenSendList} from \"components\";\nimport {QRCode} from \"react-qrcode\";\nimport {useEffect, useMemo, useRef, useState} from \"react\";\nimport {\n Address,\n useMatchWalletAssetsProps,\n UserAssetToken,\n UserImportTokenType, UserTransactionNextPageParams, UserTransactionRecordType,\n UserTransactionType,\n WalletAssetMergeType\n} from \"../types\";\nimport {getUserWalletTransactionsApi, userImportTokenApi} from \"../api\";\nimport {isSuccess} from \"../api/request\";\nimport {Field, Input} from \"../ui\";\nimport {Abi} from \"abitype\";\nimport {useAssetListQuery, useImportTokenListQuery, USER_IMPORT_TOKEN_LIST_KEY} from \"./api/wallet\";\nimport {useQuery, useQueryClient} from \"@tanstack/react-query\";\nimport {NATIVE_TOKEN_ADDRESS} from \"../config\";\nimport {erc20Abi, formatUnits} from \"viem\";\nimport useLocalStore from \"../store/useLocalStore\";\nimport useContractStore, {ContractInfo} from \"../store/useContractStore\";\nimport useTransactionStore from \"../store/useTransactionStore\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport ImportToken from \"../components/ImportToken\";\n\nconst ReceiveModal = () => {\n const chain = useMatchChain()\n const {address} = useWallet();\n const [copied, setCopied] = useCopyClipboard();\n const toast = useToast()\n const intl = useIntl()\n\n const onCopy = () => {\n setCopied(address)\n toast.success(intl.formatMessage({\n id: \"copied\"\n }))\n }\n\n const chainLink = chain.explorerLink(\"address/\" + address)\n return <div className={`matchid-receive-modal`}>\n <div className={\"matchid-receive-container\"}>\n <div className={`matchid-receive-text`}><FormattedMessage id={\"receiveQrcode\"}/></div>\n <div className={`matchid-qr-container`}>\n <QRCode margin=\"0\"\n className={`matchid-qr-code`}\n value={address}/>\n </div>\n <a href={chainLink} target=\"_blank\"\n className={`matchid-receive-link`}>\n {address}\n </a>\n </div>\n <Button size={\"lg\"} onClick={onCopy} block highlight disabled={copied}><FormattedMessage\n id={\"copyAddress\"}/></Button>\n </div>\n\n}\nexport default function useMatchWallet() {\n const modal = useModal()\n const intl = useIntl()\n const showReceiveModal = () => {\n modal.open({\n title: intl.formatMessage({\n id: \"receive\"\n }),\n content: ReceiveModal\n })\n }\n\n const showImportTokenModal = () => {\n modal.open({\n title: intl.formatMessage({\n id: \"customizedToken\"\n }),\n content: ImportToken\n })\n }\n\n const showSendListModal = () => {\n modal.open({\n title: intl.formatMessage({\n id: \"send\"\n }),\n content: TokenSendList\n })\n }\n\n return {\n showReceiveModal,\n showImportTokenModal,\n showSendListModal\n }\n}\n\nexport function useMatchWalletRecords() {\n const [hasMore, setHasMore] = useState(true);\n const [items, setItems] = useState<UserTransactionType[]>([])\n const {chainId, publicClient} = useMatchChain()\n const {address} = useWallet()\n const hasMoreRef = useRef(hasMore)\n const nextPageParamsRef = useRef<UserTransactionNextPageParams | undefined>(undefined)\n const {contracts, setContracts} = useContractStore()\n\n const fetchMoreData = async () => {\n const chainIdStr = chainId ? chainId.toString() : \"\"\n\n if (!hasMoreRef.current || !chainIdStr) {\n return\n }\n const res = await getUserWalletTransactionsApi({\n chain_id: chainIdStr,\n ...nextPageParamsRef.current,\n })\n if (isSuccess(res)) {\n if (res.data && res.data.transactions && res.data.transactions.length > 0) {\n setItems(items.concat(res.data.transactions || []));\n }\n hasMoreRef.current = res.data && res.data.transactions && res.data.transactions.length >= 50\n setHasMore(hasMoreRef.current)\n nextPageParamsRef.current = res.data?.next_page_params\n }\n };\n const onInit = async () => {\n nextPageParamsRef.current = undefined\n setItems([])\n setHasMore(true)\n hasMoreRef.current = true\n fetchMoreData()\n }\n useEffect(() => {\n if (chainId && address) {\n onInit()\n }\n }, [chainId, address]);\n\n const {transactions, removeTransaction} = useTransactionStore()\n const getContractInfoList = async(contractList:string[])=>{\n const contractUnique = Array.from(new Set(contractList)).filter(item => {\n const contract = contracts[`${chainId}-${item.toLowerCase()}`]\n if (!contract) {\n return true\n }\n if (!contract.symbol && !contract.name) {\n return true\n }\n if (!contract.decimals) {\n return true\n }\n return false\n })\n const calls = []\n for (const contract of contractUnique) {\n calls.push({\n address: contract as `0x${string}`,\n abi: erc20Abi,\n functionName: \"symbol\",\n args: []\n })\n calls.push({\n address: contract as `0x${string}`,\n abi: erc20Abi,\n functionName: \"decimals\",\n args: []\n })\n }\n const results = await publicClient?.multicall({contracts: calls});\n if (results) {\n console.log('contract results', calls, results)\n const contractMap = []\n for (let i = 0; i < contractUnique.length; i++) {\n const info: ContractInfo = {}\n if (results[i * 2].status == 'success') {\n info.symbol = results[i * 2].result as string\n }\n if (results[i * 2 + 1].status == 'success') {\n info.decimals = results[i * 2 + 1].result as number\n }\n // if(results[i * 3 + 2].status == 'success'){\n // info.name = results[i * 3 + 2].result as string\n // }\n\n contractMap.push({\n chainId: chainId || 0,\n contractAddress: contractUnique[i],\n info\n })\n }\n setContracts(contractMap)\n }\n }\n const list = useMemo(() => {\n const localTransactions = transactions[`${chainId}-${address}`] || []\n const removeList = localTransactions.filter(n => items.findIndex(m => m.hash == n.hash) >= 0);\n removeList.forEach(item => {\n removeTransaction({\n chainId: chainId || 0,\n hash: item.hash,\n address: address as Address\n })\n })\n const saveList = localTransactions.filter(n => items.findIndex(m => m.hash == n.hash) < 0);\n const list = [\n ...saveList,\n ...items\n ].sort((a, b) => {\n const btimestamp = typeof b.timestamp === 'string' ? parseInt(b.timestamp) : b.timestamp\n const atimestamp = typeof a.timestamp === 'string' ? parseInt(a.timestamp) : a.timestamp\n return btimestamp - atimestamp\n })\n const contractList = list.filter(item => item.input.toLowerCase().substring(0, 10) == '0xa9059cbb')\n .map(item => item.to)\n getContractInfoList(contractList)\n return list\n }, [transactions, chainId, items, address])\n\n\n return {\n items: list,\n fetchMoreData,\n hasMore\n }\n}\n\n\nexport function useMatchWalletAssets({\n importTokenOptions,\n assetListOptions\n }: useMatchWalletAssetsProps = {}) {\n const {chainId, chain} = useMatchChain();\n\n\n const importTokenQuery = useImportTokenListQuery({\n chainId: chainId || 0,\n ...importTokenOptions\n });\n\n const assetListQuery = useAssetListQuery({\n chainId: chainId || 0,\n ...assetListOptions\n });\n\n const mergedAssets = useMemo(() => {\n if (!assetListQuery.data && !importTokenQuery.data) return [];\n\n const assetList = (assetListQuery.data || []).map(asset => ({\n ...asset,\n isAuto: true\n }));\n\n const importTokens = (importTokenQuery.data || []).map(token => ({\n ...token,\n isCustom: true\n }));\n\n const assetMap = new Map();\n assetList.forEach(asset => {\n const key = `${asset.chain_id}-${asset.address.toLowerCase()}`;\n assetMap.set(key, asset);\n });\n\n importTokens.forEach(token => {\n const key = `${token.chain_id}-${token.address.toLowerCase()}`;\n if (assetMap.has(key)) {\n const existing = assetMap.get(key);\n assetMap.set(key, {\n ...existing,\n symbol: token.symbol,\n decimals: token.decimals,\n isCustom: true,\n isAuto: existing.isAuto ?? false\n });\n } else {\n assetMap.set(key, token);\n }\n });\n\n const list = Array.from(assetMap.values()).sort((a, b) => {\n return (b.isAuto ? 1 : 0) - (a.isAuto ? 1 : 0);\n });\n //check native token exist\n const nativeToken = list.find(asset => asset.address.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase());\n if (!nativeToken) {\n list.unshift({\n chain_id: chain?.id.toString() || '',\n address: NATIVE_TOKEN_ADDRESS,\n decimals: chain?.nativeCurrency.decimals||18,\n symbol: chain?.nativeCurrency.symbol,\n name: chain?.nativeCurrency.name,\n balance: 0,\n icon: chain?.nativeCurrency.icon\n });\n }\n return list\n }, [assetListQuery.data, importTokenQuery.data]);\n\n return {\n importTokenQuery,\n assetListQuery,\n mergedAssets\n };\n}\n\n\nconst MULTICALL_LIMIT = 100;\n\nexport function useMatchWalletAssetList({\n list\n }: {\n list: WalletAssetMergeType[]\n}) {\n const {publicClient, chain} = useMatchChain();\n const {address} = useWallet()\n const {assets, setAssets} = useLocalStore()\n\n // Filter out the native token\n const nativeToken = list.find(asset => asset.address.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase()) || {\n chain_id: chain?.id || '',\n address: NATIVE_TOKEN_ADDRESS,\n decimals: 18,\n symbol: chain?.nativeCurrency.symbol,\n name: chain?.nativeCurrency.name,\n balance: 0,\n }\n\n // 1. Query the native token balance\n const nativeBalanceQuery = useQuery({\n queryKey: ['nativeBalance', nativeToken?.chain_id],\n queryFn: async () => {\n if (!nativeToken || !publicClient) return null;\n try {\n return await publicClient.getBalance({\n address: address as `0x${string}`,\n });\n } catch (error) {\n console.error('Native Token Balance Error:', error);\n return null;\n }\n },\n enabled: !!nativeToken && !!publicClient,\n refetchInterval: 15000, // Refresh every 15 seconds\n retry: 3 // Retry up to 3 times if failed\n });\n\n // 2. Filter out ERC20 tokens that require multiCall queries\n const erc20Tokens = useMemo(() => list.filter(asset => asset.address !== NATIVE_TOKEN_ADDRESS), [list]);\n\n // 3. Execute multiCall to query ERC20 balances\n const erc20BalanceQuery = useQuery({\n queryKey: ['erc20Balances', erc20Tokens.map(token => token.address)],\n queryFn: async () => {\n if (!erc20Tokens.length || !publicClient) return [];\n\n const calls = erc20Tokens.map(token => (\n {\n address: token.address as `0x${string}`,\n abi: erc20Abi as Abi,\n functionName: \"balanceOf\",\n args: [address as `0x${string}`]\n }\n ));\n\n let balances = [];\n for (let i = 0; i < calls.length; i += MULTICALL_LIMIT) {\n const batchCalls = calls.slice(i, i + MULTICALL_LIMIT);\n try {\n const results = await publicClient.multicall({contracts: batchCalls});\n balances.push(...results);\n } catch (error) {\n console.error('MultiCall Error:', error);\n }\n }\n\n return balances;\n },\n enabled: !!publicClient,\n refetchInterval: 15000, // Refresh every 15 seconds\n retry: 3\n });\n\n\n // 4. Compute the holding value for isAuto=true tokens\n const enrichedAssets = useMemo(() => {\n if (!list) return [];\n\n const erc20Balances = erc20BalanceQuery.data || [];\n return list.map(asset => {\n let balanceValue = \"0\";\n\n let balance = 0;\n const decimals = typeof asset.decimals === 'string' ? parseInt(asset.decimals) : asset.decimals;\n const assetAddress = asset.address.toLowerCase();\n // Native token balance\n if (assetAddress === NATIVE_TOKEN_ADDRESS) {\n balanceValue = nativeBalanceQuery.data?.toString() || \"0\";\n balance = nativeBalanceQuery.data ? Number(formatUnits(nativeBalanceQuery.data, decimals)) : 0;\n }\n // ERC20 balance\n else {\n const index = erc20Tokens.findIndex(t => t.address.toLowerCase() === assetAddress);\n if (index !== -1 && erc20Balances[index] && erc20Balances[index].status === 'success') {\n balance = Number(formatUnits(erc20Balances[index].result as bigint, decimals));\n balanceValue = (erc20Balances[index].result as bigint)?.toString() || \"0\";\n }\n }\n\n // Calculate the holding value\n const value = asset.isAuto ? (balance * (asset.price || 0)) : 0;\n\n return {...asset, balance, value, balanceValue};\n });\n }, [list, nativeBalanceQuery.data, erc20BalanceQuery.data]);\n\n // 5. Sorting rules:\n useEffect(() => {\n const list = enrichedAssets.sort((a, b) => {\n // ① Native token is always at the top\n if (a.address === NATIVE_TOKEN_ADDRESS) return -1;\n if (b.address === NATIVE_TOKEN_ADDRESS) return 1;\n\n // ② Tokens with isAuto=true and non-zero balance are sorted by holding value in descending order\n if (a.isAuto && b.isAuto) return b.value - a.value;\n if (a.isAuto) return -1;\n if (b.isAuto) return 1;\n\n // ③ Tokens with isCustom=true and non-zero balance retain their original order\n if (a.isCustom && !a.isAuto && a.balance > 0) return -1;\n if (b.isCustom && !b.isAuto && b.balance > 0) return 1;\n\n // ④ Other tokens retain their original order\n return 0;\n });\n setAssets(list)\n }, [enrichedAssets]);\n\n return {\n list: assets,\n isLoading: nativeBalanceQuery.isLoading || erc20BalanceQuery.isLoading,\n isFetched: nativeBalanceQuery.isFetched && erc20BalanceQuery.isFetched,\n nativeBalanceQuery,\n erc20BalanceQuery,\n nativeBalance: nativeBalanceQuery.data,\n erc20Balances: erc20BalanceQuery.data\n };\n}\n","import {useMatchChain, useToast, useUserInfo} from \"../../hooks\";\nimport {useEffect, useMemo, useState} from \"react\";\nimport {Abi} from \"abitype\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport {useQueryClient} from \"@tanstack/react-query\";\nimport {userImportTokenApi} from \"../../api\";\nimport {isSuccess} from \"../../api/request\";\nimport {USER_IMPORT_TOKEN_LIST_KEY} from \"../../hooks/api/wallet\";\nimport {Field, Input} from \"../../ui\";\nimport {Button} from \"../index\";\nimport {defineChain, erc20Abi} from \"viem\";\nimport useIsContract from \"../../hooks/useIsContract\";\nimport {Lottie} from \"../../ui\";\nimport {successImg, failImg} from \"assets/lottie\";\n\nexport default function ImportToken ({close}: {\n close: () => void\n}) {\n const [status,setStatus] = useState<''|'success'|'fail'>('')\n const {token} = useUserInfo()\n const [address, setAddress] = useState(\"\")\n const [symbol, setSymbol] = useState(\"\")\n const [decimals, setDecimals] = useState(\"\")\n const [error, setError] = useState<{\n address?: string,\n symbol?: string,\n decimals?: string\n }>({})\n const {publicClient, chainId,chain} = useMatchChain()\n const getContractInfo = async () => {\n if (!publicClient) return;\n\n const calls = [\n {\n address: address as `0x${string}`,\n abi: erc20Abi as Abi,\n functionName: \"symbol\",\n args: []\n },\n {\n address: address as `0x${string}`,\n abi: erc20Abi as Abi,\n functionName: \"decimals\",\n args: []\n },\n\n ];\n try {\n const results = await publicClient.multicall({contracts: calls});\n console.log('results', results)\n\n if (!symbol && results[0]?.status == 'success') {\n setSymbol(results[0]?.result as string)\n }\n if (!decimals && results[1]?.status == 'success') {\n setDecimals((results[1]?.result as number).toString())\n }\n } catch (error: any) {\n setError({\n address: error.message\n })\n }\n\n }\n const intl = useIntl()\n useEffect(() => {\n if (address.length === 42) {\n const reg = /^0x[0-9a-fA-F]{40}$/;\n if (!reg.test(address)) {\n setError({\n ...error,\n address: intl.formatMessage({\n id: \"tokenAddressError\"\n })\n })\n } else {\n setError({\n ...error,\n address: \"\"\n })\n publicClient && getContractInfo()\n }\n }\n }, [address, publicClient]);\n const [loading, setLoading] = useState(false)\n const toast = useToast()\n const queryClient = useQueryClient();\n\n const onImport = async () => {\n setLoading(true)\n try {\n const res = await userImportTokenApi({\n chain_id: chainId?.toString() || '',\n symbol,\n address,\n decimals\n })\n if (isSuccess(res)) {\n // toast.success(intl.formatMessage({\n // id: \"importSuccess\"\n // }))\n setStatus('success')\n queryClient.invalidateQueries({\n queryKey: [USER_IMPORT_TOKEN_LIST_KEY, token, chainId]\n })\n // close()\n } else {\n setStatus('fail')\n toast.error(res.message)\n }\n } catch (error: any) {\n setStatus('fail')\n toast.error(error.message)\n } finally {\n setLoading(false)\n }\n\n }\n\n const canImport = useMemo(() => {\n if (!address) {\n return false\n }\n if (!symbol) {\n return false\n }\n if (decimals.length === 0) {\n return false\n }\n const reg = /^0x[0-9a-fA-F]{40}$/;\n if (!reg.test(address)) {\n return false\n }\n return true;\n }, [error, address, symbol, decimals])\n\n const isContractQuery = useIsContract({\n //@ts-ignore\n chain:defineChain(chain),\n address,\n enabled:canImport\n })\n\n if(status=='success'||status=='fail'){\n return <div className={`matchid-import-token-result matchid-flex`}>\n <div className={`matchid-import-token-result-box matchid-flex`}>\n <div className={`matchid-import-token-result-img`}>\n <Lottie animationData={status=='success'?successImg:failImg} style={{\n width: \"96px\",\n height: \"96px\",\n }} />\n </div>\n <div className={`matchid-import-token-result-text matchid-import-token-result-text-${status}`}>\n {status=='success'?<FormattedMessage id={\"importSuccess\"}/>:<FormattedMessage id={\"importFail\"}/>}\n </div>\n </div>\n {status=='success' ? <Button size={\"lg\"} onClick={close} block highlight><FormattedMessage id={\"close\"}/></Button>\n : <Button size={\"lg\"} onClick={()=>setStatus('')} block highlight><FormattedMessage id=\"back\"/></Button>}\n </div>\n }\n\n return <div className={`matchid-import-token`}>\n <div className={\"matchid-import-token-form\"}>\n <Field label={intl.formatMessage({\n id: \"tokenSmartContract\"\n })} error={error.address ? error.address : (\n isContractQuery.isFetched&&!isContractQuery.isLoading&&!isContractQuery.data&&canImport?\"Address isn't a contract address\":''\n )}>\n <Input placeholder={intl.formatMessage({\n id: \"tokenSmartContractPlaceholder\"\n })} value={address}\n onChange={(e) => setAddress(e.target.value)} maxLength={42}/>\n </Field>\n <Field label={intl.formatMessage({\n id: \"tokenSymbol\"\n })} error={error.symbol}>\n <Input placeholder={intl.formatMessage({\n id: \"tokenSymbolPlaceholder\"\n })} value={symbol} onChange={(e) => setSymbol(e.target.value)}\n maxLength={16}/>\n </Field>\n <Field label={intl.formatMessage({\n id: \"tokenDecimals\"\n })} error={error.decimals}>\n <Input placeholder={intl.formatMessage({\n id: \"tokenDecimalsPlaceholder\"\n })} type={\"number\"} value={decimals}\n onChange={(e) => setDecimals(e.target.value)}/>\n </Field>\n </div>\n <Button size={\"lg\"} onClick={onImport} block loading={loading||isContractQuery.isLoading}\n disabled={!canImport||!isContractQuery.data} highlight><FormattedMessage id={\"import\"}/></Button>\n </div>\n}","import {Chain, createPublicClient, http} from \"viem\";\nimport {useQuery} from \"@tanstack/react-query\";\n\nexport default function useIsContract({\n address,\n chain,\n enabled,\n }: {\n address: string,\n chain: Chain,\n enabled?: boolean\n}) {\n return useQuery<boolean>({\n queryKey: [\"is_contract\", chain?.id, address],\n queryFn: async () => {\n if (!chain) return false;\n if (!address) return false;\n const publicClient = createPublicClient({\n chain,\n transport: http()\n })\n const res = await publicClient.getCode({address: address as `0x${string}`})\n return res !== null && res !== undefined;\n },\n enabled\n });\n}","import { useState, useCallback, useEffect } from \"react\";\nimport {useMatchChain} from \"./index\";\nimport {useQuery} from \"@tanstack/react-query\";\nimport {createPublicClient, defineChain, http} from \"viem\";\nconst CACHE_TTL = 86400 * 30 * 1000;\nconst MAX_CACHE_SIZE = 500;\nconst STORAGE_KEY = \"match_receipt_logs\";\n\ntype CacheEntry<V> = {\n value: V;\n timestamp: number;\n};\n\nexport function useReceiptCache<K extends string, V>() {\n const [cache, setCache] = useState<Map<K, CacheEntry<V>>>(new Map());\n\n const isLocalStorageAvailable = (() => {\n try {\n const testKey = \"__test__\";\n localStorage.setItem(testKey, \"1\");\n localStorage.removeItem(testKey);\n return true;\n } catch (e) {\n return false;\n }\n })();\n\n useEffect(() => {\n if (isLocalStorageAvailable) {\n try {\n const storedData = localStorage.getItem(STORAGE_KEY);\n if (storedData) {\n try {\n const parsed = JSON.parse(storedData) as Record<K, CacheEntry<V>>;\n const now = Date.now();\n\n const validEntries: [K, CacheEntry<V>][] = Object.entries(parsed)\n .filter(([_, entry]) => typeof entry === \"object\" && entry !== null && \"timestamp\" in entry && now - (entry as CacheEntry<V>).timestamp <= CACHE_TTL)\n .map(([key, entry]) => [key as K, entry as CacheEntry<V>]);\n\n setCache(new Map(validEntries));\n\n } catch (e) {\n console.error(\"Failed to parse cache from localStorage:\", e);\n }\n }\n\n } catch (e) {\n console.error(\"Failed to load cache from localStorage:\", e);\n }\n }\n }, []);\n\n const updateLocalStorage = useCallback((updatedCache: Map<K, CacheEntry<V>>) => {\n if (isLocalStorageAvailable) {\n try {\n const storedData = localStorage.getItem(STORAGE_KEY);\n let parsed: Record<K, CacheEntry<V>> = {} as Record<K, CacheEntry<V>>;\n if (storedData) {\n parsed = JSON.parse(storedData) as Record<K, CacheEntry<V>>;\n }\n\n updatedCache.forEach((entry, key) => {\n parsed[key] = entry;\n });\n\n localStorage.setItem(STORAGE_KEY, JSON.stringify(parsed));\n } catch (e) {\n console.error(\"Failed to update localStorage:\", e);\n }\n }\n }, []);\n\n // set cache\n const set = useCallback((key: K, value: V) => {\n const now = Date.now();\n const newCache = new Map(cache);\n\n // clear expired\n newCache.forEach((entry, k) => {\n if (now - entry.timestamp > CACHE_TTL) {\n newCache.delete(k);\n }\n });\n\n // max cache size\n if (newCache.size >= MAX_CACHE_SIZE) {\n const firstKey = newCache.keys().next().value as K | undefined;\n if (firstKey !== undefined) {\n newCache.delete(firstKey);\n }\n }\n\n // set new value\n newCache.set(key, { value, timestamp: now });\n setCache(newCache);\n updateLocalStorage(newCache);\n }, [cache, updateLocalStorage]);\n\n // get cache\n const get = useCallback((key: K): V | undefined => {\n const entry = cache.get(key);\n if (entry) {\n // check if expired\n if (Date.now() - entry.timestamp > CACHE_TTL) {\n const newCache = new Map(cache);\n newCache.delete(key);\n setCache(newCache);\n updateLocalStorage(newCache);\n return undefined;\n }\n return entry.value;\n }\n return undefined;\n }, [cache, updateLocalStorage]);\n\n // del cache\n const del = useCallback((key: K) => {\n if (cache.has(key)) {\n const newCache = new Map(cache);\n newCache.delete(key);\n setCache(newCache);\n updateLocalStorage(newCache);\n }\n }, [cache, updateLocalStorage]);\n\n // clear cache\n const clear = useCallback(() => {\n setCache(new Map());\n if (isLocalStorageAvailable) {\n localStorage.removeItem(STORAGE_KEY);\n }\n }, [isLocalStorageAvailable]);\n\n return { set, get, del, clear };\n}\n\n\nexport default function useReceipt({\n chainId,\n hash\n }:{\n chainId: number,\n hash: string\n}){\n const {list} = useMatchChain()\n const cache = useReceiptCache<string, any>()\n const chain = list?.find((item) => item.id === chainId)\n const [shouldRefetch, setShouldRefetch] = useState(true)\n\n const query = useQuery({\n queryKey: ['match-tx-receipt', hash, chain],\n queryFn: async () => {\n if (!chain || !hash) return false\n const cacheKey = `${chain.id}-${hash}`\n if (cache.get(cacheKey)) {\n return cache.get(cacheKey)\n }\n try {\n const publicClient = createPublicClient({\n chain: defineChain(chain),\n transport: http(),\n });\n const receipt = await publicClient.getTransactionReceipt({hash: hash as `0x${string}`});\n if (!receipt) {\n return false\n }\n cache.set(cacheKey, receipt)\n return receipt\n } catch (e) {\n return false\n }\n },\n refetchInterval: shouldRefetch ? 10000 : false,\n })\n\n useEffect(() => {\n if (query.data) {\n setShouldRefetch(false)\n }\n }, [query.data]);\n\n return query\n}","import { useState, useCallback, useEffect } from \"react\";\nimport {useMatchChain} from \"./index\";\nimport {useQuery} from \"@tanstack/react-query\";\nimport {createPublicClient, defineChain, http} from \"viem\";\nconst CACHE_TTL = 86400 * 30 * 1000;\nconst MAX_CACHE_SIZE = 500;\nconst STORAGE_KEY = \"match_transaction_logs\";\n\ntype CacheEntry<V> = {\n value: V;\n timestamp: number;\n};\n\nexport function useTransactionCache<K extends string, V>() {\n const [cache, setCache] = useState<Map<K, CacheEntry<V>>>(new Map());\n\n const isLocalStorageAvailable = (() => {\n try {\n const testKey = \"__test__\";\n localStorage.setItem(testKey, \"1\");\n localStorage.removeItem(testKey);\n return true;\n } catch (e) {\n return false;\n }\n })();\n\n useEffect(() => {\n if (isLocalStorageAvailable) {\n try {\n const storedData = localStorage.getItem(STORAGE_KEY);\n if (storedData) {\n try {\n const parsed = JSON.parse(storedData) as Record<K, CacheEntry<V>>;\n const now = Date.now();\n\n const validEntries: [K, CacheEntry<V>][] = Object.entries(parsed)\n .filter(([_, entry]) => typeof entry === \"object\" && entry !== null && \"timestamp\" in entry && now - (entry as CacheEntry<V>).timestamp <= CACHE_TTL)\n .map(([key, entry]) => [key as K, entry as CacheEntry<V>]);\n\n setCache(new Map(validEntries));\n\n } catch (e) {\n console.error(\"Failed to parse cache from localStorage:\", e);\n }\n }\n\n } catch (e) {\n console.error(\"Failed to load cache from localStorage:\", e);\n }\n }\n }, []);\n\n const updateLocalStorage = useCallback((updatedCache: Map<K, CacheEntry<V>>) => {\n if (isLocalStorageAvailable) {\n try {\n const storedData = localStorage.getItem(STORAGE_KEY);\n let parsed: Record<K, CacheEntry<V>> = {} as Record<K, CacheEntry<V>>;\n if (storedData) {\n parsed = JSON.parse(storedData) as Record<K, CacheEntry<V>>;\n }\n\n updatedCache.forEach((entry, key) => {\n parsed[key] = entry;\n });\n\n localStorage.setItem(STORAGE_KEY, JSON.stringify(parsed));\n } catch (e) {\n console.error(\"Failed to update localStorage:\", e);\n }\n }\n }, []);\n\n // set cache\n const set = useCallback((key: K, value: V) => {\n const now = Date.now();\n const newCache = new Map(cache);\n\n // clear expired\n newCache.forEach((entry, k) => {\n if (now - entry.timestamp > CACHE_TTL) {\n newCache.delete(k);\n }\n });\n\n // max cache size\n if (newCache.size >= MAX_CACHE_SIZE) {\n const firstKey = newCache.keys().next().value as K | undefined;\n if (firstKey !== undefined) {\n newCache.delete(firstKey);\n }\n }\n\n // set new value\n newCache.set(key, { value, timestamp: now });\n setCache(newCache);\n updateLocalStorage(newCache);\n }, [cache, updateLocalStorage]);\n\n // get cache\n const get = useCallback((key: K): V | undefined => {\n const entry = cache.get(key);\n if (entry) {\n // check if expired\n if (Date.now() - entry.timestamp > CACHE_TTL) {\n const newCache = new Map(cache);\n newCache.delete(key);\n setCache(newCache);\n updateLocalStorage(newCache);\n return undefined;\n }\n return entry.value;\n }\n return undefined;\n }, [cache, updateLocalStorage]);\n\n // del cache\n const del = useCallback((key: K) => {\n if (cache.has(key)) {\n const newCache = new Map(cache);\n newCache.delete(key);\n setCache(newCache);\n updateLocalStorage(newCache);\n }\n }, [cache, updateLocalStorage]);\n\n // clear cache\n const clear = useCallback(() => {\n setCache(new Map());\n if (isLocalStorageAvailable) {\n localStorage.removeItem(STORAGE_KEY);\n }\n }, [isLocalStorageAvailable]);\n\n return { set, get, del, clear };\n}\n\n\nexport default function useTransaction({\n chainId,\n hash\n }:{\n chainId: number,\n hash: string\n}){\n const {list} = useMatchChain()\n const cache = useTransactionCache<string, any>()\n const chain = list?.find((item) => item.id === chainId)\n const [shouldRefetch, setShouldRefetch] = useState(true)\n\n const query = useQuery({\n queryKey: ['match-tx-transaction', hash, chain],\n queryFn: async () => {\n if (!chain || !hash) return false\n const cacheKey = `${chain.id}-${hash}`\n if (cache.get(cacheKey)) {\n return cache.get(cacheKey)\n }\n try {\n const publicClient = createPublicClient({\n chain: defineChain(chain),\n transport: http(),\n });\n const transaction = await publicClient.getTransaction({hash: hash as `0x${string}`});\n if (!transaction) {\n return false\n }\n cache.set(cacheKey, transaction)\n return transaction\n } catch (e) {\n return false\n }\n },\n refetchInterval: shouldRefetch ? 10000 : false,\n })\n\n useEffect(() => {\n if (query.data) {\n setShouldRefetch(false)\n }\n }, [query.data]);\n\n return query\n}","import {create} from 'zustand';\nimport {CEXType, WalletType} from \"../types/types\";\nimport {Chain} from \"viem\";\nimport {DEFAULT_WALLET_METHODS} from \"../hooks/useConfig\";\n\n// export const useEVMModalStore = create<{\n// isOpen: boolean,\n// type: 'bind' | 'login' | ''\n// open: (type: 'bind' | 'login') => void,\n// close: () => void\n// }>(set => ({\n// isOpen: false,\n// type: '',\n// open: (type: 'bind' | 'login') => set({isOpen: true, type}),\n// close: () => set({isOpen: false})\n// }));\n\ntype WalletModalType = {\n isOpen: boolean,\n type: 'bind' | 'login' | ''\n open: (type: 'bind' | 'login') => void,\n close: () => void\n}\n\nexport const useTRONModalStore = create<WalletModalType>(set => ({\n isOpen: false,\n type: '',\n open: (type: 'bind' | 'login') => set({isOpen: true, type}),\n close: () => set({isOpen: false})\n}));\n\nexport const useTONModalStore = create<WalletModalType>(set => ({\n isOpen: false,\n type: '',\n open: (type: 'bind' | 'login') => set({isOpen: true, type}),\n close: () => set({isOpen: false})\n}));\n\nexport const useBTCModalStore = create<WalletModalType>(set => ({\n isOpen: false,\n type: '',\n open: (type: 'bind' | 'login') => set({isOpen: true, type}),\n close: () => set({isOpen: false})\n}));\nexport const useEVMModalStore = create<WalletModalType>(set => ({\n isOpen: false,\n type: '',\n open: (type: 'bind' | 'login') => set({isOpen: true, type}),\n close: () => set({isOpen: false})\n}));\n\nexport const useCEXBindModalStore = create<{\n type: CEXType | ''\n isOpen: boolean,\n open: (type: CEXType) => void,\n close: () => void\n}>(set => ({\n type: '',\n isOpen: false,\n open: (type: CEXType) => set({isOpen: true, type}),\n close: () => set({isOpen: false})\n}));\n\n\nexport const useWalletModalStore = create<{\n isOpen: boolean,\n type: 'bind' | 'login' | ''\n methods?: WalletType[]\n open: (type: 'bind' | 'login', methods?: WalletType[]) => void,\n close: () => void\n}>(set => ({\n isOpen: false,\n type: '',\n methods: [],\n open: (type: 'bind' | 'login', methods = DEFAULT_WALLET_METHODS) => set({isOpen: true, type, methods}),\n close: () => set({isOpen: false})\n}))","import React, {useEffect, useMemo, useState} from \"react\";\nimport {isSuccess} from \"api/request\";\nimport {Button, ModalWithHeader, Field, Input} from \"components\"\nimport {bindCexApi} from \"../../api\";\nimport {CEXType, ModalWithHeaderProps} from \"../../types/types\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport {useUserInfo} from \"../../hooks\";\nimport eventManager from \"../../hooks/eventManager\";\nimport {useMatch} from \"../../MatchContext\";\n\nexport default function CEXBindModal({\n onClose,\n type,\n isOpen = false,\n ...props\n }: {\n type: CEXType | '',\n onClose: () => void,\n} & ModalWithHeaderProps) {\n const intl = useIntl()\n const {events} = useMatch()\n\n const [APIPassphrase, setAPIPassphrase] = useState<string>('')\n const {refreshOverview} = useUserInfo()\n const [loading, setLoading] = useState<boolean>(false)\n const [key, setKey] = useState<string>('')\n const [secret, setSecret] = useState<string>('')\n const [error, setError] = useState<string>('')\n const needPassphrase = useMemo(()=>{\n return ['bitget','okx'].includes(type.toLowerCase())\n },[type])\n useEffect(() => {\n if (isOpen) {\n setSecret('')\n setKey('')\n setAPIPassphrase('')\n setError('')\n setLoading(false)\n\n }\n }, [isOpen]);\n\n const SubmitApi = async () => {\n try {\n setLoading(true)\n const res = await bindCexApi({\n cex: type,\n api_key: key,\n api_secret: secret,\n ...(needPassphrase ? {api_passphrase: APIPassphrase} : {})\n });\n if (isSuccess(res)) {\n\n await refreshOverview()\n events!.onBind && events!.onBind({\n type: 'cex_' + type\n })\n eventManager.emit('onBind', {\n type: 'cex_' + type\n })\n onClose()\n }else{\n throw new Error(res.message)\n }\n\n\n } catch (error: any) {\n console.error(error)\n setError(error.message)\n }finally {\n setLoading(false)\n }\n }\n return <ModalWithHeader showClose isOpen={isOpen} onClose={onClose} title={intl.formatMessage({\n id: \"CEXBindTitle\"\n }, {\n type\n })} {...props}>\n <div className={\"matchid-cex-modal\"}>\n <div>\n <p><FormattedMessage id=\"CEXBindAttention\"/></p>\n <p><FormattedMessage id=\"CEXBindTips1\"/></p>\n <p><FormattedMessage id=\"CEXBindTips2\"/></p>\n <p><FormattedMessage id=\"CEXBindTips3\"/></p>\n </div>\n <Field label={intl.formatMessage({\n id: \"CEXBindApiKey\"\n })}>\n <Input value={key}\n onChange={(e) => setKey(e.target.value)}\n placeholder='**** **** ****'\n />\n </Field>\n <Field label={intl.formatMessage({\n id: \"CEXBindApiSecretKey\"\n })} error={!needPassphrase && error}>\n <Input value={secret}\n onChange={(e) => setSecret(e.target.value)}\n placeholder='**** **** ****'\n />\n </Field>\n {\n needPassphrase && <Field error={error} label={intl.formatMessage({\n id: \"CEXBindApiPassphrase\"\n })}>\n <Input value={APIPassphrase}\n onChange={(e) => setAPIPassphrase(e.target.value)}\n placeholder='**** **** ****'\n />\n </Field>\n }\n <Button onClick={SubmitApi} size=\"lg\" block loading={loading}\n disabled={!key || !secret}><FormattedMessage id={\"continue\"}/></Button>\n\n </div>\n\n </ModalWithHeader>\n}","import React, {PropsWithChildren, useEffect} from \"react\";\nimport {useUserInfo} from \"../hooks\";\nimport {\n useBTCModalStore,\n useCEXBindModalStore,\n useEVMModalStore,\n useTONModalStore,\n useTRONModalStore,\n useWalletModalStore,\n} from \"../store/useModalStore\";\nimport {BTCModal, TRONModal, TONModal, WalletModal, EVMModal} from \"../components\";\nimport CEXBindModal from \"../components/CEXBindModal\";\nimport {useQuery} from \"@tanstack/react-query\";\nimport {getTgAppLoginStatus} from \"../api\";\nimport {isSuccess} from \"../api/request\";\nimport useStore from \"../store/useStore\";\nimport {useMatch} from \"../MatchContext\";\n\nexport default function BusinessProvider({children}: PropsWithChildren) {\n const {overview, token} = useUserInfo()\n const {type: EVMType, isOpen: EVMIsOpen, close: EVMClose} = useEVMModalStore()\n const {type: TONType, isOpen: TONIsOpen, close: TONClose} = useTONModalStore()\n const {type: TRONType, isOpen: TRONIsOpen, close: TRONClose} = useTRONModalStore()\n const {type: BTCType, isOpen: BTCIsOpen, close: BTCClose} = useBTCModalStore()\n const {type: CEXType, isOpen: CEXIsOpen, close: CEXClose} = useCEXBindModalStore()\n const WalletModalStore = useWalletModalStore()\n const {tgAppAuthCode,setTgAppAuthCode} = useStore();\n const {login} = useMatch()\n\n const walletModalClose = (func:()=>void)=>{\n WalletModalStore.close()\n func()\n }\n\n useQuery({\n queryKey: ['matchid-tgapp-login',tgAppAuthCode],\n queryFn: async()=>{\n const res = await getTgAppLoginStatus({\n code:tgAppAuthCode\n })\n if(isSuccess(res)){\n setTgAppAuthCode('')\n await login({\n // mid:'',\n token: `${res.data.token_type} ${res.data.access_token}`\n })\n return true\n }\n return false\n },\n enabled: !!tgAppAuthCode,\n refetchInterval: 1000 * 5,\n })\n\n return (\n <>\n <EVMModal\n isOpen={EVMIsOpen && ((EVMType == 'login' && !overview && !token) || (EVMType == 'bind' && !!token && !!overview))}\n onClose={EVMClose} type={EVMType} onSuccess={()=>walletModalClose(EVMClose)} zIndex={199}/>\n <TRONModal\n isOpen={TRONIsOpen && ((TRONType == 'login' && !overview && !token) || (TRONType == 'bind' && !!token && !!overview))}\n onClose={TRONClose} type={TRONType} onSuccess={()=>walletModalClose(TRONClose)} zIndex={199}/>\n <TONModal\n isOpen={TONIsOpen && ((TONType == 'login' && !overview && !token) || (TONType == 'bind' && !!token && !!overview))}\n onClose={TONClose} type={TONType} onSuccess={()=>walletModalClose(TONClose)} zIndex={199}/>\n <BTCModal\n isOpen={BTCIsOpen && ((BTCType == 'login' && !overview && !token) || (BTCType == 'bind' && !!token && !!overview))}\n onClose={BTCClose} type={BTCType} onSuccess={()=>walletModalClose(BTCClose)} zIndex={199}/>\n <CEXBindModal isOpen={CEXIsOpen && (!!token && !!overview)}\n onClose={CEXClose} type={CEXType} zIndex={199}/>\n <WalletModal\n isOpen={WalletModalStore.isOpen && ((WalletModalStore.type == 'login' && !overview && !token) || (WalletModalStore.type == 'bind' && !!token && !!overview))}\n onClose={WalletModalStore.close} type={WalletModalStore.type} methods={WalletModalStore.methods} zIndex={150}/>\n {children}\n </>\n );\n\n}","import React, {PropsWithChildren} from 'react';\nimport BusinessProvider from \"./BusinessProvider\";\nimport {ModalProvider} from \"./ModalContext\";\nimport {ToastProvider} from \"./ToastContext\";\n\nconst Providers = ({children}: PropsWithChildren) => {\n return (\n <ToastProvider>\n <ModalProvider>\n <BusinessProvider>\n {children}\n </BusinessProvider>\n </ModalProvider>\n </ToastProvider>\n );\n};\n\nexport default Providers;\n","import useLocalStore from \"../store/useLocalStore\";\nimport {useEffect, useRef, useState} from \"react\";\nimport matchlog from \"../utils/matchlog\";\nimport useWallet from \"./useWallet\";\nimport {WalletReceiveMessageType} from \"../types\";\nimport {sendMessage} from \"../utils/wallet\";\nimport useStore from \"../store/useStore\";\nimport {encodeBase64, getAppClientId} from \"../utils\";\nimport {WalletConfigType} from \"../types/types\";\nimport useUserInfo from \"./useUserInfo\";\nimport {getLocale} from \"../store\";\n\nconst getWalletIframe = () => {\n return document.getElementById('match-wallet') as HTMLIFrameElement\n}\nconst AppClientId = getAppClientId()\n\nexport default function useWalletInit({\n config\n }: {\n config: WalletConfigType\n}) {\n const {endpoints, token, setWallet, appid,refreshOverview} = useLocalStore();\n const {setWalletReady, walletReady} = useStore()\n const iframeReadyRef = useRef(walletReady)\n useEffect(() => {\n setWallet(config)\n }, [config]);\n useEffect(() => {\n matchlog.log('sdk.mpc.status', walletReady, iframeReadyRef.current)\n iframeReadyRef.current = walletReady\n if (iframeReadyRef.current) {\n const onReady = async () => {\n if (window.matchProvider.walletMessageStack.length > 0) {\n const stack = window.matchProvider.walletMessageStack\n window.matchProvider.walletMessageStack = []\n for (let i = 0; i < stack.length; i++) {\n const item = stack[i]\n sendMessage(item)\n }\n }\n }\n onReady()\n }\n }, [walletReady]);\n //create an iframe in page body\n useEffect(() => {\n if (!endpoints.auth || !appid || !token || !config) {\n const existingIframe = getWalletIframe();\n if (existingIframe) {\n //remove iframe\n existingIframe.remove()\n }\n return\n }\n if (endpoints.auth) {\n const existingIframe = getWalletIframe();\n const query = {\n appid,\n appClientId: AppClientId,\n initParams:encodeBase64(JSON.stringify({\n access_token: token,\n type:config.type\n }))\n }\n const url = endpoints.auth + 'wallet/2?' + new URLSearchParams(query).toString()\n if (!existingIframe) {\n const createIframe = () => {\n const iframe = document.createElement('iframe');\n iframe.id = 'match-wallet';\n iframe.src = url\n iframe.style.display = 'none';\n iframe.style.width = '0';\n iframe.style.height = '0';\n iframe.style.position = 'fixed';\n iframe.style.zIndex = '200'\n // iframe.style.background = \"rgba(45, 60, 82, 0.50)\"\n // iframe.style.backdropFilter = \"blur(4px)\"\n //@ts-ignore\n //add on error console\n iframe.onerror = (e) => {\n console.error('sdk.mpc.error', e)\n }\n document.body.insertBefore(iframe, document.body.firstChild);\n }\n createIframe();\n if (!window.matchProvider) {\n window.matchProvider = {\n transactionMessageIntervalMap: {},\n walletMessageMap: {},\n walletMessageStack: [],\n sendWalletMessage: ({\n method,\n data = {},\n }) => {\n\n const messageId = Date.now().toString() + Math.random().toString().slice(6)\n const message = {\n method,\n data,\n messageId,\n source: \"matchid\",\n version: 1,\n locale:getLocale()\n }\n\n try {\n matchlog.log('sdk.mpc.send', message, endpoints.auth)\n getWalletIframe()?.contentWindow?.postMessage(message, endpoints.auth);\n } catch (error) {\n console.error('sdk.mpc.sendError', error)\n }\n return messageId\n },\n waitUntilWalletMessage: async ({\n method,\n data = {},\n timeout = 30000\n }) => {\n return new Promise((resolve, reject) => {\n try {\n if (iframeReadyRef.current && window.matchProvider.walletMessageStack.length == 0) {\n sendMessage({\n method,\n data,\n resolve,\n reject,\n timeout\n })\n return\n }\n //if iframe not ready or stack has data need to send, push to stack\n window.matchProvider.walletMessageStack.push({\n method,\n data,\n timeout,\n resolve,\n reject\n })\n } catch (error: any) {\n reject(error)\n }\n })\n }\n }\n }\n\n } else {\n if (existingIframe.src !== url) {\n setWalletReady(false);\n existingIframe.src = url\n }\n }\n }\n\n }, [endpoints.auth, appid, token, config]);\n useEffect(() => {\n const messageHandle = async (e: MessageEvent) => {\n //origin\n if (e.origin !== endpoints.auth.substring(0, endpoints.auth.length - 1)) {\n return\n }\n const res = e.data as WalletReceiveMessageType\n if (res.source != 'match-wallet') {\n return\n }\n matchlog.log('sdk.mpc.receive', e)\n\n const messageId = res.messageId\n if (messageId == 'ready') {\n matchlog.log('sdk.mpc.ready')\n setWalletReady(true)\n window.matchProvider.sendWalletMessage({\n method: 'readied'\n })\n //send readied message\n return\n }\n if (messageId == 'openIframe') {\n const iframe = getWalletIframe()\n if (iframe) {\n iframe.style.display = 'block'\n iframe.style.width = '100vw'\n iframe.style.height = '100vh'\n iframe.style.right = '0'\n iframe.style.top = '0'\n }\n return\n }\n if (messageId == 'closeIframe') {\n const iframe = getWalletIframe()\n if (iframe) {\n iframe.style.display = 'none'\n iframe.style.width = '0'\n iframe.style.height = '0'\n iframe.style.right = '0'\n iframe.style.top = '0'\n }\n return\n }\n if (messageId == 'refreshOverview') {\n refreshOverview()\n return\n }\n if (messageId == 'updateTransactionData') {\n const {data, rootData, transactionId} = res.data\n if (window.matchProvider.transactionMessageIntervalMap[transactionId] && window.matchProvider.transactionMessageIntervalMap[transactionId].transaction.data == rootData) {\n window.matchProvider.transactionMessageIntervalMap[transactionId].transaction.data = data\n const {func} = window.matchProvider.transactionMessageIntervalMap[transactionId]\n func()\n }\n return\n }\n if (messageId && window.matchProvider.walletMessageMap[messageId]) {\n const {resolve, reject, timeout} = window.matchProvider.walletMessageMap[messageId]\n clearTimeout(timeout!)\n if (res.method == 'ping') {\n delete window.matchProvider.walletMessageMap[messageId].timeout\n return\n }\n delete window.matchProvider.walletMessageMap[messageId]\n if (res.status == 'success') {\n resolve(res.data)\n } else {\n console.error('sdk.mpc.fail', res)\n reject(new Error(res.data.message))\n }\n }\n }\n window.addEventListener('message', messageHandle)\n return () => {\n window.removeEventListener('message', messageHandle)\n }\n\n }, []);\n\n return {\n walletReady\n }\n}","import {IEnvConfigType, IEnvName, IMatchEvents, LocaleType} from \"../types/types\";\nimport React, {useEffect, useRef} from \"react\";\nimport useLocalStore from \"../store/useLocalStore\";\nimport eventManager from \"./eventManager\";\nimport {getOverviewInfoApi, getTgAppLoginStatus} from \"../api\";\nimport env from \"../config/env\";\nimport matchlog from \"../utils/matchlog\";\nimport {useWalletModalStore} from \"../store/useModalStore\";\nimport useStore from \"../store/useStore\";\nimport {useQuery} from \"@tanstack/react-query\";\nimport {isSuccess} from \"../api/request\";\nimport {decodeBase64} from \"../utils\";\n\nexport default function useInit({\n theme,\n appid,\n events,\n endpoints,\n locale\n }: {\n theme: \"light\" | \"dark\";\n appid: string;\n endpoints?: IEnvConfigType['endpoints']\n events?: IMatchEvents\n locale?: LocaleType\n}) {\n\n const {\n setAppid,\n setEndpoints,\n setToken,\n setMid,\n token,\n setOverview,\n setTheme,\n setLocale,\n locale:realLocale\n } = useLocalStore();\n const walletModalStore = useWalletModalStore();\n const overviewLoadingRef = useRef(false);\n\n const searchParams = new URLSearchParams(window.location.search);\n const matchToken = searchParams.get('matchToken');\n const matchidt = searchParams.get('matchidt');\n\n const realEndpoints = endpoints || env.endpoints;\n\n useEffect(() => {\n setTheme(theme)\n }, [theme])\n\n useEffect(() => {\n setAppid(appid);\n }, [appid]);\n\n useEffect(() => {\n setEndpoints(realEndpoints);\n }, [realEndpoints]);\n\n useEffect(()=>{\n setLocale(locale||'en')\n },[locale])\n\n useEffect(() => {\n if (matchToken) {\n const tokenData = JSON.parse(atob(matchToken));\n if (tokenData && tokenData.mid && tokenData.token) {\n login({\n // mid: tokenData.mid,\n token: \"Bearer \" + tokenData.token,\n });\n }\n }\n }, [matchToken]);\n\n useEffect(() => {\n if (matchidt) {\n const tokenData = decodeURIComponent(matchidt);\n const data = JSON.parse(decodeBase64(tokenData))\n if(data){\n matchlog.log('matchidt',data)\n if(data.action=='login'){\n const newtoken = data.token || `${data.token_type} ${data.access_token}`\n login({\n // mid: tokenData.mid,\n token:newtoken\n });\n }else if(data.action=='bind') {\n eventManager.emit('onBind', {\n type:data.type\n })\n if (events && events.onBind) {\n events.onBind({\n type:data.type\n })\n }\n }\n const url = window.location.href;\n const urlObj = new URL(url);\n urlObj.searchParams.delete('matchidt');\n window.history.replaceState({}, '', urlObj.toString());\n return;\n }\n }\n }, [matchidt]);\n\n useEffect(() => {\n const onLoginMessage = (event: MessageEvent) => {\n const res = event.data;\n if (res.event === 'login' && res.data && (res.data.token || (res.data.token_type && res.data.access_token))) {\n login({\n // mid: res.data.mid,\n token: res.data.token || `${res.data.token_type} ${res.data.access_token}`,\n });\n } else if (res.event == 'bind') {\n walletModalStore.close()\n eventManager.emit('onBind', res.data)\n if (events && events.onBind) {\n events.onBind(res.data)\n }\n }\n }\n window.addEventListener('message', onLoginMessage);\n return () => {\n window.removeEventListener('message', onLoginMessage);\n };\n }, []);\n\n const loadOverview = async () => {\n matchlog.log('loadOverview')\n if (overviewLoadingRef.current) {\n return;\n }\n overviewLoadingRef.current = true;\n try {\n const res = await getOverviewInfoApi();\n\n setOverview(res.data)\n\n return res.data;\n } catch (err) {\n console.error('overview error', err);\n } finally {\n overviewLoadingRef.current = false;\n }\n };\n\n useEffect(() => {\n if (token) {\n loadOverview();\n }\n }, [token]);\n\n const login = async ({ token}: { token: string }) => {\n // setMid(mid);\n setToken(token);\n const overview = await loadOverview();\n\n eventManager.emit('onLogin', {\n // mid,\n token,\n did: overview?.did as string,\n });\n if (events && events?.onLogin) {\n events.onLogin({\n // mid,\n token,\n did: overview?.did as string,\n });\n }\n };\n\n\n\n return {\n loadOverview,\n login,\n endpoints:realEndpoints,\n locale:realLocale\n }\n\n}","import {defineChain} from \"viem\";\n\nexport const matchMain = /*#__PURE__*/ defineChain({\n //定义match链\n id: 698,\n name: \"Matchain\",\n nativeCurrency: { name: \"Match Coin\", symbol: \"BNB\", decimals: 18 },\n rpcUrls: {\n default: {\n http: [\"https://rpc.matchain.io\"],\n },\n },\n blockExplorers: {\n default: {\n name: \"Matchscan\",\n url: \"https://matchscan.io/\",\n apiUrl: \"https://matchscan.io/api\",\n },\n },\n iconUrl: \"https://matchscan.io/static/identicon_logos/blockies.png\",\n contracts: {\n multicall3: {\n address: \"0xca11bde05977b3631167028862be2a173976ca11\",\n }\n },\n // testnet: true,\n});","\nimport { defineChain } from \"viem\"\n\nexport const matchTest = /*#__PURE__*/ defineChain({\n //定义matchTest链\n id: 699,\n name: \"MatchTest\",\n nativeCurrency: { name: \"Match Coin\", symbol: \"BNB\", decimals: 18 },\n rpcUrls: {\n default: {\n http: [\"https://testnet-rpc.matchain.io\"],\n },\n },\n blockExplorers: {\n default: {\n name: \"Matchscan\",\n url: \"https://testnet.matchscan.io/\",\n apiUrl: \"https://testnet.matchscan.io/api\",\n },\n },\n iconUrl: \"https://testnet.matchscan.io/static/identicon_logos/blockies.png\",\n contracts: {\n multicall3: {\n address: \"0xca11bde05977b3631167028862be2a173976ca11\",\n blockCreated: 751532,\n },\n ensRegistry: { address: \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\" },\n ensUniversalResolver: {\n address: \"0xc8Af999e38273D658BE1b921b88A9Ddf005769cC\",\n blockCreated: 5_317_080,\n },\n },\n // testnet: true,\n});\n","import {useQuery} from \"@tanstack/react-query\";\nimport useUserInfo from \"../useUserInfo\";\nimport type {UseQueryOptions} from \"@tanstack/react-query/src/types\";\nimport {PohItemType} from \"types/types\";\nimport {getPohListApi} from \"api\";\nexport {verifyPohApi} from \"api\";\n\nexport function usePohList(options?: Partial<Omit<UseQueryOptions<PohItemType[]>, 'queryKey' | 'queryFn'>>) {\n const {isLogin} = useUserInfo()\n return useQuery<PohItemType[]>({\n queryKey: ['pohList'],\n enabled: isLogin,\n queryFn: async () => {\n let res = await getPohListApi()\n return res.data\n },\n ...options\n })\n}","export {mintPassportNftApi,chooseIdentityApi} from \"api\""],"mappings":"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","names":["import_react_query","axios","axiosRetry","import_react","import_react","import_viem","import_zustand","import_viem","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_react_intl","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react_intl","import_jsx_runtime","import_react_intl","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_react","import_react_intl","import_react","import_jsx_runtime","import_wagmi","import_react","React","import_jsx_runtime","import_react","import_react_intl","import_react","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_react","import_react_intl","import_react","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_react_intl","import_jsx_runtime","import_react","import_react_intl","import_jsx_runtime","import_react","import_viem","import_zustand","import_middleware","persistedState","import_react_query","import_viem","import_react_intl","import_jsx_runtime","import_react_intl","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_zustand","import_middleware","persistedState","import_jsx_runtime","import_react","import_react","import_react_dom","import_jsx_runtime","import_react_query","import_react","import_viem","import_react_intl","import_jsx_runtime","import_react","import_react_query","import_viem","import_react_intl","import_react","import_react_intl","import_react_query","import_viem","import_viem","import_react_query","import_jsx_runtime","import_jsx_runtime","import_react","import_react_query","import_viem","import_react","import_react_query","import_viem","CACHE_TTL","import_zustand","import_react","import_react_intl","import_jsx_runtime","import_react_query","import_jsx_runtime","import_jsx_runtime","import_react","AppClientId","import_react","import_react_query","import_react_intl","import_rainbowkit","import_viem","import_viem","import_wagmi","import_jsx_runtime","import_react_query"]}
|