@vechain/vechain-kit 2.4.2 → 3.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/AccountModal-CK-qcPlQ.js +1 -0
  2. package/dist/AccountModal-ChuVFqPc.js +20 -0
  3. package/dist/AccountModal-ChuVFqPc.js.map +1 -0
  4. package/dist/AccountModal-DNK0IbiE.cjs +1 -0
  5. package/dist/AccountModal-DjAS4w6z.cjs +20 -0
  6. package/dist/AccountModal-DjAS4w6z.cjs.map +1 -0
  7. package/dist/BaseModal-CWAI9-Bi.js +2 -0
  8. package/dist/BaseModal-CWAI9-Bi.js.map +1 -0
  9. package/dist/BaseModal-yevRjczw.cjs +2 -0
  10. package/dist/BaseModal-yevRjczw.cjs.map +1 -0
  11. package/dist/ConnectModal-BXbiUwnz.js +1 -0
  12. package/dist/ConnectModal-C50EF9gE.js +2 -0
  13. package/dist/ConnectModal-C50EF9gE.js.map +1 -0
  14. package/dist/ConnectModal-CvkkVALe.cjs +1 -0
  15. package/dist/ConnectModal-DmIkWb1i.cjs +2 -0
  16. package/dist/ConnectModal-DmIkWb1i.cjs.map +1 -0
  17. package/dist/DisconnectConfirmContent-B4qahKqQ.cjs +2 -0
  18. package/dist/DisconnectConfirmContent-B4qahKqQ.cjs.map +1 -0
  19. package/dist/DisconnectConfirmContent-C9qLnI-m.js +2 -0
  20. package/dist/DisconnectConfirmContent-C9qLnI-m.js.map +1 -0
  21. package/dist/LegalDocumentsModal-5sNOrJI9.js +1 -0
  22. package/dist/LegalDocumentsModal-aWgfKwIL.js +2 -0
  23. package/dist/LegalDocumentsModal-aWgfKwIL.js.map +1 -0
  24. package/dist/LegalDocumentsModal-fnhM40y6.cjs +2 -0
  25. package/dist/LegalDocumentsModal-fnhM40y6.cjs.map +1 -0
  26. package/dist/LegalDocumentsModal-g54lP0U7.cjs +1 -0
  27. package/dist/PrivyCrossAppProvider-B6oIXeWL.js +2 -0
  28. package/dist/PrivyCrossAppProvider-B6oIXeWL.js.map +1 -0
  29. package/dist/PrivyCrossAppProvider-C6aL4Qor.cjs +1 -0
  30. package/dist/PrivyCrossAppProvider-Ccu2yH99.js +1 -0
  31. package/dist/PrivyCrossAppProvider-DSuzrbqs.cjs +2 -0
  32. package/dist/PrivyCrossAppProvider-DSuzrbqs.cjs.map +1 -0
  33. package/dist/PrivyWalletProvider-BkqWSj75.cjs +2 -0
  34. package/dist/PrivyWalletProvider-BkqWSj75.cjs.map +1 -0
  35. package/dist/PrivyWalletProvider-DToo_u0W.js +2 -0
  36. package/dist/PrivyWalletProvider-DToo_u0W.js.map +1 -0
  37. package/dist/ShareButtons-B92JZp47.js +2 -0
  38. package/dist/ShareButtons-B92JZp47.js.map +1 -0
  39. package/dist/ShareButtons-CRMNerbz.cjs +2 -0
  40. package/dist/ShareButtons-CRMNerbz.cjs.map +1 -0
  41. package/dist/UpgradeSmartAccountModal-BAzmVxeJ.js +2 -0
  42. package/dist/UpgradeSmartAccountModal-BAzmVxeJ.js.map +1 -0
  43. package/dist/UpgradeSmartAccountModal-BGjTzYAm.cjs +1 -0
  44. package/dist/UpgradeSmartAccountModal-CpZo27Uk.js +1 -0
  45. package/dist/UpgradeSmartAccountModal-IMcihO0d.cjs +2 -0
  46. package/dist/UpgradeSmartAccountModal-IMcihO0d.cjs.map +1 -0
  47. package/dist/VechainKitThemeProvider-BM5258oA.cjs +75 -0
  48. package/dist/VechainKitThemeProvider-BM5258oA.cjs.map +1 -0
  49. package/dist/VechainKitThemeProvider-Di9a04Es.js +75 -0
  50. package/dist/VechainKitThemeProvider-Di9a04Es.js.map +1 -0
  51. package/dist/assets/index.cjs +1 -1
  52. package/dist/assets/index.d.cts +1 -1
  53. package/dist/assets/{index.d.mts → index.d.ts} +1 -1
  54. package/dist/assets/index.js +1 -0
  55. package/dist/{assets-BL24r-Yp.mjs → assets-CXk1qRDd.js} +5 -5
  56. package/dist/assets-CXk1qRDd.js.map +1 -0
  57. package/dist/{assets-DNJsQD7_.cjs → assets-YPd7adzM.cjs} +7 -7
  58. package/dist/assets-YPd7adzM.cjs.map +1 -0
  59. package/dist/chunk-DjWAcSYV.cjs +1 -0
  60. package/dist/components/index.cjs +1 -0
  61. package/dist/components/index.d.cts +6 -0
  62. package/dist/components/index.d.ts +6 -0
  63. package/dist/components/index.js +1 -0
  64. package/dist/components-QKLypcU1.cjs +2 -0
  65. package/dist/components-QKLypcU1.cjs.map +1 -0
  66. package/dist/components-k36uDisW.js +2 -0
  67. package/dist/components-k36uDisW.js.map +1 -0
  68. package/dist/hooks/index.cjs +1 -0
  69. package/dist/hooks/index.d.cts +6 -0
  70. package/dist/hooks/index.d.ts +6 -0
  71. package/dist/hooks/index.js +1 -0
  72. package/dist/hooks-C8eXQYIN.cjs +8 -0
  73. package/dist/hooks-C8eXQYIN.cjs.map +1 -0
  74. package/dist/hooks-DuTew9oP.js +8 -0
  75. package/dist/hooks-DuTew9oP.js.map +1 -0
  76. package/dist/{index-CpRbZET6.d.mts → index-BGQS0a81.d.ts} +564 -1581
  77. package/dist/index-BGQS0a81.d.ts.map +1 -0
  78. package/dist/index-Bqw0Cz5n.d.cts +587 -0
  79. package/dist/index-Bqw0Cz5n.d.cts.map +1 -0
  80. package/dist/index-BugHmddr.d.ts +587 -0
  81. package/dist/index-BugHmddr.d.ts.map +1 -0
  82. package/dist/{index-D4rz985m.d.cts → index-C8wbz8af.d.cts} +561 -1578
  83. package/dist/index-C8wbz8af.d.cts.map +1 -0
  84. package/dist/{index-CWViOs1U.d.mts → index-COoeacay.d.ts} +5 -5
  85. package/dist/index-COoeacay.d.ts.map +1 -0
  86. package/dist/{index-u3CPquCV.d.cts → index-CmGg4iaS.d.cts} +4 -4
  87. package/dist/{index-CWViOs1U.d.mts.map → index-CmGg4iaS.d.cts.map} +1 -1
  88. package/dist/index-DI_IPiLX.d.ts +324 -0
  89. package/dist/index-DI_IPiLX.d.ts.map +1 -0
  90. package/dist/index-DVxlUr9t.d.cts +324 -0
  91. package/dist/index-DVxlUr9t.d.cts.map +1 -0
  92. package/dist/index.cjs +1 -221
  93. package/dist/index.d.cts +6 -3
  94. package/dist/index.d.ts +6 -0
  95. package/dist/index.js +1 -0
  96. package/dist/network-Cs9YqDJ1.d.cts +536 -0
  97. package/dist/network-Cs9YqDJ1.d.cts.map +1 -0
  98. package/dist/network-yA5VWcPq.d.ts +536 -0
  99. package/dist/network-yA5VWcPq.d.ts.map +1 -0
  100. package/dist/providers/index.cjs +1 -0
  101. package/dist/providers/index.d.cts +3 -0
  102. package/dist/providers/index.d.ts +3 -0
  103. package/dist/providers/index.js +1 -0
  104. package/dist/providers-DImdr6Kk.cjs +124 -0
  105. package/dist/providers-DImdr6Kk.cjs.map +1 -0
  106. package/dist/providers-kA0lotaM.js +124 -0
  107. package/dist/providers-kA0lotaM.js.map +1 -0
  108. package/dist/ssrUtils-C_5ZY26i.cjs +2 -0
  109. package/dist/ssrUtils-C_5ZY26i.cjs.map +1 -0
  110. package/dist/ssrUtils-DSwxhTtm.js +2 -0
  111. package/dist/ssrUtils-DSwxhTtm.js.map +1 -0
  112. package/dist/utils/index.cjs +1 -1
  113. package/dist/utils/index.d.cts +2 -2
  114. package/dist/utils/index.d.ts +3 -0
  115. package/dist/utils/index.js +1 -0
  116. package/dist/utils-B2Eg9TD3.js +2 -0
  117. package/dist/utils-B2Eg9TD3.js.map +1 -0
  118. package/dist/utils-jW13BhAb.cjs +2 -0
  119. package/dist/utils-jW13BhAb.cjs.map +1 -0
  120. package/package.json +46 -9
  121. package/dist/assets/index.mjs +0 -1
  122. package/dist/assets-BL24r-Yp.mjs.map +0 -1
  123. package/dist/assets-DNJsQD7_.cjs.map +0 -1
  124. package/dist/index-CpRbZET6.d.mts.map +0 -1
  125. package/dist/index-D4rz985m.d.cts.map +0 -1
  126. package/dist/index-u3CPquCV.d.cts.map +0 -1
  127. package/dist/index.cjs.map +0 -1
  128. package/dist/index.d.mts +0 -3
  129. package/dist/index.mjs +0 -221
  130. package/dist/index.mjs.map +0 -1
  131. package/dist/utils/index.d.mts +0 -3
  132. package/dist/utils/index.mjs +0 -1
  133. package/dist/utils-BQ9mZctf.cjs +0 -2
  134. package/dist/utils-BQ9mZctf.cjs.map +0 -1
  135. package/dist/utils-BxZj2QIg.mjs +0 -2
  136. package/dist/utils-BxZj2QIg.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccountModal-DjAS4w6z.cjs","names":["copyToClipboard","safeCopyToClipboard","VStack","Text","HStack","Icon","LuSquareUser","IconButton","LuPencil","LuCheck","LuCopy","LuWallet","humanAddress","LuLogOut","useLocalStorage","LocalStorageKey","Button","HStack","TOKEN_LOGO_COMPONENTS","React","Image","TOKEN_LOGOS","Box","Text","VStack","formatCompactCurrency","useTotalBalance","useTokensWithValues","HStack","Skeleton","VStack","Text","Image","humanAddress","VStack","Skeleton","Image","useTokenBalances","React","BaseModal","ModalHeader","Text","ModalBody","VStack","SUPPORTED_GAS_TOKENS","Box","HStack","TOKEN_LOGO_COMPONENTS","Skeleton","formatGasCost","FormControl","FormLabel","Switch","ModalFooter","Button","GasFeeSummary: React.FC<GasFeeSummaryProps>","useVeChainKitConfig","useWallet","useGasTokenSelection","initialStates: Record<\n string,\n { cost: number; loading: boolean }\n >","useEstimateAllTokens","t","useTokenBalances","displayToken: GasTokenType | undefined","SUPPORTED_GAS_TOKENS","Divider","HStack","VStack","Text","Skeleton","formatGasCost","Button","React","TOKEN_LOGO_COMPONENTS","Icon","LuChevronDown","Box","HStack","Icon","LuCheck","Text","Button","HStack","Box","Image","Icon","VStack","Text","Tag","useWallet","useSwitchWallet","useOptionalDAppKitWallet","copyToClipboard","HStack","Button","Text","humanDomain","humanAddress","Icon","LuChevronRight","IconButton","LuArrowLeftRight","LuCheck","LuCopy","useTokensWithValues","useVeChainKitConfig","HStack","Circle","TOKEN_LOGO_COMPONENTS","React","TOKEN_LOGOS","Image","Text","useWallet","useTotalBalance","useRefreshBalances","useLocalStorage","LocalStorageKey","VStack","HStack","Heading","IconButton","Icon","LuRefreshCw","GoEye","GoEyeClosed","Button","LuChevronRight","QUICK_ACTIONS: QuickAction[]","LuArrowUpFromLine","LuArrowLeftRight","LuArrowDownToLine","IconButton","VStack","Icon","HStack","Text","Box","useWallet","useTotalBalance","useUpgradeRequired","Grid","Card","CardBody","HStack","VStack","Text","Tag","Alert","VStack","HStack","AlertIcon","Text","useVeChainKitConfig","useAccountModalOptions","StickyHeaderContainer","ModalBackButton","ModalHeader","Tag","ModalCloseButton","ModalBody","VStack","ModalFooter","useVeChainKitConfig","useCurrency","useWallet","useTokensWithValues","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","Container","ModalBody","VStack","InputGroup","Input","InputLeftElement","LuSearch","Text","Icon","LuSlash","ModalFooter","useVeChainKitConfig","useCurrency","useTokenPrices","useWallet","useAccountModalOptions","useTokensWithValues","formatCompactCurrency","convertToSelectedCurrency","useVechainDomain","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","HStack","Text","Box","FormControl","Input","Button","TOKEN_LOGO_COMPONENTS","React","Image","TOKEN_LOGOS","Icon","LuChevronDown","ModalFooter","useWallet","useGetAvatarOfAddress","useVeChainKitConfig","useGasTokenSelection","useAccountModalOptions","useUpgradeRequired","useUpgradeSmartAccountModal","getPicassoImage","React","useTransferERC20","useTransferVET","useGenericDelegatorFeeEstimation","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","Box","Text","HStack","ModalFooter","TransactionButtonAndStatus","useWallet","useAccountModalOptions","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","Container","ModalBody","VStack","QRCode","Text","ModalFooter","useVeChainKitConfig","useCurrency","useWallet","useTokenPrices","useTokensWithValues","compareAddresses","t","convertToSelectedCurrency","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","Container","ModalBody","VStack","Box","Badge","HStack","Text","TOKEN_LOGO_COMPONENTS","React","TOKEN_LOGOS","Image","Tooltip","formatCompactCurrency","Icon","LuChevronUp","LuChevronDown","Collapse","ModalFooter","zeroAddress","allEvents: Event[]","allTransfers: Transfer[]","IERC20__factory","fromAmount: bigint | null","toAmount: bigint | null","useWallet","useCurrency","useVeChainKitConfig","useAccountModalOptions","useGasTokenSelection","useTokensWithValues","React","useTokenPrices","compareAddresses","t","getConfig","useSwapQuotes","convertToSelectedCurrency","useGenericDelegatorFeeEstimation","useSwapTransaction","swapDescription: string | undefined","TOKEN_LOGO_COMPONENTS","TOKEN_LOGOS","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","HStack","Text","Box","Input","Button","Image","Icon","LuChevronDown","formatCompactCurrency","Collapse","InputGroup","InputRightElement","LuArrowUp","LuArrowDown","ModalFooter","TransactionButtonAndStatus","useAccountModalOptions","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","Icon","LuSquareUser","Text","ModalFooter","Button","useWallet","useWalletMetadata","ListItem","HStack","getPicassoImage","VStack","Text","humanDomain","Tag","Box","Icon","LuTrash2","Accordion","AccordionItem","AccordionButton","LuChevronUp","LuChevronDown","AccordionPanel","List","useWallet","useVeChainKitConfig","useAccountModalOptions","useEnsRecordExists","useVechainDomain","useIsDomainProtected","useGetDomainsOfAddress","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","InputGroup","Input","InputRightElement","Box","Text","ModalFooter","Button","useAccountModalOptions","useWallet","useUpgradeRequired","useUpgradeSmartAccountModal","useGasTokenSelection","useVeChainKitConfig","useUnsetDomain","useClaimVeWorldSubdomain","useClaimVetDomain","React","useGenericDelegatorFeeEstimation","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","Icon","LuSquareUser","Text","ModalFooter","TransactionButtonAndStatus","VStack","InputGroup","Input","InputLeftElement","LuSearch","Icon","LuSlash","Text","Accordion","AccordionItem","AccordionButton","Box","LuChevronUp","LuChevronDown","AccordionPanel","useAccountModalOptions","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","Select","supportedLanguages","languageNames","Button","Link","VECHAIN_KIT_DOCS_BASE_URL","Icon","LuExternalLink","ModalFooter","useVeChainKitConfig","useWallet","useSingleImageUpload","uploadBlobToIPFS","changes: {\n avatarIpfsHash?: string;\n displayName?: string;\n description?: string;\n }","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","Box","Icon","LuCamera","Text","VStack","LuSquareUser","LuChevronRight","FormControl","FormLabel","Input","Textarea","ModalFooter","Button","useVeChainKitConfig","useWallet","useGasTokenSelection","useUpgradeRequired","useUpgradeSmartAccountModal","useGetResolverAddress","useUpdateTextRecord","React","domain","useGenericDelegatorFeeEstimation","VStack","Text","getAvatarQueryKey","convertUriToUrl","getAvatarOfAddressQueryKey","getTextRecordsQueryKey","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","Icon","LuFileText","ModalFooter","TransactionButtonAndStatus","useVeChainKitConfig","useWalletMetadata","getPicassoImage","VStack","Box","Icon","LuPencil","Text","HStack","Link","LuMail","LuGlobe","FaXTwitter","useWallet","useUpgradeRequired","IconButton","Box","Icon","LuSettings2","useWallet","useSwitchWallet","useOptionalDAppKitWallet","useTotalBalance","useLocalStorage","LocalStorageKey","StickyHeaderContainer","ModalHeader","ModalCloseButton","ModalBody","VStack","ModalFooter","HStack","Button","Icon","LuWalletCards","Text","LuArrowLeftRight","LuLogOut","useWallet","useUpgradeRequired","useUpgradeSmartAccount","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","Text","HStack","Box","Circle","Image","Heading","Icon","LuArrowRight","Alert","AlertIcon","AlertTitle","AlertDescription","ModalFooter","TransactionButtonAndStatus","Button","useWallet","useTokensWithValues","useVeChainKitConfig","useCurrency","useAccountModalOptions","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","Container","ModalBody","InputGroup","Input","InputLeftElement","LuSearch","VStack","ModalFooter","Button","Icon","LuPencil","useCustomTokens","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","Box","FormControl","FormLabel","Input","Text","HStack","Image","TOKEN_LOGOS","humanAddress","Button","LuTrash2","ModalFooter","useCurrency","Button","HStack","Text","CURRENCY_SYMBOLS","Icon","LuCheck","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","ModalFooter","Button","Text","languageNames","Icon","LuCheck","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","supportedLanguages","ModalFooter","SUPPORTED_GAS_TOKENS","useVeChainKitConfig","Box","HStack","Icon","LuGripVertical","VStack","Text","Switch","useGasTokenSelection","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","Text","Alert","AlertIcon","AlertDescription","DEFAULT_MFA_ENROLLMENT_STATE: UseOptionalMfaEnrollmentReturnType","useVeChainKitConfig","mfaResult: ReturnType<typeof useMfaEnrollment> | null","useAccountModalOptions","useOptionalPrivy","useVeChainKitConfig","useWallet","useUpgradeRequired","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","Text","LuDollarSign","LuChevronRight","LuLanguages","LuFuel","LuShield","LuLogOut","LuSettings2","Box","LuFingerprint","LuKey","LuShieldCheck","LuUserCog","LuUnlink","LuLayoutGrid","LuCircleHelp","ModalFooter","VStack","Icon","Text","LegalDocumentSource","LegalDocumentType","HStack","Tag","Text","AccordionItem","AccordionButton","VStack","Text","Icon","LuChevronUp","LuChevronDown","AccordionPanel","HStack","LuCheck","Button","useWallet","useVeChainKitConfig","useLegalDocuments","compareAddresses","VECHAIN_KIT_TERMS_CONFIG","LegalDocumentType","LegalDocumentSource","agreements","indices: number[]","LuGavel","VStack","Accordion","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","ModalFooter","useVeChainKitConfig","useTotalBalance","useWalletMetadata","Card","CardBody","HStack","VStack","Text","humanDomain","humanAddress","Box","Icon","LuCheck","IconButton","LuTrash2","simpleHash","useAccountModalOptions","useWallet","useOptionalDAppKitWallet","useOptionalDAppKitWalletModal","useSwitchWallet","useWalletStorage","useRefreshBalances","StickyHeaderContainer","ModalBackButton","ModalHeader","ModalCloseButton","ModalBody","VStack","Heading","ModalFooter","Button","LuPlus","LuLogOut","useVeChainKitConfig","useWalletMetadata","humanDomain","humanAddress","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","Icon","LuTrash2","Text","ModalFooter","Button","useWallet","useOptionalDAppKitWallet","useVeChainKitConfig","useFetchAppInfo","useFetchPrivyStatus","useGetAccountVersion","HStack","Text","VStack","Spinner","Divider","getConfig","humanAddress","Icon","LuCheck","LuCopy","packageJson.version","useWallet","useVeChainKitConfig","useCrossAppConnectionCache","VStack","Text","HStack","PrivyLogo","Icon","LuMinus","VechainLogo","Image","useCrossAppConnectionCache","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","ModalFooter","VStack","Text","Button","useVeChainKitConfig","FcGoogle","LuMail","LuFingerprint","LuWallet","FaXTwitter","LuPhone","FaSpotify","FaApple","FaInstagram","FaTiktok","LuGithub","FaLinkedin","FaTelegram","SiFarcaster","FaDiscord","humanAddress","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","ModalFooter","Flex","Icon","LuPlus","LuArchive","LuBell","Alert","AlertIcon","Box","AlertTitle","AlertDescription","IconButton","LuCircleX","useAccountModalOptions","useNotifications","StickyHeaderContainer","ModalBackButton","ModalHeader","ModalCloseButton","Container","ModalBody","VStack","HStack","Button","Icon","LuBell","LuArchive","ModalFooter","Tag","Card","Box","CardBody","VStack","Image","notFoundImage","Text","useXAppMetadata","useIpfsImage","Skeleton","useEcosystemShortcuts","VStack","Text","Grid","GridItem","Card","CardBody","Image","notFoundImage","Box","Text","Wrap","WrapItem","Tag","DEFAULT_APPS: XAppMetadata[]","VEBETTERDAO_GOVERNANCE_BASE_URL","COINMARKETCAP_STATIC_BASE_URL","VET_DOMAINS_BASE_URL","useVeChainKitConfig","useAccountModalOptions","useCurrentAllocationsRoundId","useMostVotedAppsInRound","useAppHubApps","useEcosystemShortcuts","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","Text","InputGroup","Input","InputLeftElement","LuSearch","Grid","GridItem","Center","Spinner","ModalFooter","useEcosystemShortcuts","Button","Icon","LuBookmarkCheck","LuBookmark","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","Flex","Image","HStack","Text","ModalFooter","Button","Icon","LuExternalLink","useVeChainKitConfig","getConfig","StickyHeaderContainer","ModalHeader","ModalCloseButton","ModalBody","VStack","Icon","LuCircleCheck","Text","ShareButtons","ModalFooter","Button","Link","HStack","LuExternalLink","useVeChainKitConfig","getConfig","StickyHeaderContainer","ModalHeader","ModalCloseButton","ModalBody","VStack","Icon","LuCircleAlert","Text","ModalFooter","Button","Link","HStack","LuExternalLink","useWallet","useVechainKitThemeConfig","useModal","DisconnectConfirmContent","BaseModal"],"sources":["../src/components/common/AddressDisplay.tsx","../package.json","../src/components/common/AssetButton.tsx","../src/components/common/AddressDisplayCard.tsx","../src/components/common/ScrollToTopWrapper.tsx","../src/components/common/AccountAvatar.tsx","../src/components/common/GasFeeTokenSelector.tsx","../src/components/common/GasFeeSummary.tsx","../src/components/common/InlineFeedback.tsx","../src/components/common/WalletSwitchFeedback.tsx","../src/components/AccountModal/Components/ActionButton.tsx","../src/components/AccountModal/Components/AccountSelector.tsx","../src/components/WalletButton/AssetIcons.tsx","../src/components/AccountModal/Components/BalanceSection.tsx","../src/components/AccountModal/Components/QuickActionsSection.tsx","../src/components/AccountModal/Components/Alerts/FeatureAnnouncementCard.tsx","../src/components/AccountModal/Components/Alerts/DomainRequiredAlert.tsx","../src/components/AccountModal/Contents/Account/AccountMainContent.tsx","../src/components/AccountModal/Contents/SendToken/SelectTokenContent.tsx","../src/components/AccountModal/Contents/SendToken/SendTokenContent.tsx","../src/components/AccountModal/Contents/SendToken/SendTokenSummaryContent.tsx","../src/components/AccountModal/Contents/Receive/ReceiveTokenContent.tsx","../src/components/AccountModal/Contents/Swap/SelectQuoteContent.tsx","../src/utils/swap/extractSwapAmounts.ts","../src/components/AccountModal/Contents/Swap/SwapTokenContent.tsx","../src/components/AccountModal/Contents/ChooseName/ChooseNameContent.tsx","../src/components/AccountModal/Contents/ChooseName/Components/ExistingDomainsList.tsx","../src/components/AccountModal/Contents/ChooseName/ChooseNameSearchContent.tsx","../src/components/AccountModal/Contents/ChooseName/ChooseNameSummaryContent.tsx","../src/components/AccountModal/Contents/FAQ/FAQAccordion.tsx","../src/components/AccountModal/Contents/FAQ/FAQContent.tsx","../src/components/AccountModal/Contents/Profile/Customization/CustomizationContent.tsx","../src/components/AccountModal/Contents/Profile/Customization/CustomizationSummaryContent.tsx","../src/components/AccountModal/Contents/Profile/Components/ProfileCard/ProfileCard.tsx","../src/components/common/ModalSettingsButton.tsx","../src/components/AccountModal/Contents/Profile/ProfileContent.tsx","../src/components/AccountModal/Contents/UpgradeSmartAccount/UpgradeSmartAccountContent.tsx","../src/components/AccountModal/Contents/Assets/AssetsContent.tsx","../src/components/AccountModal/Contents/Assets/ManageCustomTokenContent.tsx","../src/components/AccountModal/Contents/KitSettings/ChangeCurrencyContent.tsx","../src/components/AccountModal/Contents/KitSettings/LanguageSettingsContent.tsx","../src/components/AccountModal/Contents/KitSettings/GasTokenDragList.tsx","../src/components/AccountModal/Contents/KitSettings/GasTokenSettingsContent.tsx","../src/hooks/api/privy/useOptionalMfaEnrollment.ts","../src/components/AccountModal/Contents/KitSettings/SettingsContent.tsx","../src/components/common/EmptyContent.tsx","../src/utils/dateUtils.ts","../src/components/AccountModal/Contents/TermsAndPrivacy/AcceptedPolicyItem.tsx","../src/components/AccountModal/Contents/TermsAndPrivacy/PolicyAccordion.tsx","../src/components/AccountModal/Contents/TermsAndPrivacy/TermsAndPrivacyAccordion.tsx","../src/components/AccountModal/Contents/TermsAndPrivacy/TermsAndPrivacyContent.tsx","../src/components/AccountModal/Contents/SelectWallet/Components/WalletCard.tsx","../src/components/AccountModal/Contents/SelectWallet/SelectWalletContent.tsx","../src/components/AccountModal/Contents/SelectWallet/RemoveWalletConfirmContent.tsx","../src/components/AccountModal/Contents/ConnectionDetails/Components/ConnectionCard.tsx","../src/components/AccountModal/Contents/ConnectionDetails/Components/WalletSecuredBy.tsx","../src/components/AccountModal/Contents/ConnectionDetails/ConnectionDetailsContent.tsx","../src/components/AccountModal/Contents/PrivyLinkedAccounts/PrivyLinkedAccounts.tsx","../src/components/AccountModal/Contents/Notifications/Components/EmptyNotifications.tsx","../src/components/AccountModal/Contents/Notifications/Components/NotificationItem.tsx","../src/components/AccountModal/Contents/Notifications/NotificationContent.tsx","../src/components/AccountModal/Contents/Ecosystem/Components/CategoryLabel.tsx","../src/components/AccountModal/Contents/Ecosystem/Components/SharedAppCard.tsx","../src/components/AccountModal/Contents/Ecosystem/Components/AppComponent.tsx","../src/components/AccountModal/Contents/Ecosystem/Components/CustomAppComponent.tsx","../src/components/AccountModal/Contents/Ecosystem/Components/ShortcutsSection.tsx","../src/components/AccountModal/Contents/Ecosystem/Components/CategoryFilterSection.tsx","../src/components/AccountModal/Contents/Ecosystem/ExploreEcosystemContent.tsx","../src/components/AccountModal/Contents/Ecosystem/Components/ShortcutButton.tsx","../src/components/AccountModal/Contents/Ecosystem/AppOverviewContent.tsx","../src/components/AccountModal/Contents/SuccessfulOperation/SuccessfulOperationContent.tsx","../src/components/AccountModal/Contents/FailedOperation/FailedOperationContent.tsx","../src/components/AccountModal/AccountModal.tsx"],"sourcesContent":["'use client';\n\nimport {\n Text,\n VStack,\n Icon,\n PropsOf,\n useToken,\n IconButton,\n HStack,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { useState } from 'react';\nimport {\n LuCopy,\n LuCheck,\n LuWallet,\n LuSquareUser,\n LuPencil,\n LuLogOut,\n} from 'react-icons/lu';\nimport { humanAddress } from '../../utils';\nimport { copyToClipboard as safeCopyToClipboard } from '../../utils/ssrUtils';\nimport type { Wallet } from '../../types';\n// Use a generic type to avoid circular dependency with AccountModal/Types\n// The full AccountModalContentTypes is complex and imports from Contents which imports from common\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AccountModalContentTypes = any;\nimport { useTranslation } from 'react-i18next';\n\ntype Props = {\n wallet: Wallet;\n label?: string;\n style?: PropsOf<typeof VStack>;\n showHumanAddress?: boolean;\n setCurrentContent?: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n onLogout?: () => void;\n};\n\nexport const AddressDisplay = ({\n wallet,\n label,\n style,\n showHumanAddress = true,\n setCurrentContent,\n onLogout,\n}: Props) => {\n const { t } = useTranslation();\n const [copied, setCopied] = useState(false);\n const [copiedDomain, setCopiedDomain] = useState(false);\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const borderColor = useColorModeValue('#ebebeb', '#ffffff0a');\n const bgColor = useColorModeValue('#ffffff', 'transparent');\n\n const copyToClipboard = async (\n textToCopy: string,\n setCopied: (value: boolean) => void,\n ) => {\n const success = await safeCopyToClipboard(textToCopy);\n if (success) {\n setCopied(true);\n setTimeout(() => {\n setCopied(false);\n }, 2000);\n }\n };\n\n const handleDomainEdit = () => {\n if (!setCurrentContent) return;\n\n if (wallet?.domain) {\n setCurrentContent({\n type: 'choose-name-search',\n props: {\n name: '',\n setCurrentContent,\n initialContentSource: 'profile',\n },\n });\n } else {\n setCurrentContent({\n type: 'choose-name',\n props: {\n setCurrentContent,\n initialContentSource: 'profile',\n onBack: () => setCurrentContent('profile'),\n },\n });\n }\n };\n\n return (\n <VStack w={'full'} justifyContent={'center'} {...style}>\n <VStack w={'full'} spacing={4}>\n {label && (\n <Text fontSize={'sm'} color={textSecondary}>\n {label}\n </Text>\n )}\n\n <VStack spacing={2} w={'full'}>\n {wallet?.domain && (\n <HStack\n w={'full'}\n spacing={3}\n px={4}\n py={2}\n borderWidth={1}\n borderColor={borderColor}\n borderRadius=\"md\"\n bg={bgColor}\n >\n <Icon as={LuSquareUser} color={textSecondary} />\n <Text\n flex={1}\n fontSize={'sm'}\n fontWeight={'700'}\n color={textPrimary}\n noOfLines={1}\n >\n {copiedDomain ? t('Copied!') : wallet.domain}\n </Text>\n <HStack spacing={2}>\n {setCurrentContent && (\n <IconButton\n icon={<LuPencil />}\n height=\"30px\"\n borderRadius=\"5px\"\n variant=\"vechainKitSecondary\"\n onClick={handleDomainEdit}\n aria-label=\"Edit domain\"\n />\n )}\n <IconButton\n icon={\n copiedDomain ? <LuCheck /> : <LuCopy />\n }\n height=\"30px\"\n borderRadius=\"5px\"\n variant=\"vechainKitSecondary\"\n onClick={() =>\n copyToClipboard(\n wallet.domain || '',\n setCopiedDomain,\n )\n }\n aria-label=\"Copy domain\"\n />\n </HStack>\n </HStack>\n )}\n\n <HStack\n w={'full'}\n spacing={3}\n px={4}\n py={2}\n borderWidth={1}\n borderColor={borderColor}\n borderRadius=\"md\"\n bg={bgColor}\n >\n <Icon as={LuWallet} color={textSecondary} />\n <Text\n flex={1}\n fontSize={'sm'}\n fontWeight={'700'}\n color={textPrimary}\n noOfLines={1}\n >\n {copied\n ? t('Copied!')\n : showHumanAddress\n ? humanAddress(wallet?.address ?? '', 8, 7)\n : wallet?.address}\n </Text>\n <HStack spacing={2}>\n <IconButton\n icon={<LuLogOut />}\n onClick={() =>\n setCurrentContent?.({\n type: 'disconnect-confirm',\n props: {\n onDisconnect: () => onLogout?.(),\n onBack: () =>\n setCurrentContent?.('profile'),\n },\n })\n }\n variant=\"vechainKitSecondary\"\n height=\"30px\"\n w=\"30px\"\n borderRadius=\"5px\"\n aria-label=\"Copy address\"\n />\n\n <IconButton\n icon={copied ? <LuCheck /> : <LuCopy />}\n onClick={() =>\n copyToClipboard(\n wallet?.address ?? '',\n setCopied,\n )\n }\n variant=\"vechainKitSecondary\"\n height=\"30px\"\n w=\"30px\"\n borderRadius=\"5px\"\n aria-label=\"Copy address\"\n />\n </HStack>\n </HStack>\n </VStack>\n </VStack>\n </VStack>\n );\n};\n","{\n \"name\": \"@vechain/vechain-kit\",\n \"version\": \"3.0.0-rc.1\",\n \"author\": \"VeChain Foundation\",\n \"homepage\": \"https://github.com/vechain/vechain-kit\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/vechain/vechain-kit.git\",\n \"directory\": \"packages/vechain-kit\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/vechain/vechain-kit/issues\"\n },\n \"description\": \"All-in-one React library for building VeChain applications with wallet integration, social logins, developer hooks, and pre-built UI components.\",\n \"license\": \"MIT\",\n \"sideEffects\": false,\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"keywords\": [\n \"vechain\",\n \"vechain-kit\",\n \"blockchain\",\n \"web3\",\n \"dapp\",\n \"react\",\n \"nextjs\",\n \"typescript\",\n \"vechain-thor\",\n \"social\",\n \"login\",\n \"wallet\",\n \"cross-app\",\n \"ecosystem\",\n \"privy\",\n \"veworld\",\n \"sync2\",\n \"walletconnect\",\n \"embedded-wallet\",\n \"smart-account\"\n ],\n \"files\": [\n \"dist\",\n \"package.json\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"tsc --noEmit && cross-env NODE_OPTIONS='--max-old-space-size=8192' tsdown\",\n \"watch\": \"cross-env NODE_OPTIONS='--max-old-space-size=8192' tsdown --watch\",\n \"clean\": \"rm -rf dist .turbo\",\n \"lint\": \"eslint\",\n \"purge\": \"yarn clean && rm -rf node_modules\",\n \"translate\": \"dotenv -e .env -- translo-cli\",\n \"typecheck\": \"tsc --noEmit\",\n \"analyze\": \"./analyze.sh\",\n \"size\": \"size-limit\",\n \"size:check\": \"size-limit --limit\"\n },\n \"dependencies\": {\n \"@adraffy/ens-normalize\": \"^1.11.0\",\n \"@chakra-ui/react\": \"^2.8.2\",\n \"@emotion/styled\": \"^11.14.1\",\n \"@privy-io/cross-app-connect\": \"0.2.2\",\n \"@privy-io/react-auth\": \"2.24.0\",\n \"@solana/web3.js\": \"^1.98.0\",\n \"@tanstack/react-query\": \"^5.64.2\",\n \"@tanstack/react-query-devtools\": \"^5.64.1\",\n \"@vechain/contract-getters\": \"1.0.4\",\n \"@vechain/dapp-kit-react\": \"2.1.0-rc.5\",\n \"@vechain/picasso\": \"^2.1.1\",\n \"@vechain/vechain-contract-types\": \"1.6.0-rc\",\n \"@wagmi/core\": \"^2.17.2\",\n \"bignumber.js\": \"^9.1.2\",\n \"browser-image-compression\": \"^2.0.2\",\n \"dotenv\": \"^16.4.7\",\n \"ethers\": \"^6.13.5\",\n \"framer-motion\": \"^11.15.0\",\n \"i18next\": \"^24.2.1\",\n \"i18next-browser-languagedetector\": \"^8.0.2\",\n \"net\": \"^1.0.2\",\n \"process\": \"^0.11.10\",\n \"react\": \"^18.2.0\",\n \"react-device-detect\": \"^2.2.3\",\n \"react-hook-form\": \"^7.54.2\",\n \"react-i18next\": \"^15.4.0\",\n \"react-icons\": \"^5.4.0\",\n \"react-qrcode-logo\": \"^3.0.0\",\n \"vaul\": \"^1.1.2\",\n \"viem\": \"^2.29.3\",\n \"wagmi\": \"^2.15.4\"\n },\n \"devDependencies\": {\n \"@size-limit/file\": \"^11.2.0\",\n \"@types/react\": \"^18.2.28\",\n \"@types/react-dom\": \"^18.2.13\",\n \"cross-env\": \"^7.0.3\",\n \"dotenv-cli\": \"^8.0.0\",\n \"eslint\": \"^9.12.0\",\n \"eslint-plugin-i18next\": \"^6.1.1\",\n \"size-limit\": \"^11.2.0\",\n \"source-map-explorer\": \"^2.5.3\",\n \"translo-cli\": \"^1.0.6\",\n \"tsdown\": \"^0.16.5\",\n \"typescript\": \"*\"\n },\n \"peerDependencies\": {\n \"@chakra-ui/react\": \"^2.8.2\",\n \"@emotion/react\": \"^11.0.0\",\n \"@emotion/styled\": \"^11.0.0\",\n \"@tanstack/react-query\": \"^5.64.2\",\n \"@vechain/dapp-kit-react\": \"2.1.0-rc.5\",\n \"framer-motion\": \"^11.0.0\",\n \"react\": \"^18.0.0\",\n \"react-dom\": \"^18.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@chakra-ui/react\": {\n \"optional\": true\n },\n \"@emotion/react\": {\n \"optional\": true\n },\n \"@emotion/styled\": {\n \"optional\": true\n },\n \"@tanstack/react-query\": {\n \"optional\": true\n },\n \"@vechain/dapp-kit-react\": {\n \"optional\": true\n },\n \"framer-motion\": {\n \"optional\": true\n }\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./hooks\": {\n \"import\": {\n \"types\": \"./dist/hooks/index.d.ts\",\n \"default\": \"./dist/hooks/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/hooks/index.d.cts\",\n \"default\": \"./dist/hooks/index.cjs\"\n }\n },\n \"./components\": {\n \"import\": {\n \"types\": \"./dist/components/index.d.ts\",\n \"default\": \"./dist/components/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/components/index.d.cts\",\n \"default\": \"./dist/components/index.cjs\"\n }\n },\n \"./providers\": {\n \"import\": {\n \"types\": \"./dist/providers/index.d.ts\",\n \"default\": \"./dist/providers/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/providers/index.d.cts\",\n \"default\": \"./dist/providers/index.cjs\"\n }\n },\n \"./utils\": {\n \"import\": {\n \"types\": \"./dist/utils/index.d.ts\",\n \"default\": \"./dist/utils/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/utils/index.d.cts\",\n \"default\": \"./dist/utils/index.cjs\"\n }\n },\n \"./assets\": {\n \"import\": {\n \"types\": \"./dist/assets/index.d.ts\",\n \"default\": \"./dist/assets/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/assets/index.d.cts\",\n \"default\": \"./dist/assets/index.cjs\"\n }\n }\n }\n}\n","import {\n Button,\n HStack,\n Image,\n Text,\n Box,\n VStack,\n ButtonProps,\n useToken,\n} from '@chakra-ui/react';\nimport { TOKEN_LOGOS, TOKEN_LOGO_COMPONENTS } from '../../utils/constants';\nimport React from 'react';\nimport type { CURRENCY } from '../../types';\n// Import directly from specific hook file to avoid circular dependency with hooks/index.ts\nimport { LocalStorageKey, useLocalStorage } from '../../hooks/cache/useLocalStorage';\nimport {\n formatCompactCurrency,\n SupportedCurrency,\n} from '../../utils/currencyUtils';\n\ntype AssetButtonProps = ButtonProps & {\n symbol: string;\n amount: number;\n currencyValue: number;\n currentCurrency: CURRENCY;\n isDisabled?: boolean;\n onClick?: () => void;\n};\n\nexport const AssetButton = ({\n symbol,\n amount,\n currencyValue,\n currentCurrency,\n isDisabled,\n onClick,\n ...buttonProps\n}: AssetButtonProps) => {\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const [showAssets] = useLocalStorage(LocalStorageKey.SHOW_ASSETS, true);\n\n return (\n <Button\n height=\"72px\"\n variant=\"ghost\"\n justifyContent=\"space-between\"\n isDisabled={isDisabled}\n p={4}\n w=\"100%\"\n _disabled={{\n cursor: 'not-allowed',\n opacity: 0.5,\n }}\n onClick={onClick}\n data-testid={`asset-${symbol}`}\n {...buttonProps}\n >\n <HStack>\n {TOKEN_LOGO_COMPONENTS[symbol] ? (\n React.cloneElement(TOKEN_LOGO_COMPONENTS[symbol], {\n boxSize: '24px',\n borderRadius: 'full',\n })\n ) : (\n <Image\n src={TOKEN_LOGOS[symbol]}\n alt={`${symbol} logo`}\n boxSize=\"24px\"\n borderRadius=\"full\"\n fallback={\n <Box\n boxSize=\"24px\"\n borderRadius=\"full\"\n bg=\"whiteAlpha.200\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Text\n fontSize=\"10px\"\n fontWeight=\"bold\"\n color={textPrimary}\n >\n {symbol.slice(0, 3)}\n </Text>\n </Box>\n }\n />\n )}\n <Text color={textPrimary}>{symbol}</Text>\n </HStack>\n <VStack align=\"flex-end\" spacing={0}>\n <Text color={textPrimary}>\n {showAssets ? amount.toLocaleString(undefined, {\n maximumFractionDigits: 2,\n }) : '*'.repeat(4)}{' '}\n </Text>\n <Text\n fontSize=\"sm\"\n color={textSecondary}\n data-testid={`${symbol}-balance`}\n >\n {showAssets ? formatCompactCurrency(currencyValue, {\n currency: currentCurrency as SupportedCurrency,\n }) : '*'.repeat(4)}\n </Text>\n </VStack>\n </Button>\n );\n};\n","import {\n Text,\n HStack,\n VStack,\n Image,\n Skeleton,\n useToken,\n} from '@chakra-ui/react';\nimport { humanAddress } from '../../utils';\n// Import directly from specific hook files to avoid circular dependency with hooks/index.ts\nimport { useTotalBalance } from '../../hooks/api/wallet/useTotalBalance';\nimport { useTokensWithValues } from '../../hooks/api/wallet/useTokensWithValues';\nimport { useTranslation } from 'react-i18next';\nimport { useMemo } from 'react';\n\ntype AddressDisplayCardProps = {\n address: string;\n domain?: string;\n imageSrc: string;\n imageAlt?: string;\n hideAddress?: boolean;\n balance?: number;\n tokenAddress?: string;\n};\n\nexport const AddressDisplayCard = ({\n address,\n domain,\n imageSrc,\n imageAlt = 'Account',\n hideAddress = false,\n balance,\n tokenAddress,\n}: AddressDisplayCardProps) => {\n const { t } = useTranslation();\n\n const textColor = useToken('colors', 'vechain-kit-text-primary');\n const secondaryTextColor = useToken('colors', 'vechain-kit-text-secondary');\n const cardBg = useToken('colors', 'vechain-kit-card');\n\n const { isLoading: totalBalanceLoading } = useTotalBalance({ address });\n const { tokens, isLoading: tokensLoading } = useTokensWithValues({\n address,\n });\n\n // Find token by address if specified\n const tokenData = useMemo(() => {\n if (!tokenAddress) return null;\n return tokens.find((token) => token.address === tokenAddress);\n }, [tokens, tokenAddress]);\n\n // Determine what balance to display\n const displayBalance = useMemo(() => {\n // If balance is explicitly provided, always use that\n if (balance !== undefined) return balance;\n\n // Otherwise, find the actual token balance, not its currency value\n if (tokenData) {\n return Number(tokenData.balance);\n }\n return 0;\n }, [balance, tokenData]);\n\n const displaySymbol = tokenData?.symbol || '';\n const isLoading = totalBalanceLoading || tokensLoading;\n\n if (isLoading) {\n return (\n <HStack\n minH={'50px'}\n justify=\"space-between\"\n p={4}\n borderRadius=\"2xl\"\n bg={cardBg}\n >\n <HStack>\n <Skeleton boxSize=\"40px\" borderRadius=\"full\" />\n <VStack align=\"start\" spacing={0}>\n <Skeleton\n height=\"16px\"\n width=\"120px\"\n borderRadius=\"md\"\n />\n {!hideAddress && (\n <Skeleton\n mt={2}\n height=\"12px\"\n width=\"100px\"\n borderRadius=\"md\"\n />\n )}\n </VStack>\n </HStack>\n\n <VStack\n justify=\"flex-start\"\n align=\"flex-end\"\n spacing={0}\n mr={2}\n >\n <Text fontSize=\"sm\" fontWeight=\"medium\" color={textColor}>\n {t('Balance')}\n </Text>\n <Skeleton height=\"12px\" width=\"80px\" borderRadius=\"md\" />\n </VStack>\n </HStack>\n );\n }\n\n return (\n <HStack\n minH={'50px'}\n justify=\"space-between\"\n p={4}\n borderRadius=\"2xl\"\n bg={cardBg}\n >\n <HStack>\n <Image\n src={imageSrc}\n alt={imageAlt}\n boxSize=\"40px\"\n borderRadius=\"full\"\n objectFit=\"cover\"\n />\n <VStack align=\"start\" spacing={0}>\n {domain ? (\n <>\n <Text\n fontWeight=\"medium\"\n fontSize=\"sm\"\n color={textColor}\n >\n {domain}\n </Text>\n {!hideAddress && (\n <Text fontSize=\"xs\" color={secondaryTextColor}>\n {humanAddress(address, 6, 4)}\n </Text>\n )}\n </>\n ) : (\n <Text\n fontWeight=\"medium\"\n fontSize=\"sm\"\n color={textColor}\n >\n {humanAddress(address, 6, 4)}\n </Text>\n )}\n </VStack>\n </HStack>\n\n <VStack justify=\"flex-start\" align=\"flex-end\" spacing={0} mr={2}>\n <Text fontSize=\"sm\" fontWeight=\"medium\" color={textColor}>\n {t('Balance')}\n </Text>\n <Text fontSize=\"xs\" color={secondaryTextColor}>\n {displayBalance.toLocaleString(undefined, {\n maximumFractionDigits: 2,\n })}\n {displaySymbol && ` ${displaySymbol}`}\n </Text>\n </VStack>\n </HStack>\n );\n};\n","import { VStack, StackProps } from '@chakra-ui/react';\nimport { useScrollToTop } from '../../hooks/utils/useScrollToTop';\n\nexport const ScrollToTopWrapper = ({ children, ...props }: StackProps) => {\n useScrollToTop();\n\n return <VStack {...props}>{children}</VStack>;\n};\n","import type { Wallet } from '../../types';\nimport { Image, ImageProps, Skeleton } from '@chakra-ui/react';\nimport { useRef, useEffect } from 'react';\n\ntype AccountAvatarProps = {\n wallet?: Wallet;\n props?: ImageProps;\n};\n\nexport const AccountAvatar = ({ wallet, props }: AccountAvatarProps) => {\n // Store the previous image URL to maintain during loading\n // Use wallet address as key to ensure ref is reset when wallet changes\n const previousImageRef = useRef<string | undefined>(wallet?.image);\n const walletAddressRef = useRef<string | undefined>(wallet?.address);\n\n // Reset ref when wallet address changes\n useEffect(() => {\n if (walletAddressRef.current !== wallet?.address) {\n previousImageRef.current = wallet?.image;\n walletAddressRef.current = wallet?.address;\n }\n }, [wallet?.address]);\n\n // Update the ref when we have a valid image and it's not loading\n useEffect(() => {\n if (wallet?.image && !wallet.isLoadingMetadata) {\n previousImageRef.current = wallet.image;\n }\n }, [wallet?.image, wallet?.isLoadingMetadata]);\n\n if (\n (!props?.src && !wallet?.image && !previousImageRef.current) ||\n wallet?.isLoadingMetadata\n ) {\n return (\n <Skeleton\n rounded=\"full\"\n width={props?.width}\n height={props?.height}\n />\n );\n }\n return (\n <Image\n src={props?.src || wallet?.image || previousImageRef.current}\n alt={props?.alt || wallet?.domain}\n objectFit=\"cover\"\n rounded=\"full\"\n // fallbackSrc={getPicassoImage(wallet?.address ?? '')}\n {...props}\n />\n );\n};\n","import React from 'react';\nimport {\n ModalHeader,\n ModalBody,\n ModalFooter,\n Button,\n VStack,\n HStack,\n Text,\n Box,\n Skeleton,\n Switch,\n FormControl,\n FormLabel,\n useToken,\n} from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport type { GasTokenType } from '../../types/gasToken';\nimport { SUPPORTED_GAS_TOKENS, TOKEN_LOGO_COMPONENTS } from '../../utils/constants';\nimport { formatGasCost } from '../../types/gasEstimation';\n// Direct import to avoid circular dependency through hooks barrel\nimport { useTokenBalances } from '../../hooks/api/wallet/useTokenBalances';\nimport { BaseModal } from './BaseModal';\n\ninterface GasFeeTokenSelectorProps {\n isOpen: boolean;\n onClose: () => void;\n selectedToken: GasTokenType;\n onTokenSelect: (token: GasTokenType, rememberChoice: boolean) => void;\n availableTokens: GasTokenType[];\n tokenEstimations: Record<GasTokenType, { cost: number; loading: boolean }>;\n walletAddress: string;\n}\n\nexport const GasFeeTokenSelector = ({\n isOpen,\n onClose,\n selectedToken,\n onTokenSelect,\n availableTokens,\n tokenEstimations,\n walletAddress,\n}: GasFeeTokenSelectorProps) => {\n const { t } = useTranslation();\n const { balances } = useTokenBalances(walletAddress);\n const [tempSelectedToken, setTempSelectedToken] =\n React.useState(selectedToken);\n const [rememberChoice, setRememberChoice] = React.useState(false);\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const textTertiary = useToken('colors', 'vechain-kit-text-tertiary');\n const errorColor = useToken('colors', 'vechain-kit-error');\n\n const itemBg = (selected: boolean) =>\n selected ? textTertiary : 'transparent';\n const itemBorderColor = (selected: boolean) =>\n selected ? textPrimary : 'transparent';\n\n React.useEffect(() => {\n if (isOpen) {\n setTempSelectedToken(selectedToken);\n setRememberChoice(false);\n }\n }, [isOpen, selectedToken]);\n\n const handleApply = () => {\n onTokenSelect(tempSelectedToken, rememberChoice);\n onClose();\n };\n\n const getTokenBalance = (tokenSymbol: string) => {\n const balance = balances.find((b) => b.symbol === tokenSymbol);\n return balance\n ? Number(balance.balance).toLocaleString(undefined, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })\n : '0.00';\n };\n\n const hasInsufficientBalance = (tokenSymbol: GasTokenType) => {\n const balance = balances.find((b) => b.symbol === tokenSymbol);\n const estimation = tokenEstimations[tokenSymbol];\n if (!balance || !estimation) return false;\n return Number(balance.balance) < estimation.cost;\n };\n\n return (\n <BaseModal isOpen={isOpen} onClose={onClose} size=\"sm\">\n <ModalHeader>\n <Text fontSize=\"lg\" fontWeight=\"semibold\" color={textPrimary}>\n {t('Fee token')}\n </Text>\n <Text\n fontSize=\"sm\"\n fontWeight=\"normal\"\n color={textSecondary}\n mt={1}\n >\n {t('Select the token to pay the fee with')}\n </Text>\n </ModalHeader>\n\n <ModalBody>\n <VStack spacing={2} align=\"stretch\">\n {availableTokens.map((token) => {\n const tokenInfo = SUPPORTED_GAS_TOKENS[token];\n const isSelected = tempSelectedToken === token;\n const estimation = tokenEstimations[token] || {\n cost: 0,\n loading: true,\n };\n const insufficient = hasInsufficientBalance(token);\n\n return (\n <Box\n key={token}\n cursor={\n insufficient ? 'not-allowed' : 'pointer'\n }\n bg={itemBg(isSelected)}\n border=\"1px\"\n borderColor={itemBorderColor(isSelected)}\n borderRadius=\"md\"\n p={3}\n transition=\"all 0.2s ease\"\n _hover={{\n backgroundColor: insufficient\n ? itemBg(isSelected)\n : textSecondary\n ? '#ffffff12'\n : textSecondary,\n borderColor: insufficient\n ? itemBorderColor(isSelected)\n : textSecondary,\n }}\n opacity={insufficient ? 0.5 : 1}\n onClick={() =>\n !insufficient && setTempSelectedToken(token)\n }\n >\n <HStack spacing={3} justify=\"space-between\">\n <HStack spacing={3} flex={1}>\n {React.cloneElement(\n TOKEN_LOGO_COMPONENTS[token],\n {\n boxSize: '36px',\n borderRadius: 'full',\n },\n )}\n <VStack align=\"start\" spacing={0}>\n <Text\n fontWeight=\"medium\"\n color={textPrimary}\n >\n {tokenInfo.symbol}\n </Text>\n <Text\n fontSize=\"xs\"\n color={textSecondary}\n >\n {t('Balance')}:{' '}\n {getTokenBalance(token)}\n </Text>\n {insufficient && (\n <Text\n fontSize=\"xs\"\n color={errorColor}\n >\n {t('Insufficient balance')}\n </Text>\n )}\n </VStack>\n </HStack>\n <VStack align=\"end\" spacing={0}>\n {estimation.loading ? (\n <Skeleton\n height=\"16px\"\n width=\"60px\"\n />\n ) : (\n <>\n <Text\n fontSize=\"sm\"\n fontWeight=\"semibold\"\n color={textPrimary}\n >\n {formatGasCost(\n estimation.cost,\n 2,\n )}\n </Text>\n <Text\n fontSize=\"xs\"\n color={textSecondary}\n >\n {tokenInfo.symbol}\n </Text>\n </>\n )}\n </VStack>\n </HStack>\n </Box>\n );\n })}\n\n {tempSelectedToken !== selectedToken && (\n <FormControl\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n <FormLabel\n htmlFor=\"remember-choice\"\n mb=\"0\"\n fontSize=\"sm\"\n color={textPrimary}\n >\n {t('Use this token for future transactions')}\n </FormLabel>\n <Switch\n id=\"remember-choice\"\n isChecked={rememberChoice}\n onChange={(e) =>\n setRememberChoice(e.target.checked)\n }\n color={textPrimary}\n />\n </FormControl>\n )}\n </VStack>\n </ModalBody>\n\n <ModalFooter>\n <VStack spacing={3} w=\"full\">\n <Button\n variant=\"vechainKitPrimary\"\n onClick={handleApply}\n isDisabled={hasInsufficientBalance(tempSelectedToken)}\n >\n {t('Apply')}\n </Button>\n <Button variant=\"ghost\" width=\"full\" onClick={onClose}>\n {t('Cancel')}\n </Button>\n </VStack>\n </ModalFooter>\n </BaseModal>\n );\n};\n","import React, { useState, useCallback, useEffect } from 'react';\nimport {\n HStack,\n Text,\n Skeleton,\n Icon,\n useDisclosure,\n VStack,\n Button,\n Divider,\n useToken,\n} from '@chakra-ui/react';\nimport { LuChevronDown } from 'react-icons/lu';\nimport { useTranslation } from 'react-i18next';\n// Direct import to avoid circular dependency through barrel exports\nimport { useVeChainKitConfig } from '../../providers/VeChainKitContext';\nimport type { GasTokenType } from '../../types/gasToken';\nimport { SUPPORTED_GAS_TOKENS, TOKEN_LOGO_COMPONENTS } from '../../utils/constants';\nimport { formatGasCost } from '../../types/gasEstimation';\n// Direct imports to avoid circular dependency through hooks barrel\nimport { useWallet } from '../../hooks/api/wallet/useWallet';\nimport { useGasTokenSelection } from '../../hooks/generic-delegator/useGasTokenSelection';\nimport { useEstimateAllTokens } from '../../hooks/generic-delegator/useEstimateAllTokens';\nimport { useTokenBalances } from '../../hooks/api/wallet/useTokenBalances';\nimport type { EstimationResponse } from '../../types/gasEstimation';\nimport { GasFeeTokenSelector } from './GasFeeTokenSelector';\nimport { TransactionClause } from '@vechain/sdk-core';\n\ninterface GasFeeSummaryProps {\n estimation: (EstimationResponse & { usedToken: string }) | undefined;\n isLoading: boolean | undefined;\n isLoadingTransaction?: boolean;\n onTokenChange?: (token: GasTokenType) => void;\n clauses?: TransactionClause[];\n userSelectedToken?: GasTokenType | null; // Track user's manual selection\n}\n\nexport const GasFeeSummary: React.FC<GasFeeSummaryProps> = ({\n estimation,\n isLoading,\n isLoadingTransaction,\n onTokenChange,\n clauses = [],\n userSelectedToken,\n}: GasFeeSummaryProps) => {\n const { t } = useTranslation();\n const { feeDelegation } = useVeChainKitConfig();\n const { connection, account } = useWallet();\n const { preferences, reorderTokenPriority } = useGasTokenSelection();\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n\n const [tokenEstimations, setTokenEstimations] = useState<\n Record<GasTokenType, { cost: number; loading: boolean }>\n >(() => {\n // Initialize with loading states for all available tokens\n const initialStates: Record<\n string,\n { cost: number; loading: boolean }\n > = {};\n preferences.availableGasTokens.forEach((token) => {\n initialStates[token] = { cost: 0, loading: true };\n });\n return initialStates as Record<\n GasTokenType,\n { cost: number; loading: boolean }\n >;\n });\n\n // Fetch estimates for all available tokens when modal opens\n const { data: allTokenEstimates, isLoading: isLoadingAllEstimates } =\n useEstimateAllTokens({\n clauses: clauses,\n tokens: preferences.availableGasTokens,\n enabled: clauses.length > 0,\n });\n // Preload all token estimates to avoid re-fetching per token switch and to enable\n // fallback display when single-token estimation is undefined.\n // Initialize token estimations from prefetch results as soon as they are ready\n useEffect(() => {\n if (!isLoadingAllEstimates && allTokenEstimates) {\n setTokenEstimations(allTokenEstimates);\n }\n }, [allTokenEstimates, isLoadingAllEstimates]);\n\n // Update current token estimation\n useEffect(() => {\n if (estimation) {\n setTokenEstimations((prev) => ({\n ...prev,\n [estimation.usedToken as GasTokenType]: {\n cost: estimation.transactionCost || 0,\n loading: false,\n },\n }));\n }\n }, [estimation]);\n\n // Initialize loading states while prefetch is loading\n useEffect(() => {\n if (isLoadingAllEstimates) {\n const loadingStates = preferences.availableGasTokens.reduce(\n (acc, token) => {\n acc[token] = { cost: 0, loading: true };\n return acc;\n },\n {} as Record<GasTokenType, { cost: number; loading: boolean }>,\n );\n setTokenEstimations(loadingStates);\n }\n }, [isLoadingAllEstimates, preferences.availableGasTokens]);\n\n const handleTokenSelect = useCallback(\n (token: GasTokenType, rememberChoice: boolean) => {\n if (rememberChoice) {\n // Move selected token to the top of priority order\n // This has the same effect as dragging it to the top in settings\n const newTokenPriority = [\n token,\n ...preferences.tokenPriority.filter((t) => t !== token),\n ];\n reorderTokenPriority(newTokenPriority);\n }\n\n // Trigger re-estimation\n if (onTokenChange && token !== estimation?.usedToken) {\n onTokenChange(token);\n }\n },\n [\n estimation,\n onTokenChange,\n reorderTokenPriority,\n preferences.tokenPriority,\n ],\n );\n\n if (feeDelegation?.delegatorUrl) {\n return null;\n }\n\n if (connection.isConnectedWithDappKit) {\n return null;\n }\n\n // If no tokens are available, don't render anything\n if (preferences.availableGasTokens.length === 0) {\n return null;\n }\n\n const { balances } = useTokenBalances(account?.address ?? '');\n\n const hasInsufficientBalanceForToken = (token: GasTokenType) => {\n const balance = balances.find((b) => b.symbol === token);\n const est = tokenEstimations[token];\n if (!balance || !est || est.loading) return true;\n return Number(balance.balance) < est.cost;\n };\n\n // Determine display token and cost:\n // Priority order:\n // 1. Successfully used token from estimation (shows what will actually be used)\n // 2. User's manual selection while loading (shows what they picked during estimation)\n // 3. First available token with sufficient balance\n // 4. First available token with loaded estimate\n // 5. First available token\n const preferredToken = estimation?.usedToken as GasTokenType | undefined;\n const availableTokens = preferences.availableGasTokens as GasTokenType[];\n\n let displayToken: GasTokenType | undefined;\n\n // Priority 1: Successfully used token from estimation (always show what will actually be used)\n if (preferredToken) {\n displayToken = preferredToken;\n }\n // Priority 2: User's manual selection while loading (keeps UI stable during estimation)\n else if (userSelectedToken && availableTokens.includes(userSelectedToken)) {\n displayToken = userSelectedToken;\n }\n // Priority 3 & 4: Auto-select based on availability\n else {\n displayToken = availableTokens.find(\n (t) =>\n tokenEstimations[t] &&\n !tokenEstimations[t].loading &&\n !hasInsufficientBalanceForToken(t),\n );\n if (!displayToken) {\n displayToken = availableTokens.find(\n (t) => tokenEstimations[t] && !tokenEstimations[t].loading,\n );\n }\n if (!displayToken) {\n displayToken = availableTokens[0];\n }\n }\n\n const displayEstimation = displayToken\n ? tokenEstimations[displayToken]\n : undefined;\n\n // Show cost for the displayed token\n // If we have a successful estimation, use its cost; otherwise use the display token's estimation\n const totalCost =\n preferredToken && estimation?.transactionCost\n ? estimation.transactionCost\n : displayEstimation?.cost || 0;\n\n const tokenInfo = displayToken\n ? SUPPORTED_GAS_TOKENS[displayToken]\n : undefined;\n\n return (\n <>\n <Divider mt={3} />\n\n <HStack mt={3} w=\"full\" justifyContent=\"start\" alignItems=\"center\">\n <VStack align=\"start\" spacing={0} w=\"full\">\n <Text\n fontSize=\"sm\"\n fontWeight=\"light\"\n textAlign=\"left\"\n w=\"full\"\n color={textSecondary}\n >\n {t('Fee')}\n </Text>\n\n <HStack\n align=\"start\"\n justifyContent=\"space-between\"\n spacing={0}\n w=\"full\"\n >\n <HStack justifyContent=\"flex-start\" w=\"full\">\n {isLoading ||\n (!preferredToken &&\n (!displayEstimation ||\n displayEstimation.loading)) ||\n !tokenInfo ? (\n <>\n <Skeleton\n height=\"16px\"\n width=\"120px\"\n borderRadius=\"md\"\n />\n <Skeleton\n height=\"16px\"\n width=\"60px\"\n borderRadius=\"md\"\n />\n </>\n ) : (\n <>\n <Text\n color={textPrimary}\n fontSize=\"sm\"\n fontWeight=\"semibold\"\n >\n {formatGasCost(totalCost, 2)}{' '}\n {tokenInfo.symbol}\n </Text>\n <Text color={textSecondary} fontSize=\"xs\">\n {'≈'} ${(totalCost * 0.01).toFixed(2)}\n </Text>\n </>\n )}\n </HStack>\n </HStack>\n </VStack>\n\n <Button\n onClick={onOpen}\n variant=\"outline\"\n size=\"sm\"\n borderRadius=\"full\"\n px={6}\n disabled={isLoadingTransaction}\n color={textSecondary}\n borderColor={textSecondary}\n _hover={{\n bg: textSecondary,\n }}\n leftIcon={React.cloneElement(\n TOKEN_LOGO_COMPONENTS[\n (displayToken as GasTokenType) ||\n preferences.availableGasTokens[0]\n ],\n {\n boxSize: '20px',\n borderRadius: 'full',\n },\n )}\n >\n <Text fontSize=\"sm\" fontWeight=\"semibold\">\n {displayToken || preferences.availableGasTokens[0]}\n </Text>\n <Icon\n as={LuChevronDown}\n boxSize={5}\n color={textSecondary}\n />\n </Button>\n </HStack>\n\n <GasFeeTokenSelector\n isOpen={isOpen}\n onClose={onClose}\n selectedToken={\n (displayToken as GasTokenType) ||\n preferences.availableGasTokens[0]\n }\n onTokenSelect={handleTokenSelect}\n availableTokens={preferences.availableGasTokens}\n tokenEstimations={tokenEstimations}\n walletAddress={account?.address ?? ''}\n />\n </>\n );\n};\n","import {\n Box,\n HStack,\n Icon,\n Text,\n useToken,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { keyframes } from '@emotion/react';\nimport { LuCheck } from 'react-icons/lu';\nimport { useEffect, useState } from 'react';\n\ntype Props = {\n message: string;\n duration?: number;\n onClose?: () => void;\n};\n\nconst slideIn = keyframes`\n from {\n transform: translateY(-100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n`;\n\nconst slideOut = keyframes`\n from {\n transform: translateY(0);\n opacity: 1;\n }\n to {\n transform: translateY(-100%);\n opacity: 0;\n }\n`;\n\nexport const InlineFeedback = ({\n message,\n duration = 2000,\n onClose,\n}: Props) => {\n const [isVisible, setIsVisible] = useState(true);\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const bgColor = useColorModeValue('#f0f9ff', '#0000009e');\n const borderColor = useColorModeValue('#bfdbfe', '#3b3b3b');\n const iconColor = useToken('colors', 'vechain-kit-primary');\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(false);\n setTimeout(() => {\n onClose?.();\n }, 300); // Wait for animation to complete\n }, duration);\n\n return () => clearTimeout(timer);\n }, [duration, onClose]);\n\n return (\n <Box\n position=\"absolute\"\n w=\"fit-content\"\n margin=\"auto\"\n animation={`${isVisible ? slideIn : slideOut} 0.3s ease-in-out`}\n zIndex={10}\n >\n <Box\n bg={bgColor}\n borderWidth={1}\n borderColor={borderColor}\n borderRadius=\"md\"\n px={4}\n py={3}\n mx={4}\n mt={2}\n >\n <HStack spacing={3} align=\"center\">\n <Icon\n as={LuCheck}\n boxSize={5}\n color={iconColor}\n flexShrink={0}\n />\n <Text\n fontSize=\"sm\"\n fontWeight=\"500\"\n color={textPrimary}\n flex={1}\n >\n {message}\n </Text>\n </HStack>\n </Box>\n </Box>\n );\n};\n","import { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { InlineFeedback } from './InlineFeedback';\n\ntype Props = {\n /**\n * Show feedback flag passed via content props (desktop)\n * If true, shows the feedback message\n */\n showFeedback?: boolean;\n};\n\n/**\n * Component that displays inline feedback when a wallet switch occurs.\n * Handles both desktop (via props) and VeWorld in-app browser (via address change detection).\n * Simply add this component where you want the feedback to appear.\n */\nexport const WalletSwitchFeedback = ({ showFeedback = false }: Props) => {\n const { t } = useTranslation();\n const [showSwitchFeedback, setShowSwitchFeedback] = useState(false);\n\n // Handle prop-based feedback (desktop)\n useEffect(() => {\n if (showFeedback) {\n setShowSwitchFeedback(true);\n } else {\n // Reset feedback when prop becomes false/undefined (e.g., modal closed and reopened)\n setShowSwitchFeedback(false);\n }\n }, [showFeedback]);\n\n if (!showSwitchFeedback) {\n return null;\n }\n\n return (\n <InlineFeedback\n message={t('Account Changed')}\n duration={2000}\n onClose={() => {\n setShowSwitchFeedback(false);\n }}\n />\n );\n};\n","import {\n Button,\n Box,\n HStack,\n VStack,\n Text,\n Icon,\n Image,\n Tag,\n ButtonProps,\n} from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport { IconType } from 'react-icons';\n\ntype ActionButtonProps = {\n title: string;\n description?: string;\n onClick: () => void;\n leftIcon?: IconType;\n rightIcon?: IconType;\n leftImage?: string;\n backgroundColor?: string;\n border?: string;\n hide?: boolean;\n _hover?: object;\n showComingSoon?: boolean;\n isDisabled?: boolean;\n stacked?: boolean;\n isLoading?: boolean;\n loadingText?: string;\n style?: ButtonProps;\n extraContent?: React.ReactNode;\n dataTestId?: string;\n variant?: string;\n};\n\nexport const ActionButton = ({\n leftIcon,\n rightIcon,\n title,\n onClick,\n leftImage,\n hide = false,\n showComingSoon = false,\n backgroundColor,\n _hover,\n isDisabled = false,\n stacked = false,\n isLoading,\n loadingText,\n style,\n extraContent,\n dataTestId,\n variant = 'actionButton',\n}: ActionButtonProps) => {\n const { t } = useTranslation();\n \n // Map actionButton to vechainKitSecondary for consistency\n // Maintain backward compatibility by allowing override\n const standardVariant = variant === 'actionButton' ? 'vechainKitSecondary' : variant;\n \n return (\n <Button\n variant={standardVariant}\n py={stacked ? 0 : 2}\n minHeight=\"50px\"\n height=\"fit-content\"\n p={0}\n onClick={onClick}\n display={hide ? 'none' : 'flex'}\n isDisabled={showComingSoon || isDisabled}\n isLoading={isLoading}\n loadingText={loadingText}\n bgColor={backgroundColor}\n _hover={_hover}\n data-testid={dataTestId}\n {...style}\n >\n <HStack w={'full'} justify={'space-between'} alignItems={'center'}>\n <Box minW={'40px'} h={'20px'}>\n {leftImage ? (\n <Image\n src={leftImage}\n w={'30px'}\n h={'30px'}\n borderRadius={'full'}\n alt=\"left-image\"\n alignSelf={'end'}\n objectFit=\"cover\"\n />\n ) : (\n <Icon\n as={leftIcon}\n fontSize={'20px'}\n h={'full'}\n alignContent={'center'}\n />\n )}\n </Box>\n <VStack\n textAlign={'left'}\n w={'full'}\n flex={1}\n justifyContent={'flex-start'}\n alignItems={'flex-start'}\n >\n <HStack justify={'flex-start'} alignItems={'baseline'}>\n <Text fontSize={'sm'} fontWeight={'400'}>\n {title}\n </Text>\n {showComingSoon && (\n <Tag size=\"sm\" colorScheme=\"red\">\n {t('Coming Soon!')}\n </Tag>\n )}\n {extraContent}\n </HStack>\n\n {/* <Text\n fontSize={'xs'}\n fontWeight={'400'}\n opacity={0.5}\n overflowWrap={'break-word'}\n wordBreak={'break-word'}\n whiteSpace={'normal'}\n w={'full'}\n pr={rightIcon ? '0px' : '10px'}\n >\n {description}\n </Text> */}\n </VStack>\n\n {rightIcon && (\n <VStack minW={'40px'} justifyContent={'flex-end'}>\n <Icon as={rightIcon} fontSize={'20px'} opacity={0.5} />\n </VStack>\n )}\n </HStack>\n </Button>\n );\n};\n","'use client';\n\nimport {\n Text,\n Icon,\n HStack,\n Button,\n StackProps,\n IconButton,\n} from '@chakra-ui/react';\nimport { humanAddress, humanDomain } from '../../../utils';\nimport { copyToClipboard } from '../../../utils/ssrUtils';\nimport type { Wallet } from '../../../types';\nimport {\n LuChevronRight,\n LuCheck,\n LuCopy,\n LuArrowLeftRight,\n} from 'react-icons/lu';\nimport { AccountAvatar } from '../../common';\nimport { useState } from 'react';\nimport { AccountModalContentTypes } from '../Types/Types';\nimport { useTranslation } from 'react-i18next';\n// Direct imports to avoid circular dependency with hooks barrel\nimport { useWallet } from '../../../hooks/api/wallet/useWallet';\nimport { useSwitchWallet } from '../../../hooks/api/wallet/useSwitchWallet';\n// Use optional hook to handle missing DAppKitProvider gracefully\nimport { useOptionalDAppKitWallet } from '../../../hooks/api/dappkit/useOptionalDAppKitWallet';\n\ntype Props = {\n wallet: Wallet;\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n size?: string;\n onClick?: () => void;\n onClose: () => void;\n mt?: number;\n style?: StackProps;\n};\n\nexport const AccountSelector = ({\n wallet,\n setCurrentContent,\n size = 'md',\n onClick,\n onClose,\n mt,\n style,\n}: Props) => {\n const { t } = useTranslation();\n const { connection } = useWallet();\n const { switchWallet, isSwitching, isInAppBrowser } = useSwitchWallet();\n const { isSwitchWalletEnabled } = useOptionalDAppKitWallet();\n\n const [copied, setCopied] = useState(false);\n\n const handleCopyToClipboard = async () => {\n const success = await copyToClipboard(\n wallet?.domain ?? wallet?.address ?? '',\n );\n if (success) {\n setCopied(true);\n setTimeout(() => {\n setCopied(false);\n }, 2000);\n }\n };\n\n const handleSwitchWallet = () => {\n if (isInAppBrowser) {\n switchWallet();\n } else {\n // Desktop: navigate to select wallet screen\n setCurrentContent?.({\n type: 'select-wallet',\n props: {\n setCurrentContent: setCurrentContent!,\n onClose,\n returnTo: 'main',\n onLogoutSuccess: onClose,\n },\n });\n }\n };\n\n return (\n <HStack\n mt={mt}\n w={'full'}\n {...style}\n justifyContent={'flex-start'}\n alignItems={'center'}\n >\n <Button\n w=\"full\"\n h={12}\n aria-label=\"Wallet\"\n onClick={onClick}\n variant=\"vechainKitSecondary\"\n p={3}\n data-testid=\"profile-button\"\n >\n <HStack\n spacing={2}\n align=\"center\"\n justifyContent={'space-between'}\n w={'full'}\n >\n <HStack spacing={2} justifyContent={'flex-start'}>\n <AccountAvatar\n wallet={wallet}\n props={{ width: 7, height: 7 }}\n />\n <Text fontSize={size} fontWeight=\"500\">\n {copied\n ? t('Copied!')\n : humanDomain(wallet?.domain ?? '', 22, 0) ||\n humanAddress(wallet?.address ?? '', 6, 4)}\n </Text>\n </HStack>\n\n <Icon\n boxSize={5}\n as={LuChevronRight}\n cursor=\"pointer\"\n opacity={0.5}\n />\n </HStack>\n </Button>\n\n {(connection.isInAppBrowser && isSwitchWalletEnabled) ||\n (!connection.isInAppBrowser &&\n connection.isConnectedWithDappKit) ? (\n <IconButton\n aria-label=\"Switch wallet\"\n icon={<Icon as={LuArrowLeftRight} />}\n onClick={handleSwitchWallet}\n w=\"60px\"\n h={12}\n variant=\"vechainKitSecondary\"\n p={3}\n isLoading={isSwitching}\n isDisabled={isSwitching}\n data-testid=\"switch-wallet-button\"\n />\n ) : (\n <IconButton\n aria-label=\"Copy address\"\n icon={<Icon as={copied ? LuCheck : LuCopy} />}\n onClick={handleCopyToClipboard}\n w=\"60px\"\n h={12}\n variant=\"vechainKitSecondary\"\n p={3}\n />\n )}\n\n {/* <IconButton\n aria-label=\"Logout\"\n icon={<Icon as={LuLogOut} />}\n onClick={() =>\n setCurrentContent({\n type: 'disconnect-confirm',\n props: {\n onDisconnect: handleLogout,\n onBack: () => setCurrentContent('main'),\n },\n })\n }\n variant=\"ghost\"\n size=\"sm\"\n opacity={0.5}\n _hover={{ opacity: 0.8 }}\n colorScheme=\"red\"\n /> */}\n </HStack>\n );\n};\n","import {\n HStack,\n Text,\n Circle,\n Image,\n StackProps,\n useToken,\n} from '@chakra-ui/react';\nimport { useTokensWithValues } from '../../hooks';\n// Direct import to avoid circular dependency through barrel exports\nimport { useVeChainKitConfig } from '../../providers/VeChainKitContext';\nimport { TOKEN_LOGOS, TOKEN_LOGO_COMPONENTS } from '../../utils';\nimport { useTranslation } from 'react-i18next';\nimport React from 'react';\n\ntype AssetIconsProps = {\n address: string;\n maxIcons?: number;\n iconSize?: number;\n ml?: number;\n style?: StackProps;\n iconsGap?: number;\n rightIcon?: React.ReactNode;\n showNoAssetsWarning?: boolean;\n onClick?: () => void;\n};\n\nexport const AssetIcons = ({\n address,\n maxIcons = 3,\n iconSize = 20,\n ml = 0,\n style,\n iconsGap = 0,\n rightIcon,\n showNoAssetsWarning = false,\n onClick,\n}: AssetIconsProps) => {\n const { t } = useTranslation();\n const { tokensWithBalance } = useTokensWithValues({ address });\n const { darkMode } = useVeChainKitConfig();\n const secondaryTextColor = useToken('colors', 'vechain-kit-text-secondary');\n const marginLeft = iconsGap < 1 ? `-${iconSize / 2}px` : `${iconsGap}px`;\n\n const tokensToShow = tokensWithBalance.slice(0, maxIcons);\n const remainingTokens = tokensWithBalance.length - maxIcons;\n\n if (!address) return null;\n if (tokensWithBalance.length === 0 && !showNoAssetsWarning) return null;\n\n return (\n <HStack spacing={0} ml={ml} {...style} onClick={onClick}>\n <HStack spacing={0}>\n {tokensToShow.map((token, index) => (\n <Circle\n key={token.symbol}\n ml={index > 0 ? marginLeft : '0'}\n zIndex={index}\n size={`${iconSize}px`}\n borderRadius=\"full\"\n bg={darkMode ? 'gray.100' : 'gray.600'}\n border=\"2px solid #00000024\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n {TOKEN_LOGO_COMPONENTS[token.symbol] ? (\n React.cloneElement(\n TOKEN_LOGO_COMPONENTS[token.symbol],\n {\n width: `${iconSize * 0.8}px`,\n height: `${iconSize * 0.8}px`,\n rounded: 'full',\n },\n )\n ) : TOKEN_LOGOS[token.symbol] ? (\n <Image\n src={TOKEN_LOGOS[token.symbol]}\n alt={`${token.symbol} logo`}\n width={`${iconSize * 0.8}px`}\n height={`${iconSize * 0.8}px`}\n rounded=\"full\"\n />\n ) : (\n <Text\n fontSize={`${iconSize * 0.4}px`}\n fontWeight=\"bold\"\n color={darkMode ? 'black' : 'white'}\n >\n {token.symbol.slice(0, 3)}\n </Text>\n )}\n </Circle>\n ))}\n {remainingTokens > 0 && (\n <Circle\n ml={marginLeft}\n zIndex={tokensToShow.length}\n size={`${iconSize}px`}\n borderRadius=\"full\"\n bg={darkMode ? 'gray.100' : 'gray.700'}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n border=\"2px solid\"\n >\n <Text\n fontSize={`${iconSize * 0.4}px`}\n fontWeight=\"bold\"\n color={darkMode ? 'black' : 'white'}\n >\n +{remainingTokens}\n </Text>\n </Circle>\n )}\n\n {tokensWithBalance.length === 0 && showNoAssetsWarning && (\n <Text\n fontSize={'sm'}\n color={secondaryTextColor}\n fontWeight=\"700\"\n >\n {t('No assets')}\n </Text>\n )}\n </HStack>\n\n {rightIcon}\n </HStack>\n );\n};\n","import {\n Heading,\n VStack,\n HStack,\n Icon,\n IconButton,\n Button,\n useToken,\n} from '@chakra-ui/react';\nimport { useRefreshBalances, useWallet, useTotalBalance, LocalStorageKey, useLocalStorage } from '../../../hooks';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { LuRefreshCw } from 'react-icons/lu';\nimport { AssetIcons } from '../../WalletButton/AssetIcons';\nimport { LuChevronRight } from 'react-icons/lu';\nimport { GoEye, GoEyeClosed } from 'react-icons/go';\n\nexport const BalanceSection = ({\n mb,\n mt,\n onAssetsClick,\n}: {\n mb?: number;\n mt?: number;\n onAssetsClick?: () => void;\n}) => {\n const { t } = useTranslation();\n const { account } = useWallet();\n const { formattedBalance, isLoading } = useTotalBalance({\n address: account?.address ?? '',\n });\n\n const { refresh } = useRefreshBalances();\n const [isRefreshing, setIsRefreshing] = useState(false);\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n\n const handleRefresh = async () => {\n setIsRefreshing(true);\n await refresh();\n setTimeout(() => {\n setIsRefreshing(false);\n }, 1500);\n };\n const [showAssets, setShowAssets] = useLocalStorage(LocalStorageKey.SHOW_ASSETS, true);\n\n return (\n <VStack w=\"full\" justifyContent={'start'} spacing={1} mt={mt} mb={mb}>\n <HStack\n w={'full'}\n justifyContent={'space-between'}\n alignItems={'center'}\n spacing={0}\n role=\"group\"\n >\n <Heading\n size={'xs'}\n fontWeight={'800'}\n color={textSecondary}\n textTransform={'uppercase'}\n letterSpacing={1.2}\n ml={'5px'}\n >\n {t('Assets')}\n </Heading>\n\n <HStack\n spacing={0}\n alignItems=\"center\"\n >\n <IconButton\n aria-label=\"Refresh balances\"\n variant=\"ghost\"\n size=\"sm\"\n opacity={0.5}\n _hover={{ opacity: 0.8 }}\n onClick={handleRefresh}\n icon={<Icon as={LuRefreshCw} boxSize={4} />}\n isLoading={isLoading || isRefreshing}\n sx={{\n '& > span.chakra-button__spinner': {\n width: '16px',\n height: '16px',\n position: 'absolute',\n },\n }}\n />\n <IconButton\n aria-label=\"Show/hide assets\"\n variant=\"ghost\"\n size=\"sm\"\n opacity={0.5}\n _hover={{ opacity: 0.8 }}\n onClick={() => setShowAssets(!showAssets)}\n icon={<Icon as={showAssets ? GoEye : GoEyeClosed} boxSize={4} />}\n />\n </HStack>\n </HStack>\n\n <Button\n onClick={onAssetsClick}\n h=\"fit-content\"\n variant=\"vechainKitSecondary\"\n >\n <VStack\n spacing={2}\n w=\"full\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n mt={4}\n mb={4}\n >\n <Heading size={'2xl'} fontWeight={'700'}>\n { showAssets ? formattedBalance : formattedBalance[0] + '*'.repeat(formattedBalance.slice(1).length) }\n </Heading>\n\n <HStack\n w={'full'}\n justifyContent={'flex-start'}\n data-testid=\"all-assets-button\"\n mt={2}\n >\n <AssetIcons\n style={{\n width: '100%',\n justifyContent: 'space-between',\n }}\n maxIcons={10}\n iconSize={26}\n iconsGap={3}\n address={account?.address ?? ''}\n showNoAssetsWarning={true}\n rightIcon={\n <Icon\n as={LuChevronRight}\n boxSize={5}\n opacity={0.5}\n marginLeft={2}\n />\n }\n />\n </HStack>\n </VStack>\n </Button>\n </VStack>\n );\n};\n","import {\n Grid,\n Icon,\n IconButton,\n VStack,\n Text,\n HStack,\n Box,\n} from '@chakra-ui/react';\nimport { AccountModalContentTypes } from '../Types';\nimport { useUpgradeRequired, useWallet, useTotalBalance } from '../../../hooks';\nimport { useTranslation } from 'react-i18next';\nimport {\n LuArrowDownToLine,\n LuArrowLeftRight,\n LuArrowUpFromLine,\n} from 'react-icons/lu';\n\ntype Props = {\n mt?: number;\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n};\n\ntype QuickAction = {\n icon: React.ElementType;\n label: string;\n onClick: (setCurrentContent: Props['setCurrentContent']) => void;\n isDisabled?: (hasAnyBalance: boolean) => boolean;\n};\n\nconst QUICK_ACTIONS: QuickAction[] = [\n {\n icon: LuArrowUpFromLine,\n label: 'Send',\n onClick: (setCurrentContent) =>\n setCurrentContent({\n type: 'send-token',\n props: {\n setCurrentContent,\n },\n }),\n isDisabled: (hasAnyBalance) => !hasAnyBalance,\n },\n {\n icon: LuArrowLeftRight,\n label: 'Swap',\n onClick: (setCurrentContent) => {\n setCurrentContent('swap-token');\n },\n isDisabled: (hasAnyBalance) => !hasAnyBalance,\n },\n {\n icon: LuArrowDownToLine,\n label: 'Receive',\n onClick: (setCurrentContent) => {\n setCurrentContent('receive-token');\n },\n },\n];\n\nconst QuickActionButton = ({\n icon,\n label,\n onClick,\n isDisabled,\n showRedDot,\n}: {\n icon: React.ElementType;\n label: string;\n onClick: () => void;\n isDisabled?: boolean;\n showRedDot?: boolean;\n}) => {\n const { t } = useTranslation();\n\n return (\n <IconButton\n variant=\"vechainKitSecondary\"\n h=\"80px\"\n w=\"full\"\n aria-label={label}\n isDisabled={isDisabled}\n p={3}\n icon={\n <VStack spacing={4}>\n <Icon as={icon} boxSize={5} opacity={0.9} />\n\n <HStack p={0} alignItems={'baseline'} spacing={1}>\n <Text\n fontSize=\"sm\"\n fontWeight=\"600\"\n data-testid={`${label.toLowerCase()}-button-label`}\n >\n {t(label, label)}\n </Text>\n {showRedDot && (\n <Box\n minWidth=\"8px\"\n height=\"8px\"\n bg=\"red.500\"\n borderRadius=\"full\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n />\n )}\n </HStack>\n </VStack>\n }\n onClick={onClick}\n />\n );\n};\n\nexport const QuickActionsSection = ({ mt, setCurrentContent }: Props) => {\n const { account, smartAccount, connectedWallet, connection } = useWallet();\n const { hasAnyBalance } = useTotalBalance({\n address: account?.address ?? '',\n });\n\n const { data: upgradeRequired } = useUpgradeRequired(\n smartAccount?.address ?? '',\n connectedWallet?.address ?? '',\n 3,\n );\n\n const showRedDot = connection.isConnectedWithPrivy && upgradeRequired;\n\n return (\n <Grid templateColumns=\"repeat(3, 1fr)\" gap={2} w=\"full\" mt={mt}>\n {QUICK_ACTIONS.map((action) => (\n <QuickActionButton\n key={action.label}\n icon={action.icon}\n label={action.label}\n onClick={() => action.onClick(setCurrentContent)}\n isDisabled={action.isDisabled?.(hasAnyBalance)}\n showRedDot={showRedDot && action.label === 'Settings'}\n />\n ))}\n </Grid>\n );\n};\n","import {\n Card,\n CardBody,\n HStack,\n VStack,\n Text,\n useToken,\n Tag,\n} from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport { AccountModalContentTypes } from '../../Types';\n\ntype FeatureAnnouncementCardProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n};\nexport const FeatureAnnouncementCard = ({\n setCurrentContent,\n}: FeatureAnnouncementCardProps) => {\n const { t } = useTranslation();\n // const { closeAnnouncement } = useFeatureAnnouncement();\n\n const titleColor = useToken('colors', 'vechain-kit-text-primary');\n const descriptionColor = useToken('colors', 'vechain-kit-text-secondary');\n\n const handleOnClick = () => {\n setCurrentContent({\n type: 'choose-name',\n props: {\n setCurrentContent,\n onBack: () => setCurrentContent('profile'),\n initialContentSource: 'profile',\n },\n });\n // closeAnnouncement();\n };\n\n // We always show the announcement card for now\n // if (!isVisible) return null;\n\n return (\n <Card\n w=\"full\"\n variant={'featureAnnouncement'}\n overflow=\"hidden\"\n onClick={handleOnClick}\n cursor=\"pointer\"\n _hover={{ opacity: 0.8 }}\n >\n <CardBody p={4}>\n <HStack justify=\"space-between\" align=\"flex-start\" spacing={3}>\n <VStack align=\"flex-start\" spacing={1}>\n <HStack spacing={2}>\n <Text\n fontSize=\"sm\"\n fontWeight=\"400\"\n color={titleColor}\n >\n {t('Claim your vet domain!')}\n </Text>\n <Tag size=\"sm\" colorScheme=\"red\">\n {t('New')}\n </Tag>\n </HStack>\n <Text fontSize=\"xs\" color={descriptionColor}>\n {t(\n 'Say goodbye to 0x addresses, claim your .veworld.vet subdomain now for free!',\n )}\n </Text>\n </VStack>\n </HStack>\n </CardBody>\n </Card>\n );\n};\n","import { Alert, AlertIcon, Text, VStack, HStack } from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\n\nexport const DomainRequiredAlert = () => {\n const { t } = useTranslation();\n\n return (\n <Alert status=\"warning\" fontSize={'xs'} borderRadius={'xl'} p={2}>\n <VStack spacing={1} align=\"stretch\" w=\"full\">\n <HStack spacing={2} align=\"flex-start\">\n <AlertIcon boxSize={4} mt={'10px'} />\n <Text w=\"full\">\n {t(\n 'A .vet domain is required to customize your profile. Choose an account name to get started.',\n )}\n </Text>\n </HStack>\n </VStack>\n </Alert>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Tag,\n ModalFooter,\n} from '@chakra-ui/react';\nimport {\n StickyHeaderContainer,\n ScrollToTopWrapper,\n WalletSwitchFeedback,\n} from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport {\n AccountSelector,\n BalanceSection,\n QuickActionsSection,\n} from '../../Components';\nimport { ModalBackButton } from '../../../common';\nimport type { Wallet } from '../../../../types';\nimport { useTranslation } from 'react-i18next';\n// Import from VeChainKitContext to avoid circular dependency with providers barrel\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\nimport { useAccountModalOptions } from '../../../../hooks';\n\ntype Props = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n onClose: () => void;\n wallet: Wallet;\n switchFeedback?: { showFeedback: boolean };\n};\n\nexport const AccountMainContent = ({\n setCurrentContent,\n wallet,\n onClose,\n switchFeedback,\n}: Props) => {\n const { t } = useTranslation();\n const { network } = useVeChainKitConfig();\n const { isolatedView } = useAccountModalOptions();\n\n return (\n <ScrollToTopWrapper>\n <StickyHeaderContainer>\n {!isolatedView && (\n <ModalBackButton\n onClick={() => {\n setCurrentContent('profile');\n }}\n />\n )}\n <ModalHeader>\n {t('Wallet')}\n\n {network?.type !== 'main' && (\n <Tag\n size=\"xs\"\n colorScheme=\"orange\"\n fontSize={'2xs'}\n p={1}\n ml={1}\n textTransform={'uppercase'}\n >\n {`${network?.type}`}\n </Tag>\n )}\n </ModalHeader>\n\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody w={'full'}>\n <VStack\n w={'full'}\n overflow={'hidden'}\n justifyContent={'flex-start'}\n spacing={8}\n >\n <WalletSwitchFeedback\n showFeedback={switchFeedback?.showFeedback}\n />\n <AccountSelector\n style={{ justifyContent: 'flex-start' }}\n onClick={() => {\n setCurrentContent('profile');\n }}\n setCurrentContent={setCurrentContent}\n onClose={onClose}\n wallet={wallet}\n />\n\n <BalanceSection\n onAssetsClick={() => {\n setCurrentContent('assets');\n }}\n />\n\n <QuickActionsSection\n setCurrentContent={setCurrentContent}\n />\n </VStack>\n </ModalBody>\n <ModalFooter pt={0}></ModalFooter>\n </ScrollToTopWrapper>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Input,\n Text,\n InputGroup,\n InputLeftElement,\n Icon,\n ModalFooter,\n Container,\n useToken,\n} from '@chakra-ui/react';\nimport { LuSearch, LuSlash } from 'react-icons/lu';\nimport { ModalBackButton, StickyHeaderContainer } from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { AssetButton } from '../../../common';\nimport { useWallet, useTokensWithValues, TokenWithValue } from '../../../../hooks';\nimport { useState, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\n// Import from VeChainKitContext to avoid circular dependency with providers barrel\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\nimport { useCurrency } from '../../../../hooks';\nimport { SupportedCurrency } from '../../../../utils/currencyUtils';\n\ntype Props = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n onSelectToken: (token: TokenWithValue) => void;\n onBack: () => void;\n /**\n * If true, shows all tokens (not just tokens with balance) and sorts owned tokens first\n */\n showAllTokens?: boolean;\n};\n\nexport const SelectTokenContent = ({\n onSelectToken,\n onBack,\n showAllTokens = false,\n}: Props) => {\n const { t } = useTranslation();\n const { darkMode: isDark } = useVeChainKitConfig();\n const { currentCurrency } = useCurrency();\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const textTertiary = useToken('colors', 'vechain-kit-text-tertiary');\n const { account } = useWallet();\n const { tokensWithBalance, sortedTokens } = useTokensWithValues({\n address: account?.address ?? '',\n });\n const [searchQuery, setSearchQuery] = useState('');\n\n // Get the appropriate token list based on showAllTokens prop\n const availableTokens = useMemo(() => {\n if (showAllTokens) {\n // Show all tokens, sorted with owned tokens first (by value), then unowned\n const ownedTokens = sortedTokens.filter(\n (token) => Number(token.balance) > 0,\n );\n const unownedTokens = sortedTokens.filter(\n (token) => Number(token.balance) === 0,\n );\n\n // Owned tokens are already sorted by value (highest first)\n // Unowned tokens are sorted alphabetically\n const sortedUnowned = [...unownedTokens].sort((a, b) =>\n a.symbol.localeCompare(b.symbol),\n );\n\n return [...ownedTokens, ...sortedUnowned];\n }\n return tokensWithBalance;\n }, [showAllTokens, sortedTokens, tokensWithBalance]);\n\n // Filter tokens\n const filteredTokens = availableTokens.filter(({ symbol }) =>\n symbol.toLowerCase().includes(searchQuery.toLowerCase()),\n );\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{t('Select Token')}</ModalHeader>\n <ModalBackButton onClick={onBack} />\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <Container h={['540px', 'auto']} p={0}>\n <ModalBody>\n <VStack spacing={4} align=\"stretch\">\n <InputGroup size=\"lg\">\n <Input\n placeholder=\"Search token\"\n bg={\n isDark\n ? 'vechain-kit-overlay'\n : 'vechain-kit-card'\n }\n borderRadius=\"xl\"\n height=\"56px\"\n pl={12}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n data-testid=\"search-token-input\"\n />\n <InputLeftElement h=\"56px\" w=\"56px\" pl={4}>\n <LuSearch color={textTertiary} />\n </InputLeftElement>\n </InputGroup>\n\n <Text\n fontSize=\"lg\"\n fontWeight=\"semibold\"\n color={textPrimary}\n mt={4}\n >\n {showAllTokens ? t('All tokens') : t('Your tokens')}\n </Text>\n\n {filteredTokens.length === 0 ? (\n <VStack spacing={2} py={8}>\n <Icon\n as={LuSlash}\n boxSize={12}\n color={textTertiary}\n />\n <Text fontSize=\"lg\" color={textPrimary}>\n {t('No tokens found')}\n </Text>\n <Text fontSize=\"md\" color={textSecondary}>\n {t('Try searching with a different term')}\n </Text>\n </VStack>\n ) : (\n <VStack spacing={2} align=\"stretch\">\n {filteredTokens.map((token) => (\n <AssetButton\n key={token.address}\n symbol={token.symbol}\n amount={Number(token.balance)}\n currencyValue={token.valueInCurrency}\n currentCurrency={\n currentCurrency as SupportedCurrency\n }\n onClick={() => onSelectToken(token)}\n />\n ))}\n </VStack>\n )}\n </VStack>\n </ModalBody>\n </Container>\n <ModalFooter pt={0} />\n </>\n );\n};\n","import React from 'react';\nimport {\n ModalBody,\n ModalHeader,\n VStack,\n Input,\n Button,\n Text,\n Box,\n HStack,\n Icon,\n ModalFooter,\n Image,\n FormControl,\n useToken,\n ModalCloseButton,\n} from '@chakra-ui/react';\nimport { useState, useEffect, useMemo, useRef } from 'react';\nimport { ModalBackButton, StickyHeaderContainer } from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { LuChevronDown } from 'react-icons/lu';\nimport { SelectTokenContent } from './SelectTokenContent';\nimport { parseEther } from 'ethers';\nimport { TOKEN_LOGOS, TOKEN_LOGO_COMPONENTS } from '../../../../utils';\nimport { useTranslation } from 'react-i18next';\n// Import from VeChainKitContext to avoid circular dependency with providers barrel\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\nimport { useForm } from 'react-hook-form';\nimport {\n useVechainDomain,\n TokenWithValue,\n useTokensWithValues,\n useWallet,\n} from '../../../../hooks';\nimport { useCurrency, useTokenPrices } from '../../../../hooks';\nimport {\n formatCompactCurrency,\n SupportedCurrency,\n convertToSelectedCurrency,\n} from '../../../../utils/currencyUtils';\nimport { ens_normalize } from '@adraffy/ens-normalize';\nimport { useAccountModalOptions } from '../../../../hooks/modals/useAccountModalOptions';\n\nexport type SendTokenContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n preselectedToken?: TokenWithValue;\n initialAmount?: string;\n initialToAddressOrDomain?: string;\n onBack?: () => void;\n};\n\n// Add form values type\ntype FormValues = {\n amount: string;\n toAddressOrDomain: string;\n};\n\nexport const SendTokenContent = ({\n setCurrentContent,\n preselectedToken,\n initialAmount = '',\n initialToAddressOrDomain = '',\n onBack: parentOnBack = () => setCurrentContent('main'),\n}: SendTokenContentProps) => {\n const { t } = useTranslation();\n const { darkMode: isDark, feeDelegation } = useVeChainKitConfig();\n const { currentCurrency } = useCurrency();\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const textTertiary = useToken('colors', 'vechain-kit-text-tertiary');\n const errorColor = useToken('colors', 'vechain-kit-error');\n const cardBg = useToken('colors', 'vechain-kit-card');\n\n const { exchangeRates } = useTokenPrices();\n const { account } = useWallet();\n const { isolatedView } = useAccountModalOptions();\n const { tokensWithBalance } = useTokensWithValues({\n address: account?.address ?? '',\n });\n\n const [selectedToken, setSelectedToken] = useState<TokenWithValue | null>(\n preselectedToken ?? tokensWithBalance[0] ?? null,\n );\n const [isSelectingToken, setIsSelectingToken] = useState(false);\n\n // Set first token with balance as default when tokens load\n useEffect(() => {\n if (\n !preselectedToken &&\n !selectedToken &&\n tokensWithBalance.length > 0\n ) {\n setSelectedToken(tokensWithBalance[0]);\n }\n }, [tokensWithBalance, preselectedToken, selectedToken]);\n\n // Form setup with validation rules\n const {\n register,\n watch,\n setValue,\n setError,\n formState: { errors, isValid },\n handleSubmit,\n } = useForm<FormValues>({\n defaultValues: {\n amount: initialAmount,\n toAddressOrDomain: initialToAddressOrDomain,\n },\n mode: 'onChange',\n });\n\n // Watch form values\n const { toAddressOrDomain, amount } = watch();\n\n // Track previous token to detect changes\n const prevTokenRef = useRef<TokenWithValue | null>(selectedToken);\n\n // Reset amount when token changes\n useEffect(() => {\n if (\n prevTokenRef.current &&\n selectedToken &&\n prevTokenRef.current.address !== selectedToken.address\n ) {\n setValue('amount', '');\n }\n prevTokenRef.current = selectedToken;\n }, [selectedToken, setValue]);\n\n const formattedValue = useMemo(() => {\n if (selectedToken) {\n return formatCompactCurrency(\n convertToSelectedCurrency(\n Number(amount) * selectedToken.priceUsd,\n currentCurrency as SupportedCurrency,\n exchangeRates,\n ),\n { currency: currentCurrency as SupportedCurrency },\n );\n }\n return '';\n }, [amount, selectedToken, currentCurrency, exchangeRates]);\n\n const { data: resolvedDomainData, isLoading } =\n useVechainDomain(toAddressOrDomain);\n\n const handleSetMaxAmount = () => {\n if (selectedToken) {\n setValue('amount', selectedToken.balance);\n }\n };\n\n const handleBack = () => {\n parentOnBack();\n };\n\n const onSubmit = async (data: FormValues) => {\n if (!selectedToken) return;\n\n // Validation:\n // - Address is valid\n // - There is no domain attached to the address or (if it is attached) the returned domain is the primary domain\n const isValidReceiver =\n resolvedDomainData?.isValidAddressOrDomain &&\n (!resolvedDomainData?.domain ||\n (resolvedDomainData?.domain &&\n resolvedDomainData?.isPrimaryDomain));\n\n if (!isValidReceiver) {\n setError('toAddressOrDomain', {\n type: 'manual',\n message: t('Invalid address or domain'),\n });\n return;\n }\n\n // Validate amount\n if (selectedToken) {\n const numericAmount = parseEther(data.amount);\n\n // Enforce minimum for B3TR (precise wei comparison)\n const minB3tr = feeDelegation?.b3trTransfers?.minAmountInEther;\n if (\n selectedToken.symbol === 'B3TR' &&\n typeof minB3tr === 'number' &&\n minB3tr > 0\n ) {\n try {\n const minWei = parseEther(String(minB3tr));\n if (numericAmount < minWei) {\n setError('amount', {\n type: 'manual',\n message: t(\n 'Minimum {{symbol}} transfer is {{min}}',\n {\n symbol: selectedToken.symbol,\n min: minB3tr,\n },\n ),\n });\n return;\n }\n } catch {\n // ignore parse error and continue\n }\n }\n\n if (numericAmount > parseEther(selectedToken.balance)) {\n setError('amount', {\n type: 'manual',\n message: t(`Insufficient {{symbol}} balance`, {\n symbol: selectedToken.symbol,\n }),\n });\n return;\n }\n }\n setCurrentContent({\n type: 'send-token-summary',\n props: {\n toAddressOrDomain: data.toAddressOrDomain,\n resolvedDomain: resolvedDomainData?.domain,\n resolvedAddress: resolvedDomainData?.address,\n amount: data.amount,\n selectedToken,\n formattedTotalAmount: formattedValue,\n setCurrentContent,\n },\n });\n };\n\n if (isSelectingToken) {\n return (\n <SelectTokenContent\n setCurrentContent={setCurrentContent}\n onSelectToken={(token) => {\n setSelectedToken(token);\n setIsSelectingToken(false);\n }}\n onBack={() => {\n setIsSelectingToken(false);\n }}\n />\n );\n }\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{t('Send')}</ModalHeader>\n {!isolatedView && <ModalBackButton onClick={handleBack} />}\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack spacing={2} align=\"stretch\" position=\"relative\">\n <HStack justify=\"space-between\">\n <Text\n fontSize=\"md\"\n fontWeight=\"bold\"\n color={textPrimary}\n >\n {t('Amount')}\n </Text>\n\n <Text\n cursor=\"pointer\"\n _hover={{\n color: textSecondary,\n textDecoration: 'underline',\n }}\n onClick={handleSetMaxAmount}\n noOfLines={1}\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n fontSize=\"sm\"\n fontWeight=\"medium\"\n color={textSecondary}\n >\n {t('Balance')}:{' '}\n {Number(selectedToken?.balance ?? 0).toLocaleString(\n undefined,\n {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n },\n )}\n </Text>\n </HStack>\n\n <Box p={4} borderRadius=\"2xl\" bg={cardBg}>\n <VStack align=\"stretch\" spacing={2}>\n <FormControl isInvalid={!!errors.amount}>\n <HStack justify=\"space-between\">\n <Input\n {...register('amount', {\n required: t('Amount is required'),\n pattern: {\n value: /^\\d*\\.?\\d*$/,\n message: t(\n 'Please enter a valid number',\n ),\n },\n validate: (value) => {\n if (!value) return true;\n const numericValue =\n parseFloat(value);\n if (isNaN(numericValue)) {\n return t(\n 'Please enter a valid number',\n );\n }\n\n // Enforce minimum amount for B3TR (in ether units)\n const minB3tr =\n feeDelegation?.b3trTransfers\n ?.minAmountInEther;\n if (\n selectedToken?.symbol ===\n 'B3TR' &&\n typeof minB3tr ===\n 'number' &&\n minB3tr > 0 &&\n numericValue < minB3tr\n ) {\n return t(\n 'Minimum {{symbol}} transfer is {{min}}',\n {\n symbol: selectedToken.symbol,\n min: minB3tr,\n },\n );\n }\n\n return true;\n },\n })}\n onChange={(e) => {\n const trimmed =\n e.target.value.trim();\n e.target.value = trimmed;\n setValue('amount', trimmed, {\n shouldValidate: true,\n });\n }}\n placeholder=\"0\"\n variant=\"unstyled\"\n fontSize=\"4xl\"\n fontWeight=\"bold\"\n data-testid=\"tx-amount-input\"\n type=\"number\"\n inputMode=\"decimal\"\n color={textPrimary}\n />\n\n {selectedToken ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n borderRadius=\"full\"\n px={6}\n color={textSecondary}\n borderColor={textSecondary}\n _hover={{\n bg: isDark\n ? 'whiteAlpha.300'\n : 'blackAlpha.300',\n }}\n onClick={() =>\n setIsSelectingToken(true)\n }\n leftIcon={\n TOKEN_LOGO_COMPONENTS[\n selectedToken.symbol\n ] ? (\n React.cloneElement(\n TOKEN_LOGO_COMPONENTS[\n selectedToken.symbol\n ],\n {\n boxSize: '20px',\n borderRadius:\n 'full',\n },\n )\n ) : (\n <Image\n src={\n TOKEN_LOGOS[\n selectedToken\n .symbol\n ]\n }\n alt={`${selectedToken.symbol} logo`}\n boxSize=\"20px\"\n borderRadius=\"full\"\n fallback={\n <Box\n boxSize=\"20px\"\n borderRadius=\"full\"\n bg=\"whiteAlpha.200\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Text\n fontSize=\"8px\"\n fontWeight=\"bold\"\n color={\n textPrimary\n }\n >\n {selectedToken.symbol.slice(\n 0,\n 3,\n )}\n </Text>\n </Box>\n }\n />\n )\n }\n >\n {selectedToken.symbol}\n\n <Icon\n as={LuChevronDown}\n boxSize={5}\n color={textSecondary}\n />\n </Button>\n ) : (\n <Button\n variant=\"outline\"\n size=\"sm\"\n borderRadius=\"full\"\n px={6}\n color={textSecondary}\n borderColor={textSecondary}\n _hover={{\n bg: isDark\n ? 'whiteAlpha.300'\n : 'blackAlpha.300',\n color: textTertiary,\n }}\n onClick={() =>\n setIsSelectingToken(true)\n }\n >\n {t('Select token')}\n <Icon\n as={LuChevronDown}\n boxSize={5}\n color={textSecondary}\n />\n </Button>\n )}\n </HStack>\n {selectedToken && (\n <HStack\n spacing={1}\n fontSize=\"sm\"\n justifyContent={'space-between'}\n color={textSecondary}\n >\n <Text color={textSecondary}>\n ≈ {formattedValue}\n </Text>\n </HStack>\n )}\n {errors.amount && (\n <Text\n color=\"#ef4444\"\n fontSize=\"sm\"\n mt={1}\n data-testid=\"amount-error-msg\"\n >\n {errors.amount.message}\n </Text>\n )}\n </FormControl>\n </VStack>\n </Box>\n\n <HStack justify=\"space-between\" mt={2}>\n <Text\n fontSize=\"md\"\n fontWeight=\"bold\"\n color={textPrimary}\n >\n {t('To')}\n </Text>\n </HStack>\n <Box borderRadius=\"2xl\" bg={cardBg}>\n <VStack align=\"stretch\" spacing={2} p={4} width=\"100%\">\n <FormControl isInvalid={!!errors.toAddressOrDomain}>\n <Input\n {...register('toAddressOrDomain', {\n required: t('Address is required'),\n })}\n onChange={(e) => {\n const trimmed = e.target.value.trim();\n // If the input contains a dot, treat it as a domain name and normalize it\n const normalizedValue =\n trimmed.includes('.')\n ? ens_normalize(trimmed)\n : trimmed;\n e.target.value = normalizedValue;\n setValue(\n 'toAddressOrDomain',\n normalizedValue,\n {\n shouldValidate: true,\n },\n );\n }}\n placeholder={t(\n 'Type the receiver address or domain',\n )}\n _placeholder={{\n fontSize: 'md',\n fontWeight: 'normal',\n }}\n fontSize=\"lg\"\n fontWeight=\"bold\"\n color={textPrimary}\n variant=\"unstyled\"\n data-testid=\"tx-address-input\"\n />\n {errors.toAddressOrDomain && (\n <Text\n color={errorColor}\n fontSize=\"sm\"\n data-testid=\"address-error-msg\"\n >\n {errors.toAddressOrDomain.message}\n </Text>\n )}\n </FormControl>\n </VStack>\n </Box>\n </VStack>\n </ModalBody>\n\n <ModalFooter>\n <Button\n variant=\"vechainKitPrimary\"\n isDisabled={!selectedToken || !isValid}\n isLoading={isLoading}\n onClick={handleSubmit(onSubmit)}\n data-testid=\"send-button\"\n >\n {selectedToken ? t('Send') : t('Select Token')}\n </Button>\n </ModalFooter>\n </>\n );\n};\n","import React, { useMemo } from 'react';\nimport {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Text,\n HStack,\n ModalFooter,\n useToken,\n Box,\n} from '@chakra-ui/react';\nimport {\n ModalBackButton,\n StickyHeaderContainer,\n AddressDisplayCard,\n TransactionButtonAndStatus,\n GasFeeSummary,\n} from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { getPicassoImage } from '../../../../utils';\nimport {\n useTransferERC20,\n useTransferVET,\n useUpgradeRequired,\n useUpgradeSmartAccountModal,\n useWallet,\n TokenWithValue,\n useGasTokenSelection,\n useGenericDelegatorFeeEstimation,\n} from '../../../../hooks';\nimport { useTranslation } from 'react-i18next';\n// Import from VeChainKitContext to avoid circular dependency with providers barrel\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\nimport { useGetAvatarOfAddress } from '../../../../hooks/api/vetDomains';\nimport type { GasTokenType } from '../../../../types/gasToken';\nimport { useAccountModalOptions } from '../../../../hooks/modals/useAccountModalOptions';\n\nexport type SendTokenSummaryContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n toAddressOrDomain: string;\n resolvedDomain?: string;\n resolvedAddress?: string;\n amount: string;\n selectedToken: TokenWithValue;\n formattedTotalAmount: string;\n};\n\nexport const SendTokenSummaryContent = ({\n setCurrentContent,\n toAddressOrDomain,\n resolvedDomain,\n resolvedAddress,\n amount,\n selectedToken,\n formattedTotalAmount,\n}: SendTokenSummaryContentProps) => {\n const { t } = useTranslation();\n const { account, connection, connectedWallet } = useWallet();\n const { data: avatar } = useGetAvatarOfAddress(resolvedAddress ?? '');\n const { network, feeDelegation } = useVeChainKitConfig();\n const { preferences } = useGasTokenSelection();\n const { isolatedView, closeAccountModal } = useAccountModalOptions();\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n\n const { data: upgradeRequired } = useUpgradeRequired(\n account?.address ?? '',\n connectedWallet?.address ?? '',\n 3,\n );\n const { open: openUpgradeSmartAccountModal } =\n useUpgradeSmartAccountModal();\n // Get the final image URL\n const toImageSrc = useMemo(() => {\n if (avatar) {\n return avatar;\n }\n return getPicassoImage(resolvedAddress || toAddressOrDomain);\n }, [avatar, network.type, resolvedAddress, toAddressOrDomain]);\n\n const handleSend = async () => {\n if (upgradeRequired) {\n openUpgradeSmartAccountModal();\n return;\n }\n\n try {\n if (selectedToken.symbol === 'VET') {\n await transferVET();\n } else {\n await transferERC20();\n }\n } catch (error) {\n console.error(t('Transaction failed:'), error);\n }\n };\n\n const handleSuccess = React.useCallback(\n (txId: string) => {\n setCurrentContent({\n type: 'successful-operation',\n props: {\n setCurrentContent,\n txId,\n title: t('Transaction successful'),\n onDone: () => {\n if (isolatedView) {\n closeAccountModal();\n } else {\n setCurrentContent('main');\n }\n },\n showSocialButtons: true,\n },\n });\n },\n [setCurrentContent, t, isolatedView, closeAccountModal],\n );\n\n const {\n sendTransaction: transferERC20,\n txReceipt: transferERC20Receipt,\n error: transferERC20Error,\n isWaitingForWalletConfirmation:\n transferERC20WaitingForWalletConfirmation,\n isTransactionPending: transferERC20Pending,\n clauses: erc20Clauses,\n } = useTransferERC20({\n fromAddress: account?.address ?? '',\n receiverAddress: resolvedAddress || toAddressOrDomain,\n amount,\n tokenAddress: selectedToken.address,\n tokenName: selectedToken.symbol,\n onError: (error) => {\n handleError(error ?? '');\n },\n });\n\n const {\n sendTransaction: transferVET,\n txReceipt: transferVETReceipt,\n error: transferVETError,\n isWaitingForWalletConfirmation: transferVETWaitingForWalletConfirmation,\n isTransactionPending: transferVETPending,\n clauses: vetClauses,\n } = useTransferVET({\n fromAddress: account?.address ?? '',\n receiverAddress: resolvedAddress || toAddressOrDomain,\n amount,\n onError: (error) => {\n handleError(error ?? '');\n },\n });\n\n const getTxReceipt = React.useCallback(() => {\n return selectedToken.symbol === 'VET'\n ? transferVETReceipt\n : transferERC20Receipt;\n }, [selectedToken.symbol, transferVETReceipt, transferERC20Receipt]);\n\n const isTxWaitingConfirmation =\n transferERC20WaitingForWalletConfirmation ||\n transferVETWaitingForWalletConfirmation;\n const isSubmitting =\n isTxWaitingConfirmation || transferERC20Pending || transferVETPending;\n\n // Track if we've already shown success to prevent duplicate calls\n const [hasShownSuccess, setHasShownSuccess] = React.useState(false);\n\n // Handle successful transaction via useEffect to avoid synchronous state updates\n React.useEffect(() => {\n const receipt = getTxReceipt();\n\n // Guard clauses\n if (!receipt) return;\n if (receipt.reverted) return;\n if (hasShownSuccess) return;\n if (isSubmitting) return;\n\n const txId = receipt.meta.txID;\n if (!txId) return;\n\n setHasShownSuccess(true);\n handleSuccess(txId);\n }, [getTxReceipt, hasShownSuccess, isSubmitting, handleSuccess]);\n\n // Reset the flag when starting a new transaction\n React.useEffect(() => {\n if (isSubmitting) {\n setHasShownSuccess(false);\n }\n }, [isSubmitting]);\n\n const handleBack = () => {\n setCurrentContent({\n type: 'send-token',\n props: {\n setCurrentContent,\n preselectedToken: selectedToken,\n initialAmount: amount,\n initialToAddressOrDomain: toAddressOrDomain,\n },\n });\n };\n\n const handleError = (error: string) => {\n console.error('Transaction failed:', error);\n };\n\n const [selectedGasToken, setSelectedGasToken] =\n React.useState<GasTokenType | null>(null);\n // Track the user's manual selection to show it during loading (before estimation completes)\n const [userSelectedGasToken, setUserSelectedGasToken] =\n React.useState<GasTokenType | null>(null);\n\n const shouldEstimateGas =\n preferences.availableGasTokens.length > 0 &&\n (connection.isConnectedWithPrivy ||\n connection.isConnectedWithVeChain) &&\n !feeDelegation?.delegatorUrl;\n const {\n data: gasEstimation,\n isLoading: gasEstimationLoading,\n error: gasEstimationError,\n refetch: refetchGasEstimation,\n } = useGenericDelegatorFeeEstimation({\n clauses: selectedToken.symbol === 'VET' ? vetClauses : erc20Clauses,\n tokens: selectedGasToken\n ? [selectedGasToken]\n : preferences.availableGasTokens, // Use selected token or all available\n sendingAmount: amount,\n sendingTokenSymbol: selectedToken.symbol,\n enabled: shouldEstimateGas && !!feeDelegation?.genericDelegatorUrl,\n });\n const usedGasToken = gasEstimation?.usedToken;\n const disableConfirmButtonDuringEstimation =\n (gasEstimationLoading || !gasEstimation) &&\n connection.isConnectedWithPrivy &&\n !feeDelegation?.delegatorUrl;\n\n const handleGasTokenChange = React.useCallback(\n (token: GasTokenType) => {\n setSelectedGasToken(token);\n setUserSelectedGasToken(token); // Track user's choice\n // Refetch will be triggered automatically by the query key change\n setTimeout(() => refetchGasEstimation(), 100);\n },\n [refetchGasEstimation],\n );\n\n // hasEnoughBalance is now determined by the hook itself\n const hasEnoughBalance = !!usedGasToken && !gasEstimationError;\n\n // Auto-fallback: if the selected token cannot cover fees (estimation error),\n // clear selection to re-estimate across all available tokens\n // Keep userSelectedGasToken to show during loading, but actual result will show the token that succeeds\n React.useEffect(() => {\n if (gasEstimationError && selectedGasToken) {\n setSelectedGasToken(null);\n }\n }, [gasEstimationError, selectedGasToken]);\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>Send</ModalHeader>\n <ModalBackButton\n isDisabled={isSubmitting}\n onClick={handleBack}\n />\n <ModalCloseButton isDisabled={isSubmitting} />\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack spacing={6} align=\"stretch\" w=\"full\">\n {/* From/To Card */}\n\n <VStack spacing={4} w=\"full\">\n <Box w=\"full\">\n <Text fontSize=\"sm\" mb={2} color={textSecondary}>\n {t('From')}\n </Text>\n <AddressDisplayCard\n address={account?.address ?? ''}\n domain={account?.domain}\n imageSrc={account?.image ?? ''}\n imageAlt=\"From account\"\n balance={Number(selectedToken.balance)}\n tokenAddress={selectedToken.address}\n />\n </Box>\n\n <Box w=\"full\">\n <Text fontSize=\"sm\" mb={2} color={textSecondary}>\n {t('To')}\n </Text>\n <AddressDisplayCard\n address={resolvedAddress || toAddressOrDomain}\n domain={resolvedDomain}\n imageSrc={toImageSrc ?? ''}\n imageAlt=\"To account\"\n tokenAddress={selectedToken.address}\n />\n </Box>\n\n {connection.isConnectedWithPrivy && (\n <GasFeeSummary\n estimation={gasEstimation}\n isLoading={gasEstimationLoading}\n isLoadingTransaction={isSubmitting}\n onTokenChange={handleGasTokenChange}\n clauses={\n selectedToken.symbol === 'VET'\n ? vetClauses\n : erc20Clauses\n }\n userSelectedToken={userSelectedGasToken}\n />\n )}\n\n <VStack\n spacing={0}\n w=\"full\"\n justifyContent=\"flex-start\"\n >\n <Text\n fontSize=\"sm\"\n fontWeight=\"light\"\n textAlign=\"left\"\n w=\"full\"\n color={textSecondary}\n >\n {t('Amount')}\n </Text>\n <HStack justifyContent=\"flex-start\" w=\"full\">\n <Text\n fontSize=\"xl\"\n fontWeight=\"semibold\"\n textAlign=\"left\"\n data-testid=\"send-summary-amount\"\n color={textPrimary}\n >\n {Number(amount).toLocaleString(undefined, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}{' '}\n {selectedToken.symbol}\n </Text>\n <Text color={textSecondary}>\n ≈ {formattedTotalAmount}\n </Text>\n </HStack>\n </VStack>\n </VStack>\n </VStack>\n </ModalBody>\n\n <ModalFooter>\n <TransactionButtonAndStatus\n transactionError={\n selectedToken.symbol === 'VET'\n ? transferVETError\n : transferERC20Error\n }\n isSubmitting={isSubmitting}\n isTxWaitingConfirmation={isTxWaitingConfirmation}\n onConfirm={handleSend}\n transactionPendingText={t('Sending...')}\n txReceipt={getTxReceipt()}\n buttonText={t('Confirm')}\n isDisabled={\n isSubmitting || disableConfirmButtonDuringEstimation\n }\n gasEstimationError={gasEstimationError}\n hasEnoughGasBalance={hasEnoughBalance}\n isLoadingGasEstimation={gasEstimationLoading}\n showGasEstimationError={\n !feeDelegation?.delegatorUrl &&\n connection.isConnectedWithPrivy\n }\n context=\"send\"\n />\n </ModalFooter>\n </>\n );\n};\n","import {\n Container,\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Text,\n ModalFooter,\n useToken,\n} from '@chakra-ui/react';\nimport { QRCode } from 'react-qrcode-logo';\nimport {\n ModalBackButton,\n StickyHeaderContainer,\n AddressDisplay,\n} from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { useWallet } from '../../../../hooks';\nimport { useTranslation } from 'react-i18next';\nimport { useAccountModalOptions } from '../../../../hooks/modals/useAccountModalOptions';\n\ntype Props = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n};\n\nexport const ReceiveTokenContent = ({ setCurrentContent }: Props) => {\n const { t } = useTranslation();\n const { account } = useWallet();\n const { isolatedView } = useAccountModalOptions();\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{t('Receive')}</ModalHeader>\n {!isolatedView && (\n <ModalBackButton\n onClick={() => setCurrentContent('main')}\n />\n )}\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <Container maxW={'container.lg'}>\n <ModalBody>\n <VStack spacing={4} align=\"center\" w=\"full\">\n <QRCode\n value={account?.address ?? ''}\n size={200}\n removeQrCodeBehindLogo={true}\n eyeRadius={4}\n logoPaddingStyle={'circle'}\n style={{\n borderRadius: '16px',\n }}\n />\n\n <AddressDisplay wallet={account} style={{ w: '85%' }} />\n\n <Text\n fontSize=\"sm\"\n textAlign=\"center\"\n color={textPrimary}\n >\n {t('Copy your address or scan this QR code')}\n </Text>\n\n <Text\n fontSize=\"xs\"\n textAlign=\"center\"\n color={textSecondary}\n >\n {t('This address only supports VeChain assets.')}\n </Text>\n </VStack>\n </ModalBody>\n <ModalFooter pt={0} />\n </Container>\n </>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n HStack,\n Text,\n Container,\n Box,\n Badge,\n Collapse,\n Icon,\n Image,\n Tooltip,\n ModalFooter,\n} from '@chakra-ui/react';\nimport { ModalBackButton, StickyHeaderContainer } from '../../../common';\nimport type { SwapQuote } from '../../../../types/swap';\nimport { useTranslation } from 'react-i18next';\n// Import from VeChainKitContext to avoid circular dependency with providers barrel\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\nimport { formatEther } from 'viem';\nimport { LuChevronDown, LuChevronUp } from 'react-icons/lu';\nimport { formatCompactCurrency, SupportedCurrency, convertToSelectedCurrency } from '../../../../utils/currencyUtils';\nimport { useCurrency, useTokensWithValues, useWallet } from '../../../../hooks';\nimport { useTokenPrices } from '../../../../hooks';\nimport { useState, useMemo } from 'react';\nimport { TOKEN_LOGO_COMPONENTS, TOKEN_LOGOS, compareAddresses } from '../../../../utils';\nimport React from 'react';\n\ntype Props = {\n quotes: SwapQuote[];\n selectedQuote: SwapQuote | null;\n toTokenAddress: string | null;\n onSelectQuote: (quote: SwapQuote) => void;\n onBack: () => void;\n};\n\nexport const SelectQuoteContent = ({\n quotes,\n selectedQuote,\n toTokenAddress,\n onSelectQuote,\n onBack,\n}: Props) => {\n const { t } = useTranslation();\n const { darkMode: isDark } = useVeChainKitConfig();\n const { currentCurrency } = useCurrency();\n const { account } = useWallet();\n const { exchangeRates, prices } = useTokenPrices();\n const { tokens } = useTokensWithValues({ address: account?.address ?? '' });\n const [showUnavailable, setShowUnavailable] = useState(false);\n\n // Get toToken symbol from address\n const toToken = useMemo(() => {\n if (!toTokenAddress) return null;\n // Use compareAddresses for proper address comparison\n return tokens.find(t => compareAddresses(t.address, toTokenAddress)) || null;\n }, [toTokenAddress, tokens]);\n\n\n // Separate available and unavailable quotes\n const availableQuotes = quotes.filter(q => !q.reverted);\n const unavailableQuotes = quotes.filter(q => q.reverted);\n\n // Find the best quote (highest output amount among available)\n const bestQuote = useMemo(() => {\n if (availableQuotes.length === 0) return null;\n return availableQuotes.reduce((best, current) => {\n const bestOutput = BigInt(best.outputAmount || '0');\n const currentOutput = BigInt(current.outputAmount || '0');\n return currentOutput > bestOutput ? current : best;\n });\n }, [availableQuotes]);\n\n // Calculate USD value for each quote\n const quotesWithValues = useMemo(() => {\n const toTokenPriceUsd = toTokenAddress ? (prices[toTokenAddress] || 0) : 0;\n\n return availableQuotes.map((quote) => {\n const outputAmountFormatted = formatEther(BigInt(quote.outputAmount || '0'));\n const valueUsd = Number(outputAmountFormatted) * toTokenPriceUsd;\n const valueInCurrency = convertToSelectedCurrency(\n valueUsd,\n currentCurrency as SupportedCurrency,\n exchangeRates,\n );\n const isBest = bestQuote && quote.aggregatorName === bestQuote.aggregatorName;\n\n // Calculate percentage difference from best\n let percentageDiff = 0;\n if (bestQuote && !isBest) {\n const bestOutput = BigInt(bestQuote.outputAmount || '0');\n const currentOutput = BigInt(quote.outputAmount || '0');\n const diff = Number(currentOutput - bestOutput);\n percentageDiff = (diff / Number(bestOutput)) * 100;\n }\n\n return {\n ...quote,\n outputAmountFormatted,\n valueUsd,\n valueInCurrency,\n isBest,\n percentageDiff,\n };\n }).sort((a, b) => {\n // Sort by output amount (descending)\n const aOutput = BigInt(a.outputAmount || '0');\n const bOutput = BigInt(b.outputAmount || '0');\n return Number(bOutput - aOutput);\n });\n }, [availableQuotes, toTokenAddress, prices, currentCurrency, exchangeRates, bestQuote]);\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{t('Found following rates')}</ModalHeader>\n <ModalBackButton onClick={onBack} />\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <Container h={['540px', 'auto']} p={0}>\n <ModalBody>\n <VStack spacing={6} align=\"stretch\">\n {/* Available Quotes */}\n {quotesWithValues.length > 0 && (\n <VStack spacing={2} align=\"stretch\">\n {quotesWithValues.map((quoteWithValue) => {\n const isSelected = selectedQuote?.aggregatorName === quoteWithValue.aggregatorName;\n\n return (\n <Box\n key={quoteWithValue.aggregatorName}\n p={2.5}\n borderRadius=\"xl\"\n bg={isDark ? '#00000038' : 'gray.50'}\n borderWidth={1}\n borderColor={\n isSelected\n ? 'blue.500'\n : isDark\n ? 'whiteAlpha.200'\n : 'gray.200'\n }\n cursor=\"pointer\"\n onClick={() => onSelectQuote(quoteWithValue)}\n _hover={{\n borderColor: isSelected ? 'blue.500' : (isDark ? 'whiteAlpha.400' : 'gray.300'),\n }}\n position=\"relative\"\n >\n {/* Badge tag on top left */}\n {(quoteWithValue.isBest || (!quoteWithValue.isBest && quoteWithValue.percentageDiff < 0)) && (\n <Box position=\"absolute\" top={-1} left={0} zIndex={1}>\n {quoteWithValue.isBest ? (\n <Badge\n colorScheme=\"purple\"\n borderRadius=\"sm\"\n fontSize=\"2xs\"\n px={1.5}\n py={0.5}\n borderTopLeftRadius=\"xl\"\n borderBottomRightRadius=\"md\"\n >\n {t('Best')}\n </Badge>\n ) : (\n <Badge\n colorScheme=\"red\"\n borderRadius=\"xs\"\n fontSize=\"2xs\"\n px={1.5}\n py={0.5}\n borderTopLeftRadius=\"xl\"\n borderBottomRightRadius=\"md\"\n >\n {quoteWithValue.percentageDiff.toFixed(2)}%\n </Badge>\n )}\n </Box>\n )}\n\n <VStack align=\"stretch\" spacing={1.5} marginTop={4}>\n {/* Aggregator name/icon and token amount in same line */}\n <HStack justify=\"space-between\" align=\"center\">\n <HStack spacing={1.5} align=\"center\">\n {quoteWithValue.aggregator.getIcon('20px')}\n <Text\n fontSize=\"md\"\n fontWeight=\"bold\"\n >\n {quoteWithValue.aggregatorName}\n </Text>\n </HStack>\n <HStack align=\"center\" spacing={1.5}>\n {toToken && (\n <>\n {TOKEN_LOGO_COMPONENTS[toToken.symbol] ? (\n React.cloneElement(\n TOKEN_LOGO_COMPONENTS[toToken.symbol],\n {\n boxSize: '24px',\n borderRadius: 'full',\n }\n )\n ) : TOKEN_LOGOS[toToken.symbol] ? (\n <Image\n src={TOKEN_LOGOS[toToken.symbol]}\n alt={`${toToken.symbol} logo`}\n boxSize=\"24px\"\n borderRadius=\"full\"\n />\n ) : null}\n <Tooltip\n label={Number(quoteWithValue.outputAmountFormatted).toLocaleString(undefined, { maximumFractionDigits: 18 })}\n hasArrow\n placement=\"top\"\n >\n <Text\n fontSize=\"md\"\n fontWeight=\"bold\"\n textAlign=\"right\"\n whiteSpace=\"nowrap\"\n >\n {Number(quoteWithValue.outputAmountFormatted).toLocaleString(undefined, {\n minimumFractionDigits: 4,\n })}\n {' '}{toToken.symbol}\n </Text>\n </Tooltip>\n </>\n )}\n </HStack>\n </HStack>\n\n {/* Gas and fiat value in same line underneath */}\n <HStack justify=\"space-between\" align=\"center\">\n <Text\n fontSize=\"xs\"\n color={isDark ? 'whiteAlpha.500' : 'blackAlpha.500'}\n >\n {quoteWithValue.gasCostVTHO && quoteWithValue.gasCostVTHO > 0\n ? `Gas: ${quoteWithValue.gasCostVTHO.toLocaleString(undefined, {\n maximumFractionDigits: 2,\n })} VTHO`\n : ''}\n </Text>\n {quoteWithValue.valueUsd > 0 && (\n <Text\n fontSize=\"xs\"\n color={isDark ? 'whiteAlpha.600' : 'blackAlpha.600'}\n textAlign=\"right\"\n whiteSpace=\"nowrap\"\n >\n ≈ {formatCompactCurrency(\n quoteWithValue.valueInCurrency,\n { currency: currentCurrency as SupportedCurrency },\n )}\n </Text>\n )}\n </HStack>\n </VStack>\n </Box>\n );\n })}\n </VStack>\n )}\n\n {/* Unavailable Quotes */}\n {unavailableQuotes.length > 0 && (\n <Box>\n <HStack\n justify=\"space-between\"\n cursor=\"pointer\"\n onClick={() => setShowUnavailable(!showUnavailable)}\n py={2}\n >\n <Text\n fontSize=\"sm\"\n color={isDark ? 'whiteAlpha.600' : 'blackAlpha.600'}\n >\n {unavailableQuotes.length} {t('rate')}{unavailableQuotes.length !== 1 ? 's' : ''} {t('unavailable')}\n </Text>\n <Icon\n as={showUnavailable ? LuChevronUp : LuChevronDown}\n boxSize={4}\n color={isDark ? 'whiteAlpha.600' : 'blackAlpha.600'}\n />\n </HStack>\n <Collapse in={showUnavailable} animateOpacity>\n <VStack spacing={2} align=\"stretch\" pt={2}>\n {unavailableQuotes.map((quote) => (\n <Box\n key={quote.aggregatorName}\n p={2}\n borderRadius=\"xl\"\n bg={isDark ? '#00000038' : 'gray.50'}\n opacity={0.6}\n >\n <HStack justify=\"space-between\">\n <HStack spacing={2} align=\"center\">\n {quote.aggregator.getIcon('20px')}\n <Text\n fontSize=\"md\"\n fontWeight=\"medium\"\n >\n {quote.aggregatorName}\n </Text>\n </HStack>\n <Text\n fontSize=\"xs\"\n color={isDark ? 'whiteAlpha.500' : 'blackAlpha.500'}\n >\n {t('Unable to fetch the price')}\n </Text>\n </HStack>\n </Box>\n ))}\n </VStack>\n </Collapse>\n </Box>\n )}\n\n {quotesWithValues.length === 0 && unavailableQuotes.length === 0 && (\n <VStack\n spacing={2}\n py={8}\n color={isDark ? 'whiteAlpha.600' : 'blackAlpha.600'}\n >\n <Text fontSize=\"lg\">\n {t('No quotes available')}\n </Text>\n </VStack>\n )}\n </VStack>\n </ModalBody>\n </Container>\n <ModalFooter />\n </>\n );\n};\n\n","import { decodeEventLog, zeroAddress } from 'viem';\nimport { IERC20__factory } from '@vechain/vechain-contract-types';\nimport type { TransactionReceipt, Event, Transfer } from '@vechain/sdk-network';\n\n/**\n * Check if address is native VET token\n */\nconst isVET = (address: string): boolean => {\n return address === '0x' || address === zeroAddress || !address;\n};\n\n/**\n * Extract swap amounts from transaction receipt by parsing Transfer events\n * @param receipt Transaction receipt containing events\n * @param userAddress User's wallet address\n * @param fromTokenAddress Address of the token being swapped from\n * @param toTokenAddress Address of the token being swapped to\n * @returns Object containing formatted amounts and symbols, or null if not found\n */\nexport const extractSwapAmounts = (\n receipt: TransactionReceipt,\n userAddress: string,\n fromTokenAddress: string,\n toTokenAddress: string,\n): {\n fromAmount: bigint;\n toAmount: bigint;\n} | null => {\n if (!receipt || !userAddress || !fromTokenAddress || !toTokenAddress) {\n return null;\n }\n\n const userAddressLower = userAddress.toLowerCase();\n const fromTokenAddressLower = fromTokenAddress.toLowerCase();\n const toTokenAddressLower = toTokenAddress.toLowerCase();\n const isFromTokenVET = isVET(fromTokenAddress);\n const isToTokenVET = isVET(toTokenAddress);\n\n // Get all events and transfers from receipt outputs\n const allEvents: Event[] = [];\n const allTransfers: Transfer[] = [];\n\n if (receipt.outputs && Array.isArray(receipt.outputs)) {\n for (const output of receipt.outputs) {\n // Events can be direct array or nested - handle both cases\n if (output.events && Array.isArray(output.events)) {\n allEvents.push(...output.events);\n }\n // Collect native VET transfers\n if (output.transfers && Array.isArray(output.transfers)) {\n allTransfers.push(...output.transfers);\n }\n }\n }\n\n // Get ERC20 ABI for decoding (only needed if we have ERC20 tokens)\n const ERC20Interface = IERC20__factory.createInterface();\n const transferEventAbi = ERC20Interface.getEvent('Transfer');\n const transferEventTopicHash = transferEventAbi?.topicHash.toLowerCase();\n\n // Filter for Transfer events (only needed for ERC20 tokens)\n const transferEvents = allEvents.filter((event) => {\n // Check if topic[0] matches Transfer event signature\n return (\n event.topics &&\n event.topics.length > 0 &&\n event.topics[0]?.toString().toLowerCase() === transferEventTopicHash\n );\n });\n\n // Decode transfer events and find relevant ones\n let fromAmount: bigint | null = null;\n let toAmount: bigint | null = null;\n\n // Handle native VET transfers from transfers array\n if (isFromTokenVET) {\n // Find VET transfer FROM the user\n for (const transfer of allTransfers) {\n if (\n transfer.sender?.toLowerCase() === userAddressLower &&\n transfer.amount &&\n transfer.amount !== '0x0' &&\n transfer.amount !== '0x'\n ) {\n const amount = BigInt(transfer.amount);\n if (amount > 0n) {\n fromAmount = amount;\n break; // Take the first matching transfer\n }\n }\n }\n }\n\n if (isToTokenVET) {\n // Find VET transfer TO the user\n for (const transfer of allTransfers) {\n if (\n transfer.recipient?.toLowerCase() === userAddressLower &&\n transfer.amount &&\n transfer.amount !== '0x0' &&\n transfer.amount !== '0x'\n ) {\n const amount = BigInt(transfer.amount);\n if (amount > 0n) {\n toAmount = amount;\n break; // Take the first matching transfer\n }\n }\n }\n }\n\n // Handle ERC20 token transfers from Transfer events (only if we have ERC20 tokens)\n if (transferEvents.length > 0) {\n for (const event of transferEvents) {\n try {\n const decoded = decodeEventLog({\n abi: [transferEventAbi],\n data: event.data.toString() as `0x${string}`,\n topics: event.topics.map((t: any) => t.toString()) as [\n `0x${string}`,\n ...`0x${string}`[],\n ],\n });\n\n // Type guard for Transfer event args\n if (\n !decoded.args ||\n !('from' in decoded.args) ||\n !('to' in decoded.args) ||\n !('value' in decoded.args)\n ) {\n continue;\n }\n\n const from = (\n decoded.args as {\n from: `0x${string}`;\n to: `0x${string}`;\n value: bigint;\n }\n ).from\n ?.toString()\n .toLowerCase();\n const to = (\n decoded.args as {\n from: `0x${string}`;\n to: `0x${string}`;\n value: bigint;\n }\n ).to\n ?.toString()\n .toLowerCase();\n const value = (\n decoded.args as {\n from: `0x${string}`;\n to: `0x${string}`;\n value: bigint;\n }\n ).value as bigint;\n\n // Get contract address from event\n // Event type from TransactionReceipt has address as string\n const eventContractAddress = event.address.toLowerCase();\n\n // Check if this is a transfer FROM the user for the fromToken (skip if already found from VET transfers)\n if (\n !isFromTokenVET &&\n from === userAddressLower &&\n eventContractAddress &&\n eventContractAddress === fromTokenAddressLower &&\n value > 0n &&\n fromAmount === null\n ) {\n fromAmount = value;\n }\n\n // Check if this is a transfer TO the user for the toToken (skip if already found from VET transfers)\n if (\n !isToTokenVET &&\n to === userAddressLower &&\n eventContractAddress &&\n eventContractAddress === toTokenAddressLower &&\n value > 0n &&\n toAmount === null\n ) {\n toAmount = value;\n }\n } catch (error) {\n // Skip events that can't be decoded\n console.warn('Failed to decode transfer event:', error);\n continue;\n }\n }\n }\n\n return {\n fromAmount: fromAmount ?? 0n,\n toAmount: toAmount ?? 0n,\n };\n};\n","import React, { useState, useMemo, useCallback } from 'react';\nimport {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n HStack,\n Text,\n ModalFooter,\n Button,\n Icon,\n Box,\n Input,\n InputGroup,\n InputRightElement,\n Image,\n Collapse,\n useToken,\n} from '@chakra-ui/react';\nimport {\n GasFeeSummary,\n ModalBackButton,\n StickyHeaderContainer,\n TransactionButtonAndStatus,\n} from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { LuArrowDown, LuArrowUp, LuChevronDown } from 'react-icons/lu';\nimport { useTranslation } from 'react-i18next';\nimport {\n useWallet,\n useTokensWithValues,\n TokenWithValue,\n useSwapQuotes,\n useSwapTransaction,\n useCurrency,\n useGasTokenSelection,\n useGenericDelegatorFeeEstimation,\n} from '../../../../hooks';\nimport { SelectQuoteContent } from './SelectQuoteContent';\nimport type { SwapQuote } from '../../../../types/swap';\n// Import from VeChainKitContext to avoid circular dependency with providers barrel\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\nimport { TOKEN_LOGOS, TOKEN_LOGO_COMPONENTS } from '../../../../utils';\nimport { formatUnits, parseUnits } from 'viem';\nimport { getConfig } from '../../../../config';\nimport { compareAddresses } from '../../../../utils';\nimport { SelectTokenContent } from '../SendToken/SelectTokenContent';\nimport { formatCompactCurrency } from '../../../../utils/currencyUtils';\nimport {\n convertToSelectedCurrency,\n SupportedCurrency,\n} from '../../../../utils/currencyUtils';\nimport { useTokenPrices } from '../../../../hooks';\nimport type { GasTokenType } from '../../../../types/gasToken';\nimport { TransactionClause } from '@vechain/sdk-core';\nimport { extractSwapAmounts } from '../../../../utils/swap/extractSwapAmounts';\nimport { useAccountModalOptions } from '../../../../hooks/modals/useAccountModalOptions';\n\ntype Props = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n fromTokenAddress?: string;\n toTokenAddress?: string;\n};\n\ntype SwapStep =\n | 'main'\n | 'select-from-token'\n | 'select-to-token'\n | 'select-quote';\n\nexport const SwapTokenContent = ({\n setCurrentContent,\n fromTokenAddress,\n toTokenAddress,\n}: Props) => {\n const { t } = useTranslation();\n const { account, connection } = useWallet();\n const { currentCurrency } = useCurrency();\n const { network, feeDelegation, darkMode: isDark } = useVeChainKitConfig();\n const { isolatedView, closeAccountModal } = useAccountModalOptions();\n\n const cardBg = useToken('colors', 'vechain-kit-card');\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const textTertiary = useToken('colors', 'vechain-kit-text-tertiary');\n const primaryButtonBg = useToken('colors', 'vechain-kit-button-primary-bg');\n const primaryButtonColor = useToken(\n 'colors',\n 'vechain-kit-button-primary-color',\n );\n\n const { preferences } = useGasTokenSelection();\n const { sortedTokens } = useTokensWithValues({\n address: account?.address ?? '',\n });\n\n const [step, setStep] = useState<SwapStep>('main');\n const [fromToken, setFromToken] = useState<TokenWithValue | null>(null);\n const [toToken, setToToken] = useState<TokenWithValue | null>(null);\n const [amount, setAmount] = useState('');\n const [showMore, setShowMore] = useState(false);\n const [slippageTolerance, setSlippageTolerance] = useState(1);\n const [customSlippageValue, setCustomSlippageValue] = useState('1');\n const [selectedQuote, setSelectedQuote] = useState<SwapQuote | null>(null);\n const [selectedGasToken, setSelectedGasToken] =\n React.useState<GasTokenType | null>(null);\n const [userSelectedGasToken, setUserSelectedGasToken] =\n React.useState<GasTokenType | null>(null);\n const [swapClauses, setSwapClauses] = React.useState<TransactionClause[]>(\n [],\n );\n\n // Prices and FX to compute fiat values for entered and output amounts\n const { prices, exchangeRates } = useTokenPrices();\n\n // Determine if we're in auto mode (1% default) or custom mode\n const isAutoMode = slippageTolerance === 1;\n\n // Sync customSlippageValue with slippageTolerance\n React.useEffect(() => {\n if (slippageTolerance === 1) {\n setCustomSlippageValue('1');\n } else if (slippageTolerance === 0.5) {\n setCustomSlippageValue('0.5');\n } else if (slippageTolerance === 3) {\n setCustomSlippageValue('3');\n } else {\n setCustomSlippageValue(slippageTolerance.toString());\n }\n }, [slippageTolerance]);\n\n // Set initial tokens from provided addresses if present, otherwise default VET -> B3TR\n React.useEffect(() => {\n if (sortedTokens.length === 0) return;\n\n // Prefer provided addresses\n if ((fromTokenAddress || toTokenAddress) && (!fromToken || !toToken)) {\n if (fromTokenAddress && !fromToken) {\n const match = sortedTokens.find((t) =>\n compareAddresses(t.address, fromTokenAddress),\n );\n if (match) setFromToken(match);\n }\n if (toTokenAddress && !toToken) {\n const match = sortedTokens.find((t) =>\n compareAddresses(t.address, toTokenAddress),\n );\n if (match) setToToken(match);\n }\n return;\n }\n\n if (!fromToken && !toToken) {\n // Find VET token\n const vetToken = sortedTokens.find((t) => t.symbol === 'VET');\n if (vetToken) {\n setFromToken(vetToken);\n }\n\n // Find B3TR token: first try by symbol, then by address from config\n let b3trToken = sortedTokens.find((t) => t.symbol === 'B3TR');\n\n // If not found by symbol, try finding by address from config\n if (!b3trToken) {\n try {\n const config = getConfig(network.type);\n const b3trAddress = config.b3trContractAddress;\n if (b3trAddress) {\n b3trToken = sortedTokens.find((t) =>\n compareAddresses(t.address, b3trAddress),\n );\n }\n } catch (error) {\n console.warn(\n 'Failed to get B3TR address from config:',\n error,\n );\n }\n }\n\n if (b3trToken) {\n setToToken(b3trToken);\n }\n }\n }, [\n sortedTokens,\n fromToken,\n toToken,\n fromTokenAddress,\n toTokenAddress,\n network.type,\n ]);\n\n // Clear selected quote when quote parameters change\n // This ensures that when amount/token changes, we use the new best quote\n // instead of a stale manually selected quote\n React.useEffect(() => {\n setSelectedQuote(null);\n }, [fromToken?.address, toToken?.address, amount]);\n\n // Unified quotes: get best and full list\n const {\n bestQuote,\n quotes: allQuotes,\n isLoading: isLoadingQuote,\n from,\n to,\n } = useSwapQuotes(\n fromToken,\n toToken,\n amount,\n account?.address ?? '',\n slippageTolerance,\n !!fromToken && !!toToken && Number(amount) > 0,\n );\n\n // Convert amount to raw format for quote (now that we know decimals)\n const amountInRaw = useMemo(() => {\n if (!amount || Number(amount) <= 0 || !from) return 0n;\n try {\n return parseUnits(amount, from.decimals);\n } catch {\n return 0n;\n }\n }, [amount, from?.decimals]);\n\n // Use selected quote if available, otherwise use best quote\n const quote = selectedQuote || bestQuote;\n\n // Format output amount for display\n const outputAmount = useMemo(() => {\n if (!quote?.outputAmount || !to) return '0';\n try {\n // Convert from raw format to human-readable\n return formatUnits(quote.outputAmount, to.decimals);\n } catch {\n return '0';\n }\n }, [quote, to?.decimals]);\n\n // Fiat value for the entered input amount (from side)\n const fromAmountFiatValue = useMemo(() => {\n if (!fromToken || !amount) return 0;\n const priceUsd = prices[fromToken.address] || 0;\n const valueUsd = Number(amount) * priceUsd;\n return convertToSelectedCurrency(\n valueUsd,\n currentCurrency as SupportedCurrency,\n exchangeRates,\n );\n }, [fromToken?.address, amount, prices, currentCurrency, exchangeRates]);\n\n // Fiat value for the quoted output amount (to side)\n const toAmountFiatValue = useMemo(() => {\n if (!toToken || !outputAmount) return 0;\n const priceUsd = prices[toToken.address] || 0;\n const valueUsd = Number(outputAmount) * priceUsd;\n return convertToSelectedCurrency(\n valueUsd,\n currentCurrency as SupportedCurrency,\n exchangeRates,\n );\n }, [\n toToken?.address,\n outputAmount,\n prices,\n currentCurrency,\n exchangeRates,\n ]);\n\n // Simulate swap to get gas estimate\n const swapParams = useMemo(() => {\n if (!fromToken || !toToken || !account?.address || amountInRaw === 0n) {\n return null;\n }\n return {\n fromTokenAddress: fromToken.address,\n toTokenAddress: toToken.address,\n amountIn: amountInRaw.toString(),\n userAddress: account.address,\n slippageTolerance,\n };\n }, [fromToken, toToken, account?.address, amountInRaw, slippageTolerance]);\n\n // Use gas cost from quote if available, otherwise from simulation hook\n const gasCostVTHO = quote?.gasCostVTHO ?? 0;\n\n // Build swap clauses for gas estimation (async operation)\n React.useEffect(() => {\n const buildClauses = async () => {\n if (!quote || !swapParams || !quote.aggregator) {\n setSwapClauses([]);\n return;\n }\n\n try {\n const clauses = await quote.aggregator.buildSwapTransaction(\n swapParams,\n quote,\n );\n setSwapClauses(clauses);\n } catch (error) {\n console.error(\n 'Failed to build swap clauses for gas estimation:',\n error,\n );\n setSwapClauses([]);\n }\n };\n\n buildClauses();\n }, [quote, swapParams]);\n\n // Gas estimation for social login wallets with generic delegator\n const shouldEstimateGas =\n preferences.availableGasTokens.length > 0 &&\n (connection.isConnectedWithPrivy ||\n connection.isConnectedWithVeChain) &&\n !feeDelegation?.delegatorUrl;\n\n const {\n data: gasEstimation,\n isLoading: gasEstimationLoading,\n error: gasEstimationError,\n refetch: refetchGasEstimation,\n } = useGenericDelegatorFeeEstimation({\n clauses: swapClauses,\n tokens: selectedGasToken\n ? [selectedGasToken]\n : preferences.availableGasTokens,\n sendingAmount: amount,\n sendingTokenSymbol: fromToken?.symbol ?? '',\n enabled:\n shouldEstimateGas &&\n !!feeDelegation?.genericDelegatorUrl &&\n swapClauses.length > 0,\n });\n\n const usedGasToken = gasEstimation?.usedToken;\n const disableConfirmButtonDuringEstimation =\n (gasEstimationLoading || !gasEstimation) &&\n connection.isConnectedWithPrivy &&\n !feeDelegation?.delegatorUrl;\n\n const handleGasTokenChange = React.useCallback(\n (token: GasTokenType) => {\n setSelectedGasToken(token);\n setUserSelectedGasToken(token);\n setTimeout(() => refetchGasEstimation(), 100);\n },\n [refetchGasEstimation],\n );\n\n // hasEnoughBalance is now determined by the hook itself\n const hasEnoughBalance = !!usedGasToken && !gasEstimationError;\n\n // Auto-fallback: if the selected token cannot cover fees (estimation error),\n // clear selection to re-estimate across all available tokens\n React.useEffect(() => {\n if (gasEstimationError && selectedGasToken) {\n setSelectedGasToken(null);\n }\n }, [gasEstimationError, selectedGasToken]);\n\n // Swap transaction execution\n const {\n executeSwap,\n isTransactionPending,\n isWaitingForWalletConfirmation,\n txReceipt,\n status,\n error: txError,\n } = useSwapTransaction(swapParams, quote);\n\n const handleSwapSuccess = useCallback(() => {\n const txId = txReceipt?.meta.txID ?? '';\n // Extract swap amounts from receipt transfer events\n const swapTitle = t('Swap successful', {\n defaultValue: 'Swap successful',\n });\n let swapDescription: string | undefined;\n\n if (txReceipt && fromToken && toToken && account?.address) {\n const swapAmounts = extractSwapAmounts(\n txReceipt,\n account.address,\n fromToken.address,\n toToken.address,\n );\n\n if (swapAmounts && from && to) {\n try {\n // Format amounts using token decimals from useSwapQuotes\n const fromDecimals = from.decimals;\n const toDecimals = to.decimals;\n const fromAmountFormatted = formatUnits(\n swapAmounts.fromAmount,\n fromDecimals,\n );\n const toAmountFormatted = formatUnits(\n swapAmounts.toAmount,\n toDecimals,\n );\n\n // Format numbers for display (remove unnecessary trailing zeros)\n const formatAmount = (value: string) => {\n const num = Number(value);\n if (num >= 1000) {\n return num.toLocaleString(undefined, {\n maximumFractionDigits: 2,\n });\n }\n return num.toLocaleString(undefined, {\n maximumFractionDigits: 6,\n minimumFractionDigits: 0,\n });\n };\n\n swapDescription = t(\n 'You successfully swapped {fromAmount} {fromSymbol} for {toAmount} {toSymbol}',\n {\n fromAmount: formatAmount(fromAmountFormatted),\n fromSymbol: fromToken.symbol,\n toAmount: formatAmount(toAmountFormatted),\n toSymbol: toToken.symbol,\n defaultValue: `You successfully swapped ${formatAmount(\n fromAmountFormatted,\n )} ${fromToken.symbol} for ${formatAmount(\n toAmountFormatted,\n )} ${toToken.symbol}`,\n },\n );\n } catch (error) {\n console.warn('Failed to format swap amounts:', error);\n }\n }\n }\n\n // Fallback to basic description if extraction failed\n if (!swapDescription && fromToken && toToken) {\n swapDescription = t(\n 'You successfully swapped {fromToken} for {toToken}',\n {\n fromToken: fromToken.symbol,\n toToken: toToken.symbol,\n defaultValue: `You successfully swapped ${fromToken.symbol} for ${toToken.symbol}`,\n },\n );\n }\n\n setCurrentContent({\n type: 'successful-operation',\n props: {\n setCurrentContent,\n txId,\n title: swapTitle,\n description: swapDescription,\n onDone: () => {\n if (isolatedView) {\n closeAccountModal();\n } else {\n setCurrentContent('main');\n }\n },\n showSocialButtons: true,\n },\n });\n }, [\n fromToken,\n toToken,\n amount,\n quote,\n txReceipt,\n account?.address,\n setCurrentContent,\n t,\n isolatedView,\n closeAccountModal,\n ]);\n\n const handleSwapError = useCallback(\n (error: Error | string) => {\n const errorMessage =\n typeof error === 'string' ? error : error.message;\n console.error('Swap failed:', errorMessage);\n },\n [fromToken, toToken, amount],\n );\n\n // Track if we've already shown success/error to prevent duplicate dialogs\n const [hasShownResult, setHasShownResult] = React.useState(false);\n\n // Handle transaction status changes to show success dialogs\n // Errors are shown inline via TransactionButtonAndStatus component\n React.useEffect(() => {\n // Reset the flag when transaction status changes to ready (new transaction)\n if (status === 'ready') {\n setHasShownResult(false);\n return;\n }\n\n // Only show dialog once per transaction\n if (hasShownResult) {\n return;\n }\n\n // Only show success modal, errors are handled inline\n if (status === 'success' && txReceipt && !txReceipt.reverted) {\n setHasShownResult(true);\n handleSwapSuccess();\n } else if (status === 'error' && txError) {\n // Track error for analytics but don't show modal\n const errorMessage =\n (txError as any)?.reason ||\n (txError as any)?.message ||\n String(txError);\n handleSwapError(errorMessage);\n } else if (txReceipt?.reverted) {\n // Track reverted transaction for analytics but don't show modal\n handleSwapError('Transaction reverted');\n }\n }, [\n status,\n txReceipt,\n txError,\n handleSwapSuccess,\n handleSwapError,\n hasShownResult,\n ]);\n\n // Token selection handlers\n const handleSelectFromToken = useCallback(\n (token: TokenWithValue) => {\n setFromToken(token);\n\n // Default to B3TR if VET is selected as from token\n if (token.symbol === 'VET' && !toToken) {\n // Try finding B3TR by symbol first\n let b3trToken = sortedTokens.find((t) => t.symbol === 'B3TR');\n\n // If not found by symbol, try finding by address from config\n if (!b3trToken) {\n try {\n const config = getConfig(network.type);\n const b3trAddress = config.b3trContractAddress;\n if (b3trAddress) {\n b3trToken = sortedTokens.find((t) =>\n compareAddresses(t.address, b3trAddress),\n );\n }\n } catch (error) {\n console.warn(\n 'Failed to get B3TR address from config:',\n error,\n );\n }\n }\n\n if (b3trToken) {\n setToToken(b3trToken);\n }\n }\n\n setStep('main');\n },\n [toToken, sortedTokens, network.type],\n );\n\n const handleSelectToToken = useCallback((token: TokenWithValue) => {\n setToToken(token);\n setStep('main');\n }, []);\n\n // Amount input handlers\n const handleAmountChange = useCallback((value: string) => {\n // Allow only numbers and decimal point\n const regex = /^\\d*\\.?\\d*$/;\n if (regex.test(value) || value === '') {\n setAmount(value);\n }\n }, []);\n\n const handleSetMaxAmount = useCallback(() => {\n if (fromToken) {\n setAmount(fromToken.balance);\n }\n }, [fromToken]);\n\n // Get token display info\n const getTokenDisplay = (token: TokenWithValue | null) => {\n if (!token) return null;\n const logoComponent = TOKEN_LOGO_COMPONENTS[token.symbol];\n const logoUrl = TOKEN_LOGOS[token.symbol];\n return {\n symbol: token.symbol,\n logoComponent,\n logoUrl,\n balance: token.balance,\n value: token.valueInCurrency,\n };\n };\n\n const fromTokenDisplay = getTokenDisplay(fromToken);\n const toTokenDisplay = getTokenDisplay(toToken);\n\n // Render token selection screen\n if (step === 'select-from-token') {\n return (\n <SelectTokenContent\n setCurrentContent={setCurrentContent}\n onSelectToken={handleSelectFromToken}\n onBack={() => setStep('main')}\n showAllTokens={false}\n />\n );\n }\n\n if (step === 'select-quote') {\n return (\n <SelectQuoteContent\n quotes={allQuotes}\n selectedQuote={quote}\n toTokenAddress={toToken?.address ?? null}\n onSelectQuote={(selected) => {\n setSelectedQuote(selected);\n setStep('main');\n }}\n onBack={() => setStep('main')}\n />\n );\n }\n\n if (step === 'select-to-token') {\n return (\n <SelectTokenContent\n setCurrentContent={setCurrentContent}\n onSelectToken={handleSelectToToken}\n onBack={() => setStep('main')}\n showAllTokens={true}\n />\n );\n }\n\n // Render main swap interface\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{t('Swap')}</ModalHeader>\n {!isolatedView && (\n <ModalBackButton\n onClick={() => setCurrentContent('main')}\n isDisabled={\n isTransactionPending ||\n isWaitingForWalletConfirmation\n }\n />\n )}\n <ModalCloseButton\n isDisabled={\n isTransactionPending || isWaitingForWalletConfirmation\n }\n />\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack spacing={2} align=\"stretch\" w=\"full\">\n {/* From Section */}\n <HStack justify=\"space-between\">\n <Text\n fontSize=\"md\"\n fontWeight=\"bold\"\n color={textPrimary}\n >\n {t('From')}\n </Text>\n\n {fromTokenDisplay && (\n <Text\n cursor=\"pointer\"\n _hover={{\n color: textSecondary,\n textDecoration: 'underline',\n }}\n onClick={handleSetMaxAmount}\n noOfLines={1}\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n fontSize=\"sm\"\n fontWeight=\"medium\"\n color={textSecondary}\n >\n {t('Balance')}:{' '}\n {Number(\n fromTokenDisplay.balance ?? 0,\n ).toLocaleString(undefined, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}\n </Text>\n )}\n </HStack>\n <Box p={4} borderRadius=\"2xl\" bg={cardBg}>\n <VStack align=\"stretch\" spacing={2}>\n <HStack justify=\"space-between\">\n <Input\n placeholder=\"0\"\n value={amount}\n onChange={(e) =>\n handleAmountChange(e.target.value)\n }\n fontSize=\"4xl\"\n fontWeight=\"bold\"\n variant=\"unstyled\"\n data-testid=\"swap-amount-input\"\n type=\"number\"\n inputMode=\"decimal\"\n color={\n fromTokenDisplay &&\n amount &&\n Number(amount) >\n Number(fromTokenDisplay.balance)\n ? 'red.500'\n : textPrimary\n }\n />\n {fromTokenDisplay ? (\n <Button\n onClick={() =>\n setStep('select-from-token')\n }\n variant=\"outline\"\n size=\"sm\"\n borderRadius=\"full\"\n px={6}\n color={textSecondary}\n borderColor={textSecondary}\n _hover={{\n bg: isDark\n ? 'whiteAlpha.300'\n : 'blackAlpha.300',\n }}\n leftIcon={\n fromTokenDisplay.logoComponent ? (\n React.cloneElement(\n fromTokenDisplay.logoComponent,\n {\n boxSize: '20px',\n borderRadius: 'full',\n },\n )\n ) : fromTokenDisplay.logoUrl ? (\n <Image\n src={\n fromTokenDisplay.logoUrl\n }\n alt={`${fromTokenDisplay.symbol} logo`}\n boxSize=\"20px\"\n borderRadius=\"full\"\n fallback={\n <Box\n boxSize=\"20px\"\n borderRadius=\"full\"\n bg=\"whiteAlpha.200\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Text\n fontSize=\"8px\"\n fontWeight=\"bold\"\n color={\n textPrimary\n }\n >\n {fromTokenDisplay.symbol.slice(\n 0,\n 3,\n )}\n </Text>\n </Box>\n }\n />\n ) : undefined\n }\n >\n {fromTokenDisplay.symbol}\n <Icon\n as={LuChevronDown}\n boxSize={5}\n color={textSecondary}\n />\n </Button>\n ) : (\n <Button\n onClick={() =>\n setStep('select-from-token')\n }\n variant=\"outline\"\n size=\"sm\"\n borderRadius=\"full\"\n px={6}\n color={textSecondary}\n borderColor={textSecondary}\n _hover={{\n bg: isDark\n ? 'whiteAlpha.300'\n : 'blackAlpha.300',\n color: textTertiary,\n }}\n >\n {t('Select token')}\n <Icon\n as={LuChevronDown}\n boxSize={5}\n color={textSecondary}\n />\n </Button>\n )}\n </HStack>\n\n <HStack\n spacing={1}\n fontSize=\"sm\"\n justifyContent={'space-between'}\n color={textSecondary}\n >\n <HStack spacing={2} alignItems=\"center\">\n <Text color={textSecondary}>\n ≈{' '}\n {formatCompactCurrency(\n fromAmountFiatValue ?? 0,\n {\n currency: currentCurrency,\n },\n )}\n </Text>\n </HStack>\n </HStack>\n </VStack>\n </Box>\n\n {/* To Section */}\n <HStack justify=\"space-between\" mt={4}>\n <Text\n fontSize=\"md\"\n fontWeight=\"bold\"\n color={textPrimary}\n >\n {t('To')}\n </Text>\n </HStack>\n <Box borderRadius=\"2xl\" bg={cardBg} p={4}>\n <VStack align=\"stretch\" spacing={2} width=\"100%\">\n <HStack justify=\"space-between\" alignItems=\"center\">\n <Input\n value={Number(outputAmount).toLocaleString(\n undefined,\n {\n maximumFractionDigits:\n Number(outputAmount) > 10000\n ? 0\n : 2,\n },\n )}\n readOnly\n variant=\"unstyled\"\n fontSize=\"4xl\"\n fontWeight=\"bold\"\n data-testid=\"swap-output-amount\"\n color={textPrimary}\n />\n {toTokenDisplay ? (\n <Button\n onClick={() =>\n setStep('select-to-token')\n }\n variant=\"outline\"\n size=\"sm\"\n borderRadius=\"full\"\n px={6}\n color={textSecondary}\n borderColor={textSecondary}\n _hover={{\n bg: isDark\n ? 'whiteAlpha.300'\n : 'blackAlpha.300',\n }}\n leftIcon={\n toTokenDisplay.logoComponent ? (\n React.cloneElement(\n toTokenDisplay.logoComponent,\n {\n boxSize: '20px',\n borderRadius: 'full',\n },\n )\n ) : toTokenDisplay.logoUrl ? (\n <Image\n src={toTokenDisplay.logoUrl}\n alt={`${toTokenDisplay.symbol} logo`}\n boxSize=\"20px\"\n borderRadius=\"full\"\n fallback={\n <Box\n boxSize=\"20px\"\n borderRadius=\"full\"\n bg=\"whiteAlpha.200\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Text\n fontSize=\"8px\"\n fontWeight=\"bold\"\n color={\n textPrimary\n }\n >\n {toTokenDisplay.symbol.slice(\n 0,\n 3,\n )}\n </Text>\n </Box>\n }\n />\n ) : undefined\n }\n >\n {toTokenDisplay.symbol}\n <Icon\n as={LuChevronDown}\n boxSize={5}\n color={textSecondary}\n />\n </Button>\n ) : (\n <Button\n onClick={() =>\n setStep('select-to-token')\n }\n variant=\"outline\"\n size=\"sm\"\n borderRadius=\"full\"\n px={6}\n color={textSecondary}\n borderColor={textSecondary}\n _hover={{\n bg: isDark\n ? 'whiteAlpha.300'\n : 'blackAlpha.300',\n color: textTertiary,\n }}\n >\n {t('Select token')}\n <Icon\n as={LuChevronDown}\n boxSize={5}\n color={textSecondary}\n />\n </Button>\n )}\n </HStack>\n\n <HStack\n spacing={1}\n fontSize=\"sm\"\n justifyContent={'space-between'}\n color={textSecondary}\n >\n <HStack spacing={2} alignItems=\"center\">\n <Text color={textSecondary}>\n ≈{' '}\n {formatCompactCurrency(\n toAmountFiatValue ?? 0,\n {\n currency: currentCurrency,\n },\n )}\n </Text>\n </HStack>\n\n {toTokenDisplay && (\n <Text\n noOfLines={1}\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n fontSize=\"sm\"\n fontWeight=\"medium\"\n color={textSecondary}\n >\n {t('Balance')}:{' '}\n {Number(\n toTokenDisplay.balance ?? 0,\n ).toLocaleString(undefined, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}\n </Text>\n )}\n </HStack>\n </VStack>\n </Box>\n\n {/* Show More Section */}\n <Collapse in={showMore && !!quote} animateOpacity>\n <VStack\n spacing={1}\n align=\"stretch\"\n p={4}\n borderRadius=\"2xl\"\n bg={cardBg}\n >\n {/* Source */}\n {quote && (\n <HStack justify=\"space-between\">\n <Text fontSize=\"xs\" color={textSecondary}>\n {t('Source')}:\n </Text>\n <Button\n variant=\"outline\"\n size=\"xs\"\n borderRadius=\"full\"\n px={3}\n h=\"auto\"\n py={1}\n cursor=\"pointer\"\n onClick={() => setStep('select-quote')}\n color={textSecondary}\n borderColor={textSecondary}\n _hover={{\n bg: isDark\n ? 'whiteAlpha.300'\n : 'blackAlpha.300',\n }}\n leftIcon={quote.aggregator?.getIcon(\n '12px',\n )}\n >\n <Text fontSize=\"xs\" color={textPrimary}>\n {quote.aggregatorName}\n </Text>\n </Button>\n </HStack>\n )}\n\n {/* Slippage */}\n <VStack align=\"stretch\" spacing={2}>\n <HStack justify=\"space-between\">\n <Text fontSize=\"xs\" color={textSecondary}>\n {t('Slippage tolerance')}:\n </Text>\n <Text\n fontSize=\"xs\"\n fontWeight=\"medium\"\n color={textPrimary}\n >\n {slippageTolerance}%\n </Text>\n </HStack>\n\n {/* Slippage Configuration */}\n <VStack spacing={3} align=\"stretch\" pt={2}>\n <HStack spacing={2}>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n setSlippageTolerance(1);\n }}\n flex=\"0 0 auto\"\n minW=\"60px\"\n borderRadius=\"md\"\n fontSize=\"xs\"\n bg={\n isAutoMode\n ? primaryButtonBg\n : 'transparent'\n }\n color={\n isAutoMode\n ? primaryButtonColor\n : textSecondary\n }\n borderColor={\n isAutoMode\n ? primaryButtonBg\n : textSecondary\n }\n _hover={{\n bg: isAutoMode\n ? primaryButtonBg\n : isDark\n ? 'whiteAlpha.300'\n : 'blackAlpha.300',\n opacity: isAutoMode ? 0.8 : 1,\n }}\n >\n Auto\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n setSlippageTolerance(0.5);\n }}\n flex=\"0 0 auto\"\n minW=\"60px\"\n borderRadius=\"md\"\n fontSize=\"xs\"\n bg={\n slippageTolerance === 0.5\n ? primaryButtonBg\n : 'transparent'\n }\n color={\n slippageTolerance === 0.5\n ? primaryButtonColor\n : textSecondary\n }\n borderColor={\n slippageTolerance === 0.5\n ? primaryButtonBg\n : textSecondary\n }\n _hover={{\n bg:\n slippageTolerance === 0.5\n ? primaryButtonBg\n : isDark\n ? 'whiteAlpha.300'\n : 'blackAlpha.300',\n opacity:\n slippageTolerance === 0.5\n ? 0.8\n : 1,\n }}\n >\n 0.5%\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n setSlippageTolerance(3);\n }}\n flex=\"0 0 auto\"\n minW=\"60px\"\n borderRadius=\"md\"\n fontSize=\"xs\"\n bg={\n slippageTolerance === 3\n ? primaryButtonBg\n : 'transparent'\n }\n color={\n slippageTolerance === 3\n ? primaryButtonColor\n : textSecondary\n }\n borderColor={\n slippageTolerance === 3\n ? primaryButtonBg\n : textSecondary\n }\n _hover={{\n bg:\n slippageTolerance === 3\n ? primaryButtonBg\n : isDark\n ? 'whiteAlpha.300'\n : 'blackAlpha.300',\n opacity:\n slippageTolerance === 3\n ? 0.8\n : 1,\n }}\n >\n 3%\n </Button>\n <InputGroup size=\"sm\" flex={1}>\n <Input\n value={customSlippageValue}\n onChange={(e) => {\n const value =\n e.target.value;\n // Allow numbers and decimal point\n if (\n /^\\d*\\.?\\d*$/.test(\n value,\n ) ||\n value === ''\n ) {\n setCustomSlippageValue(\n value,\n );\n if (value !== '') {\n const numValue =\n parseFloat(\n value,\n );\n if (\n !isNaN(\n numValue,\n ) &&\n numValue >= 0 &&\n numValue <= 100\n ) {\n setSlippageTolerance(\n numValue,\n );\n }\n } else {\n // Reset to default when cleared\n setSlippageTolerance(\n 1,\n );\n }\n }\n }}\n placeholder=\"1\"\n borderRadius=\"md\"\n textAlign=\"right\"\n pr={8}\n fontSize=\"xs\"\n color={textPrimary}\n />\n <InputRightElement\n width=\"2rem\"\n pointerEvents=\"none\"\n >\n <Text\n fontSize=\"2xs\"\n color={textSecondary}\n >\n %\n </Text>\n </InputRightElement>\n </InputGroup>\n </HStack>\n </VStack>\n </VStack>\n\n {/* Gas Fee */}\n <HStack justify=\"space-between\">\n <Text fontSize=\"xs\" color={textSecondary}>\n {t('Fee')}:\n </Text>\n <Text\n fontSize=\"xs\"\n fontWeight=\"medium\"\n color={textPrimary}\n >\n {gasCostVTHO > 0\n ? `${gasCostVTHO.toLocaleString(\n undefined,\n {\n maximumFractionDigits: 2,\n },\n )} VTHO`\n : '-'}\n </Text>\n </HStack>\n </VStack>\n </Collapse>\n\n {/* Show More Toggle - Always reserve space */}\n {quote && (\n <Box\n minH=\"24px\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Button\n variant=\"ghost\"\n size=\"xs\"\n onClick={() => setShowMore(!showMore)}\n rightIcon={\n <Icon\n color={textTertiary}\n _hover={{\n color: textSecondary,\n }}\n as={showMore ? LuArrowUp : LuArrowDown}\n />\n }\n fontSize=\"xs\"\n fontWeight=\"light\"\n color={textTertiary}\n _hover={{\n color: textSecondary,\n }}\n >\n {showMore\n ? t('Hide')\n : t('Show Advanced Options')}\n </Button>\n </Box>\n )}\n\n {swapClauses.length > 0 &&\n connection.isConnectedWithPrivy && (\n <GasFeeSummary\n estimation={gasEstimation}\n isLoading={gasEstimationLoading}\n isLoadingTransaction={isTransactionPending}\n onTokenChange={handleGasTokenChange}\n clauses={swapClauses}\n userSelectedToken={userSelectedGasToken}\n />\n )}\n </VStack>\n </ModalBody>\n\n <ModalFooter>\n <TransactionButtonAndStatus\n buttonText={\n isLoadingQuote ? t('Loading quote...') : t('Swap')\n }\n onConfirm={executeSwap}\n isSubmitting={isTransactionPending}\n isTxWaitingConfirmation={isWaitingForWalletConfirmation}\n transactionPendingText={t('Swapping...')}\n txReceipt={txReceipt}\n transactionError={txError}\n onError={(errorMessage) => {\n // Track error for analytics when displayed inline\n handleSwapError(errorMessage);\n }}\n isDisabled={\n !fromToken ||\n !toToken ||\n !amount ||\n Number(amount) <= 0 ||\n isLoadingQuote ||\n !quote ||\n quote?.reverted === true ||\n Boolean(\n fromTokenDisplay &&\n amount &&\n Number(amount) >\n Number(fromTokenDisplay.balance),\n ) ||\n disableConfirmButtonDuringEstimation\n }\n gasEstimationError={gasEstimationError}\n hasEnoughGasBalance={hasEnoughBalance}\n isLoadingGasEstimation={gasEstimationLoading}\n showGasEstimationError={\n !feeDelegation?.delegatorUrl &&\n connection.isConnectedWithPrivy\n }\n context=\"transaction\"\n />\n </ModalFooter>\n </>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Text,\n Button,\n Icon,\n ModalFooter,\n useToken,\n} from '@chakra-ui/react';\nimport { ModalBackButton, StickyHeaderContainer } from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { LuSquareUser } from 'react-icons/lu';\nimport { useTranslation } from 'react-i18next';\nimport { useAccountModalOptions } from '../../../../hooks/modals/useAccountModalOptions';\n\nexport type ChooseNameContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n onBack?: () => void;\n initialContentSource?: AccountModalContentTypes;\n};\n\nexport const ChooseNameContent = ({\n setCurrentContent,\n onBack = () => setCurrentContent('settings'),\n initialContentSource = 'settings',\n}: ChooseNameContentProps) => {\n const { t } = useTranslation();\n\n const { isolatedView } = useAccountModalOptions();\n\n const textColor = useToken('colors', 'vechain-kit-text-primary');\n const secondaryTextColor = useToken('colors', 'vechain-kit-text-secondary');\n\n const handleBack = () => {\n onBack();\n };\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader data-testid=\"modal-title\">\n {t('Choose your account name')}\n </ModalHeader>\n {!isolatedView && <ModalBackButton onClick={handleBack} />}\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack spacing={6} align=\"center\" py={8}>\n <Icon\n as={LuSquareUser}\n boxSize={16}\n color={secondaryTextColor}\n />\n <VStack spacing={2}>\n <Text\n fontSize=\"lg\"\n fontWeight=\"500\"\n textAlign=\"center\"\n color={textColor}\n >\n {t('Finally say goodbye to 0x addresses')}\n </Text>\n <Text\n fontSize=\"md\"\n color={secondaryTextColor}\n textAlign=\"center\"\n px={4}\n >\n {t(\n 'Name your account to make it easier to exchange assets',\n )}\n </Text>\n </VStack>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button\n variant=\"vechainKitPrimary\"\n onClick={() =>\n setCurrentContent({\n type: 'choose-name-search',\n props: {\n name: '',\n setCurrentContent: setCurrentContent,\n initialContentSource,\n },\n })\n }\n data-testid=\"choose-name-button\"\n >\n {t('Choose name')}\n </Button>\n </ModalFooter>\n </>\n );\n};\n","import {\n Accordion,\n AccordionItem,\n AccordionButton,\n AccordionPanel,\n Box,\n Text,\n Icon,\n List,\n ListItem,\n Tag,\n HStack,\n VStack,\n useToken,\n} from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport { LuChevronDown, LuChevronUp, LuTrash2 } from 'react-icons/lu';\nimport { useWallet } from '../../../../../hooks';\nimport { useWalletMetadata } from '../../../../../hooks/api/wallet/useWalletMetadata';\nimport { AccountAvatar } from '../../../../common';\nimport { getPicassoImage, humanDomain } from '../../../../../utils';\n\ntype ExistingDomainsListProps = {\n domains: { name: string }[];\n onDomainSelect: (domain: string) => void;\n onUnsetDomain: () => void;\n isLoading?: boolean;\n};\n\nconst DomainListItem = ({\n domain,\n isCurrentDomain,\n onSelect,\n}: {\n domain: { name: string };\n isCurrentDomain: boolean;\n onSelect: (name: string) => void;\n}) => {\n const { connection } = useWallet();\n const { t } = useTranslation();\n const metadata = useWalletMetadata(domain.name, connection.network);\n\n const cardBg = useToken('colors', 'vechain-kit-card');\n const cardBgHover = useToken('colors', 'vechain-kit-card-hover');\n const borderColor = useToken('colors', 'vechain-kit-border');\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const buttonBg = useToken('colors', 'vechain-kit-card');\n\n return (\n <ListItem\n key={domain.name}\n p={4}\n bg={cardBg}\n borderRadius=\"xl\"\n cursor={isCurrentDomain ? 'default' : 'pointer'}\n opacity={isCurrentDomain ? 0.7 : 1}\n border={`1px solid ${borderColor}`}\n _hover={{\n bg: isCurrentDomain ? cardBgHover : cardBg,\n borderColor: borderColor,\n }}\n onClick={() => !isCurrentDomain && onSelect(domain.name)}\n transition=\"all 0.2s\"\n >\n <HStack spacing={3} align=\"center\">\n <AccountAvatar\n props={{\n width: '40px',\n height: '40px',\n src: metadata.image ?? getPicassoImage(domain.name),\n alt: domain.name,\n }}\n />\n\n <VStack align=\"start\" spacing={0} flex={1}>\n <Text color={textPrimary} fontSize=\"md\" fontWeight=\"500\">\n {humanDomain(domain.name, 24, 0)}\n </Text>\n {isCurrentDomain && (\n <Text fontSize=\"sm\" color={textSecondary}>\n {t('Current domain')}\n </Text>\n )}\n </VStack>\n\n {isCurrentDomain && (\n <Tag\n size=\"sm\"\n bg={buttonBg}\n color={textPrimary}\n px={3}\n py={1}\n borderRadius=\"full\"\n >\n {t('Current')}\n </Tag>\n )}\n </HStack>\n </ListItem>\n );\n};\n\nconst UnsetDomainListItem = ({ onUnset }: { onUnset: () => void }) => {\n const cardBg = useToken('colors', 'vechain-kit-card');\n const cardBgHover = useToken('colors', 'vechain-kit-card-hover');\n const borderColor = useToken('colors', 'vechain-kit-border');\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const errorColor = useToken('colors', 'vechain-kit-error');\n\n const { t } = useTranslation();\n\n return (\n <ListItem\n key={'unset-domain-list-item'}\n p={4}\n bg={cardBg}\n borderRadius=\"xl\"\n cursor={'pointer'}\n opacity={1}\n border={`1px solid ${borderColor}`}\n _hover={{\n bg: cardBgHover,\n borderColor: borderColor,\n color: 'red.400',\n }}\n onClick={onUnset}\n transition=\"all 0.2s\"\n role=\"button\"\n aria-label={t('Unset current domain')}\n >\n <HStack spacing={3} align=\"center\">\n <Box\n width=\"40px\"\n height=\"40px\"\n borderRadius=\"full\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n bg={cardBg}\n >\n <Icon as={LuTrash2} fontSize=\"18px\" color={errorColor} />\n </Box>\n <VStack align=\"start\" spacing={0} flex={1}>\n <Text color={textPrimary} fontSize=\"md\" fontWeight=\"500\">\n {t('Unset current domain')}\n </Text>\n <Text fontSize=\"sm\" color={textSecondary}>\n {t('Remove your current domain name')}\n </Text>\n </VStack>\n </HStack>\n </ListItem>\n );\n};\n\nexport const ExistingDomainsList = ({\n domains,\n onDomainSelect,\n onUnsetDomain,\n isLoading,\n}: ExistingDomainsListProps) => {\n const { t } = useTranslation();\n const { account } = useWallet();\n\n const cardBg = useToken('colors', 'vechain-kit-card');\n const cardBgHover = useToken('colors', 'vechain-kit-card-hover');\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n\n // avoid flickering after loading by returning null, so if no domains are found, it will not show the accordion\n if (domains.length === 0 || isLoading) {\n return null;\n }\n\n return (\n <Accordion allowToggle>\n <AccordionItem border=\"none\">\n {({ isExpanded }) => (\n <>\n <AccordionButton\n bg={cardBg}\n borderRadius=\"xl\"\n _hover={{\n bg: cardBgHover,\n }}\n opacity={isLoading ? 0.7 : 1}\n transition=\"all 0.2s\"\n disabled={isLoading}\n >\n <Box flex=\"1\" textAlign=\"left\" py={2}>\n <Text fontWeight=\"500\" color={textPrimary}>\n {isLoading\n ? t('Loading your domains...')\n : `${t('Your existing domains')} (${\n domains.length\n })`}\n </Text>\n </Box>\n <Icon\n as={isExpanded ? LuChevronUp : LuChevronDown}\n fontSize=\"20px\"\n color={textSecondary}\n />\n </AccordionButton>\n <AccordionPanel pb={4} pt={2}>\n <List spacing={2}>\n {domains.map((domain) => (\n <DomainListItem\n key={domain.name}\n domain={domain}\n isCurrentDomain={\n domain.name === account?.domain\n }\n onSelect={onDomainSelect}\n />\n ))}\n {account?.domain && (\n <UnsetDomainListItem\n onUnset={onUnsetDomain}\n />\n )}\n </List>\n </AccordionPanel>\n </>\n )}\n </AccordionItem>\n </Accordion>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Text,\n Input,\n InputGroup,\n Box,\n Button,\n ModalFooter,\n InputRightElement,\n useToken,\n} from '@chakra-ui/react';\nimport { ModalBackButton, StickyHeaderContainer } from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { useState, useEffect } from 'react';\nimport {\n useEnsRecordExists,\n useWallet,\n useVechainDomain,\n useIsDomainProtected,\n useGetDomainsOfAddress,\n} from '../../../../hooks';\nimport { useTranslation } from 'react-i18next';\n// Import from VeChainKitContext to avoid circular dependency with providers barrel\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\nimport { ExistingDomainsList } from './Components/ExistingDomainsList';\nimport { ens_normalize } from '@adraffy/ens-normalize';\nimport { useAccountModalOptions } from '../../../../hooks/modals/useAccountModalOptions';\n\nexport type ChooseNameSearchContentProps = {\n name: string;\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n initialContentSource?: AccountModalContentTypes;\n};\n\nexport const ChooseNameSearchContent = ({\n name: initialName,\n setCurrentContent,\n initialContentSource = 'settings',\n}: ChooseNameSearchContentProps) => {\n const { t } = useTranslation();\n const { account } = useWallet();\n const { darkMode: isDark } = useVeChainKitConfig();\n const { isolatedView } = useAccountModalOptions();\n const [name, setName] = useState(ens_normalize(initialName));\n const [error, setError] = useState<string | null>(null);\n const [isOwnDomain, setIsOwnDomain] = useState(false);\n const [isAvailable, setIsAvailable] = useState(false);\n const [hasInteracted, setHasInteracted] = useState(false);\n\n const errorColor = useToken('colors', 'vechain-kit-error');\n const successColor = useToken('colors', 'vechain-kit-success');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n\n const { data: ensRecordExists, isLoading: isEnsCheckLoading } =\n useEnsRecordExists(name);\n const { data: domainInfo, isLoading: isDomainInfoLoading } =\n useVechainDomain(`${name}.veworld.vet`);\n const { data: isProtected, isLoading: isProtectedLoading } =\n useIsDomainProtected(name);\n\n const {\n data: vetDomainsOfAddress,\n isLoading: isVetDomainsOfAddressLoading,\n } = useGetDomainsOfAddress(account?.address, '');\n\n const isFetchingDomainInfo =\n isEnsCheckLoading || isDomainInfoLoading || isProtectedLoading;\n\n useEffect(() => {\n if (!hasInteracted) return;\n\n // Add validation for special characters, spaces, and periods\n const hasSpecialChars = /[^a-zA-Z0-9-]|\\s/.test(name);\n\n if (name.length < 3) {\n setError(t('Name must be at least 3 characters long'));\n setIsAvailable(false);\n setIsOwnDomain(false);\n } else if (hasSpecialChars) {\n setError(t('Only letters, numbers, and hyphens are allowed'));\n setIsAvailable(false);\n setIsOwnDomain(false);\n } else if (isProtected) {\n setError(t('This domain is protected'));\n setIsAvailable(false);\n setIsOwnDomain(false);\n } else if (ensRecordExists) {\n // Check if the domain belongs to the current user\n const isOwnDomain =\n domainInfo?.address?.toLowerCase() ===\n account?.address?.toLowerCase();\n\n if (isOwnDomain) {\n setError(null);\n setIsAvailable(true);\n setIsOwnDomain(true);\n } else {\n setError(t('This domain is already taken'));\n setIsAvailable(false);\n setIsOwnDomain(false);\n }\n } else if (!isEnsCheckLoading) {\n setError(null);\n setIsAvailable(true);\n setIsOwnDomain(false);\n }\n }, [\n name,\n hasInteracted,\n ensRecordExists,\n isEnsCheckLoading,\n domainInfo,\n account?.address,\n isProtected,\n isAvailable,\n isFetchingDomainInfo,\n ]);\n\n const handleContinue = () => {\n if (isAvailable && !error) {\n setCurrentContent({\n type: 'choose-name-summary',\n props: {\n fullDomain: name + '.veworld.vet',\n isOwnDomain,\n setCurrentContent,\n initialContentSource,\n },\n });\n }\n };\n\n const handleDomainSelect = (selectedDomain: string) => {\n // Extract the domain type and base name\n const parts = selectedDomain.split('.');\n const domainType = parts.length > 2 ? `${parts[1]}.${parts[2]}` : 'vet';\n\n setCurrentContent({\n type: 'choose-name-summary',\n props: {\n fullDomain: selectedDomain,\n domainType: domainType,\n isOwnDomain: true,\n setCurrentContent,\n initialContentSource,\n },\n });\n };\n\n const handleUnsetDomain = () => {\n setCurrentContent({\n type: 'choose-name-summary',\n props: {\n fullDomain: '',\n domainType: '',\n isOwnDomain: false,\n isUnsetting: true,\n setCurrentContent,\n initialContentSource,\n },\n });\n };\n\n const handleBack = () => {\n setCurrentContent(initialContentSource);\n };\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader data-testid=\"modal-title\">\n {t('Choose Name')}\n </ModalHeader>\n {!isolatedView && <ModalBackButton onClick={handleBack} />}\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack spacing={4} align=\"stretch\">\n <ExistingDomainsList\n domains={vetDomainsOfAddress?.domains || []}\n onDomainSelect={handleDomainSelect}\n onUnsetDomain={handleUnsetDomain}\n isLoading={isVetDomainsOfAddressLoading}\n />\n\n <InputGroup size=\"lg\">\n <Input\n placeholder={t('Enter your name')}\n value={name}\n onChange={(e) => {\n setName(ens_normalize(e.target.value));\n if (!hasInteracted) setHasInteracted(true);\n }}\n paddingRight=\"120px\"\n fontSize=\"lg\"\n height=\"60px\"\n bg={isDark ? '#00000038' : 'white'}\n border={`1px solid ${\n isDark ? '#ffffff29' : '#ebebeb'\n }`}\n _hover={{\n border: `1px solid ${\n isDark ? '#ffffff40' : '#e0e0e0'\n }`,\n }}\n _focus={{\n border: `1px solid ${\n isDark ? '#ffffff60' : '#d0d0d0'\n }`,\n boxShadow: 'none',\n }}\n isInvalid={!!error}\n data-testid=\"domain-input\"\n />\n <InputRightElement\n width=\"auto\"\n paddingRight=\"12px\"\n h={'full'}\n >\n <Box mr={4} fontSize=\"sm\" color={textSecondary}>\n .veworld.vet\n </Box>\n </InputRightElement>\n </InputGroup>\n\n {error && hasInteracted && (\n <Text\n color={errorColor}\n fontSize=\"sm\"\n data-testid=\"domain-availability-status\"\n >\n {error}\n </Text>\n )}\n\n {!error && hasInteracted && name.length >= 3 && (\n <Text\n fontSize=\"sm\"\n color={isAvailable ? successColor : errorColor}\n fontWeight=\"500\"\n data-testid=\"domain-availability-status\"\n >\n {isOwnDomain\n ? t('YOU OWN THIS')\n : isAvailable\n ? t('AVAILABLE')\n : t('UNAVAILABLE')}\n </Text>\n )}\n </VStack>\n </ModalBody>\n\n <ModalFooter>\n <Button\n variant=\"vechainKitPrimary\"\n isDisabled={\n !isAvailable ||\n !!error ||\n isProtected ||\n isFetchingDomainInfo\n }\n isLoading={isFetchingDomainInfo}\n onClick={handleContinue}\n loadingText={t('Checking...')}\n data-testid=\"continue-button\"\n >\n {t('Continue')}\n </Button>\n </ModalFooter>\n </>\n );\n};\n","import React from 'react';\nimport {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n ModalFooter,\n Text,\n useToken,\n Icon,\n} from '@chakra-ui/react';\nimport {\n ModalBackButton,\n StickyHeaderContainer,\n TransactionButtonAndStatus,\n GasFeeSummary,\n} from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { useClaimVeWorldSubdomain } from '../../../../hooks/api/vetDomains/useClaimVeWorldSubdomain';\nimport { useClaimVetDomain } from '../../../../hooks/api/vetDomains/useClaimVetDomain';\nimport { useUnsetDomain } from '../../../../hooks/api/vetDomains/useUnsetDomain';\nimport { useTranslation } from 'react-i18next';\nimport {\n useUpgradeRequired,\n useUpgradeSmartAccountModal,\n useWallet,\n useGasTokenSelection,\n useGenericDelegatorFeeEstimation,\n} from '../../../../hooks';\n// Import from VeChainKitContext to avoid circular dependency with providers barrel\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\nimport type { GasTokenType } from '../../../../types/gasToken';\nimport { useAccountModalOptions } from '../../../../hooks/modals/useAccountModalOptions';\nimport { LuSquareUser } from 'react-icons/lu';\n\nexport type ChooseNameSummaryContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n fullDomain: string;\n domainType?: string;\n isOwnDomain: boolean;\n isUnsetting?: boolean;\n initialContentSource?: AccountModalContentTypes;\n};\n\nexport const ChooseNameSummaryContent = ({\n setCurrentContent,\n fullDomain,\n domainType = 'veworld.vet',\n isOwnDomain,\n isUnsetting = false,\n initialContentSource = 'settings',\n}: ChooseNameSummaryContentProps) => {\n const { t } = useTranslation();\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const { isolatedView, closeAccountModal } = useAccountModalOptions();\n const { account, connectedWallet, connection } = useWallet();\n const { data: upgradeRequired } = useUpgradeRequired(\n account?.address ?? '',\n connectedWallet?.address ?? '',\n 3,\n );\n const { open: openUpgradeSmartAccountModal } =\n useUpgradeSmartAccountModal();\n\n const { preferences } = useGasTokenSelection();\n const { feeDelegation } = useVeChainKitConfig();\n\n const handleError = (error: string) => {\n console.error('Transaction failed:', error);\n };\n\n // Use the unset domain hook if we're unsetting\n const unsetDomainHook = useUnsetDomain({\n onSuccess: () => handleSuccess(),\n });\n\n // If not unsetting, determine if this is a .veworld.vet subdomain or a primary .vet domain\n const isVeWorldSubdomain = domainType.endsWith('veworld.vet');\n\n // Use the appropriate claim hook based on domain type (only when not unsetting)\n const veWorldSubdomainHook = useClaimVeWorldSubdomain({\n subdomain: fullDomain.split('.veworld.vet')[0],\n domain: domainType,\n alreadyOwned: isOwnDomain,\n onSuccess: () => handleSuccess(),\n });\n\n const vetDomainHook = useClaimVetDomain({\n domain: !isUnsetting && !isVeWorldSubdomain ? fullDomain : '',\n alreadyOwned: isOwnDomain,\n onSuccess: () => handleSuccess(),\n });\n\n // Use the appropriate hook based on action and domain type\n const {\n sendTransaction,\n txReceipt,\n error: txError,\n isWaitingForWalletConfirmation,\n isTransactionPending,\n clauses,\n } = isUnsetting\n ? unsetDomainHook\n : isVeWorldSubdomain\n ? veWorldSubdomainHook\n : vetDomainHook;\n\n const handleSuccess = () => {\n setCurrentContent({\n type: 'successful-operation',\n props: {\n setCurrentContent,\n txId: txReceipt?.meta.txID,\n title: isUnsetting ? t('Domain unset') : t('Domain set'),\n description: isUnsetting\n ? t('Your domain has been unset successfully.')\n : t(`Your address has been successfully set to {{name}}`, {\n name: fullDomain,\n }),\n onDone: () => {\n if (isolatedView) {\n closeAccountModal();\n } else {\n setCurrentContent(initialContentSource);\n }\n },\n },\n });\n };\n\n const handleConfirm = async () => {\n if (upgradeRequired) {\n openUpgradeSmartAccountModal();\n return;\n }\n\n try {\n await sendTransaction();\n } catch (error) {\n console.error('Transaction failed:', error);\n }\n };\n\n const handleRetry = () => {\n handleConfirm();\n };\n\n const handleBack = () => {\n setCurrentContent({\n type: 'choose-name-search',\n props: {\n setCurrentContent,\n name: fullDomain,\n initialContentSource,\n },\n });\n };\n\n const [selectedGasToken, setSelectedGasToken] =\n React.useState<GasTokenType | null>(null);\n // Track the user's manual selection to show it during loading (before estimation completes)\n const [userSelectedGasToken, setUserSelectedGasToken] =\n React.useState<GasTokenType | null>(null);\n\n const shouldEstimateGas =\n preferences.availableGasTokens.length > 0 &&\n (connection.isConnectedWithPrivy ||\n connection.isConnectedWithVeChain) &&\n !feeDelegation?.delegatorUrl;\n const {\n data: gasEstimation,\n isLoading: gasEstimationLoading,\n error: gasEstimationError,\n refetch: refetchGasEstimation,\n } = useGenericDelegatorFeeEstimation({\n clauses: clauses(),\n tokens: selectedGasToken\n ? [selectedGasToken]\n : preferences.availableGasTokens, // Use selected token or all available\n enabled: shouldEstimateGas && !!feeDelegation?.genericDelegatorUrl,\n });\n const usedGasToken = gasEstimation?.usedToken;\n const disableConfirmButtonDuringEstimation =\n (gasEstimationLoading || !gasEstimation) &&\n connection.isConnectedWithPrivy &&\n !feeDelegation?.delegatorUrl;\n\n const handleGasTokenChange = React.useCallback(\n (token: GasTokenType) => {\n setSelectedGasToken(token);\n setUserSelectedGasToken(token); // Track user's choice\n setTimeout(() => refetchGasEstimation(), 100);\n },\n [refetchGasEstimation],\n );\n\n // hasEnoughBalance is now determined by the hook itself\n const hasEnoughBalance = !!usedGasToken && !gasEstimationError;\n\n // Auto-fallback: if the selected token cannot cover fees (estimation error),\n // clear selection to re-estimate across all available tokens\n // Keep userSelectedGasToken to show during loading, but actual result will show the token that succeeds\n React.useEffect(() => {\n if (gasEstimationError && selectedGasToken) {\n setSelectedGasToken(null);\n }\n }, [gasEstimationError, selectedGasToken]);\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader data-testid=\"confirm-domain\">\n {isUnsetting\n ? t('Confirm Unset Domain')\n : t('Confirm Name')}\n </ModalHeader>\n <ModalBackButton\n onClick={handleBack}\n isDisabled={isTransactionPending}\n />\n <ModalCloseButton isDisabled={isTransactionPending} />\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack spacing={6} align=\"center\" mt={10}>\n <Icon\n as={LuSquareUser}\n color={textPrimary}\n fontSize={'60px'}\n opacity={0.5}\n />\n <Text fontSize=\"md\" textAlign=\"center\" color={textPrimary}>\n {isUnsetting\n ? t(\n 'By confirming, your current domain will be unset',\n )\n : t(\n 'By confirming, your address will be set to {{domain}}',\n {\n domain: fullDomain,\n },\n )}\n </Text>\n </VStack>\n {!isUnsetting && (\n <VStack spacing={4} align=\"stretch\" mt={6}>\n <Text\n fontSize=\"xl\"\n fontWeight=\"bold\"\n color={textPrimary}\n textAlign=\"center\"\n data-testid=\"preconfirm-domain-val\"\n >\n {fullDomain}\n </Text>\n </VStack>\n )}\n {connection.isConnectedWithPrivy && (\n <GasFeeSummary\n estimation={gasEstimation}\n isLoading={gasEstimationLoading}\n isLoadingTransaction={isTransactionPending}\n onTokenChange={handleGasTokenChange}\n clauses={clauses() as any}\n userSelectedToken={userSelectedGasToken}\n />\n )}\n </ModalBody>\n\n <ModalFooter gap={4} w=\"full\">\n <TransactionButtonAndStatus\n transactionError={txError}\n isSubmitting={isTransactionPending}\n isTxWaitingConfirmation={isWaitingForWalletConfirmation}\n onConfirm={handleConfirm}\n onRetry={handleRetry}\n transactionPendingText={\n isUnsetting\n ? t('Unsetting current domain...')\n : t('Claiming name...')\n }\n txReceipt={txReceipt}\n buttonText={t('Confirm')}\n isDisabled={\n isTransactionPending ||\n disableConfirmButtonDuringEstimation\n }\n onError={handleError}\n gasEstimationError={gasEstimationError}\n hasEnoughGasBalance={hasEnoughBalance}\n isLoadingGasEstimation={gasEstimationLoading}\n showGasEstimationError={\n !feeDelegation?.delegatorUrl &&\n connection.isConnectedWithPrivy\n }\n context=\"domain\"\n />\n </ModalFooter>\n </>\n );\n};\n","import {\n Accordion,\n AccordionItem,\n AccordionButton,\n AccordionPanel,\n Box,\n Text,\n Icon,\n VStack,\n InputGroup,\n Input,\n InputLeftElement,\n useToken,\n} from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport { LuChevronDown, LuChevronUp, LuSearch, LuSlash } from 'react-icons/lu';\nimport { useState } from 'react';\n\ninterface FAQItem {\n question: string;\n answer: string;\n}\n\nexport const FAQAccordion = () => {\n const { t } = useTranslation();\n const [searchQuery, setSearchQuery] = useState('');\n\n // Use semantic tokens for colors\n const inputBg = useToken('colors', 'vechain-kit-card');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const textTertiary = useToken('colors', 'vechain-kit-text-tertiary');\n const accordionBg = useToken('colors', 'vechain-kit-card');\n const accordionBgHover = useToken('colors', 'vechain-kit-card-elevated');\n\n const faqItems: FAQItem[] = [\n {\n question: t('What is VeChain?'),\n answer: t(\n 'VeChain, headquartered in San Marino, Europe, is a pioneering blockchain ecosystem and creator of VeChainThor, a world-class smart contract platform driving real-world blockchain adoption. Founded in 2015 by Sunny Lu, VeChain has consistently worked to deliver a transparent, efficient, scalable, and adaptable blockchain solution.',\n ),\n },\n {\n question: t('What is a wallet?'),\n answer: t(\n 'A wallet is your gateway to the VeChain blockchain. It stores your private keys and allows you to securely manage your digital assets, send and receive tokens, and interact with decentralized applications. Think of it as your digital bank account for blockchain transactions.',\n ),\n },\n {\n question: t('What is a Smart Account?'),\n answer: t(\n 'A Smart Account is a smart contract wallet that provides enhanced security and functionality. It allows for features like social recovery, transaction batching, and more.',\n ),\n },\n {\n question: t('How is my wallet secured?'),\n answer: t(\n 'Your wallet security depends on how you access it. With self-custody options like the VeWorld extension, mobile app, or hardware wallet, you have complete control over your private keys. This extension itself has no access to your private keys. When logging in with social accounts or VeChain, your wallet is created and secured by Privy and managed by VeChain, providing an easier onboarding experience while maintaining security.',\n ),\n },\n {\n question: t('How do I backup my wallet?'),\n answer: t(\n \"Backing up your wallet is crucial as you are the only one with access to your private keys. If something goes wrong, having your private key is the only way to recover your assets. How to backup depends on how you access your wallet: If using VeWorld, the backup option is available within the app. For social login users, you can find backup options in the Wallet section. If you're connected through VeChain or another ecosystem app, you'll need to visit the original website, log in, and access the Wallet section from there.\",\n ),\n },\n {\n question: t('What is a network?'),\n answer: t(\n \"A network in blockchain refers to the environment where transactions take place. VeChain has two main networks: Mainnet (the live network where real transactions occur) and Testnet (a testing environment for developers). The network you're connected to is displayed at the top of this modal.\",\n ),\n },\n {\n question: t('What is a domain name?'),\n answer: t(\n 'A domain name is a sort of nickname for your wallet address. It allows you to easily identify your wallet and interact with dApps using a human-readable name. For example, if your wallet address is 0x1234567890, your nickname could be \"alice.vechain\".',\n ),\n },\n {\n question: t('What is Privy?'),\n answer: t(\n 'Privy builds user onboarding and embedded wallet infrastructure to enable better products built on crypto rails. This means embedding asset control within applications themselves to enable users, businesses or machines to use digital assets through seamless product experiences.',\n ),\n },\n {\n question: t('What is VeBetterDAO?'),\n answer: t(\n 'VeBetterDAO is a decentralized organization on VeChain blockchain focused on sustainability. Members participate in the governance of the DAO using B3TR tokens for rewards and VOT3 for voting in proposals and weekly token allocation rounds.',\n ),\n },\n {\n question: t('What is an x2earn application?'),\n answer: t(\n 'An X2Earn application in VeBetterDAO is a sustainable app that rewards users with B3TR tokens for eco-friendly actions. These apps must distribute B3TR, link user wallets, and provide proof of sustainable actions. They join VeBetterDAO through endorsement and participate in weekly token allocation rounds.',\n ),\n },\n {\n question: t('What is B3TR?'),\n answer: t(\n 'B3TR is the incentive token of VeBetterDAO, built on VechainThor blockchain. It has a capped supply of 1 billion tokens, emitted weekly over 12 years. B3TR is used for rewards, governance, and backing VOT3 tokens 1:1. It supports sustainability applications and DAO treasury management.',\n ),\n },\n {\n question: t('What is VET?'),\n answer: t(\n 'VET is the primary cryptocurrency of the VeChain network. It represents value and ownership in the VeChain ecosystem, similar to how stocks represent ownership in a company. Holding VET automatically generates VTHO, which is needed to pay for transactions on the network.',\n ),\n },\n {\n question: t('What is VTHO?'),\n answer: t(\n \"VTHO (VeThor) is the energy or 'gas' token of the VeChain network. It's used to pay for transaction fees when interacting with the blockchain. VTHO is automatically generated by holding VET tokens, creating a two-token system that helps maintain network stability and manage transaction costs.\",\n ),\n },\n {\n question: t('How do I send tokens?'),\n answer: t(\n \"You can send tokens by clicking the send icon in the Quick Actions section. Enter the recipient's address or VeChain domain name, select the token, and specify the amount you want to send.\",\n ),\n },\n {\n question: t('What is fee delegation?'),\n answer: t(\n \"Fee delegation is a unique feature of VeChain that allows someone else (a delegator) to pay for your transaction fees. While many dApps and service providers act as delegators to make it easier for new users to get started, some transactions may still require you to pay fees using your own VTHO. Fees are necessary to prevent network spam and compensate the nodes that process and validate transactions on the blockchain. When paying fees yourself, you'll be able to select VTHO from your assets to cover the transaction cost.\",\n ),\n },\n ];\n\n // Filter FAQ items based on search query\n const filteredFaqItems = faqItems.filter(\n (item) =>\n item.question.toLowerCase().includes(searchQuery.toLowerCase()) ||\n (typeof item.answer === 'string' &&\n item.answer.toLowerCase().includes(searchQuery.toLowerCase())),\n );\n\n return (\n <VStack spacing={4} align=\"stretch\">\n <InputGroup size=\"lg\">\n <Input\n placeholder={t('Search FAQ')}\n bg={inputBg}\n borderRadius=\"xl\"\n height=\"56px\"\n pl={12}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n <InputLeftElement h=\"56px\" w=\"56px\" pl={4}>\n <LuSearch color={textTertiary} />\n </InputLeftElement>\n </InputGroup>\n\n {filteredFaqItems.length === 0 ? (\n <VStack spacing={2} py={8} color={textSecondary}>\n <Icon as={LuSlash} boxSize={12} opacity={0.5} />\n <Text fontSize=\"lg\">{t('No questions found')}</Text>\n <Text fontSize=\"md\">\n {t('Try searching with a different term')}\n </Text>\n </VStack>\n ) : (\n <Accordion allowMultiple>\n {filteredFaqItems.map((item, index) => (\n <AccordionItem key={index} border=\"none\" mb={2}>\n {({ isExpanded }) => (\n <>\n <AccordionButton\n bg={accordionBg}\n borderRadius=\"xl\"\n color={textSecondary}\n _hover={{\n bg: accordionBgHover,\n }}\n >\n <Box flex=\"1\" textAlign=\"left\" py={2}>\n <Text fontWeight=\"500\" color={textSecondary}>\n {item.question}\n </Text>\n </Box>\n <Icon\n as={\n isExpanded\n ? LuChevronUp\n : LuChevronDown\n }\n fontSize=\"20px\"\n opacity={0.5}\n />\n </AccordionButton>\n <AccordionPanel pb={4}>\n <Text fontSize=\"sm\" color={textSecondary} opacity={0.8}>\n {item.answer}\n </Text>\n </AccordionPanel>\n </>\n )}\n </AccordionItem>\n ))}\n </Accordion>\n )}\n </VStack>\n );\n};\n","import {\n Button,\n Link,\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Icon,\n Select,\n ModalFooter,\n useToken,\n} from '@chakra-ui/react';\nimport { LuExternalLink } from 'react-icons/lu';\nimport {\n ModalBackButton,\n ScrollToTopWrapper,\n StickyHeaderContainer,\n} from '../../../common';\nimport { FAQAccordion } from './FAQAccordion';\nimport { useTranslation } from 'react-i18next';\nimport { supportedLanguages, languageNames } from '../../../../../i18n';\nimport { useAccountModalOptions } from '../../../../hooks/modals/useAccountModalOptions';\nimport { VECHAIN_KIT_DOCS_BASE_URL } from '../../../../constants';\n\nexport type FAQContentProps = {\n onGoBack: () => void;\n showLanguageSelector?: boolean;\n};\n\nexport const FAQContent = ({\n onGoBack,\n showLanguageSelector = true,\n}: FAQContentProps) => {\n const { i18n, t } = useTranslation();\n const { isolatedView } = useAccountModalOptions();\n\n // Use semantic tokens for colors\n const selectBg = useToken('colors', 'vechain-kit-card');\n const selectBorder = useToken('colors', 'vechain-kit-border');\n const selectBorderHover = useToken('colors', 'vechain-kit-border-hover');\n\n const handleLanguageChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n i18n.changeLanguage(e.target.value);\n };\n\n return (\n <ScrollToTopWrapper>\n <StickyHeaderContainer>\n <ModalHeader>{t('Help')}</ModalHeader>\n {!isolatedView && <ModalBackButton onClick={onGoBack} />}\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody w={'full'}>\n <VStack spacing={6} align=\"stretch\">\n {showLanguageSelector && (\n <Select\n borderRadius={'md'}\n size=\"sm\"\n width=\"auto\"\n value={i18n.language}\n onChange={handleLanguageChange}\n bg={selectBg}\n borderColor={selectBorder}\n _hover={{\n borderColor: selectBorderHover,\n }}\n >\n {supportedLanguages.map((lang) => (\n <option key={lang} value={lang}>\n {\n languageNames[\n lang as keyof typeof languageNames\n ]\n }\n </option>\n ))}\n </Select>\n )}\n\n <Button\n as={Link}\n href={VECHAIN_KIT_DOCS_BASE_URL}\n isExternal\n variant=\"vechainKitSecondary\"\n rightIcon={<Icon as={LuExternalLink} />}\n >\n {t('For developers')}\n </Button>\n\n <FAQAccordion />\n </VStack>\n </ModalBody>\n <ModalFooter pt={0} />\n </ScrollToTopWrapper>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Text,\n Button,\n Box,\n ModalFooter,\n Icon,\n Input,\n Textarea,\n FormControl,\n FormLabel,\n useToken,\n} from '@chakra-ui/react';\nimport { ModalBackButton, StickyHeaderContainer } from '../../../../common';\nimport { useTranslation } from 'react-i18next';\n// Import from VeChainKitContext to avoid circular dependency with providers barrel\nimport { useVeChainKitConfig } from '../../../../../providers/VeChainKitContext';\nimport { useWallet } from '../../../../../hooks';\nimport { LuChevronRight, LuCamera, LuSquareUser } from 'react-icons/lu';\nimport { ActionButton } from '../../../Components';\nimport { useSingleImageUpload } from '../../../../../hooks/api/ipfs';\nimport { useRef, useState, useEffect, useMemo } from 'react';\nimport { uploadBlobToIPFS } from '../../../../../utils/ipfs';\nimport { AccountAvatar } from '../../../../common';\nimport { DomainRequiredAlert } from '../../../Components/Alerts';\nimport { AccountModalContentTypes } from '../../../Types';\nimport { useForm } from 'react-hook-form';\n\n// Update FormValues type to include validation\ntype FormValues = {\n displayName: string;\n description: string;\n};\n\nexport type AccountCustomizationContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n initialContentSource?: AccountModalContentTypes;\n};\n\nexport const CustomizationContent = ({\n setCurrentContent,\n initialContentSource = 'profile',\n}: AccountCustomizationContentProps) => {\n const { t } = useTranslation();\n const { network } = useVeChainKitConfig();\n const { account } = useWallet();\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const errorColor = useToken('colors', 'vechain-kit-error');\n const cardBg = useToken('colors', 'vechain-kit-card');\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const coverInputRef = useRef<HTMLInputElement>(null);\n const [isUploading, setIsUploading] = useState(false);\n const { onUpload } = useSingleImageUpload({\n compressImage: true,\n });\n\n const [previewImageUrl, setPreviewImageUrl] = useState<string | null>(null);\n const [avatarIpfsHash, setAvatarIpfsHash] = useState<string | null>(null);\n const hasDomain = !!account?.domain;\n\n // Add these state variables for initial values\n const [initialAvatarHash, setInitialAvatarHash] = useState<string | null>(\n null,\n );\n const [initialDisplayName, setInitialDisplayName] = useState('');\n const [initialDescription, setInitialDescription] = useState('');\n\n // Update form initialization with validation rules\n const {\n register,\n watch,\n formState: { errors, isValid },\n } = useForm<FormValues>({\n defaultValues: {\n displayName: account?.metadata?.display || '',\n description: account?.metadata?.description || '',\n },\n mode: 'onChange',\n });\n\n // Update effect to reset image when domain changes\n useEffect(() => {\n if (account?.metadata) {\n const metadata = account.metadata;\n setInitialDisplayName(metadata.display || '');\n setInitialDescription(metadata.description || '');\n setInitialAvatarHash(\n account.image ? account.image.replace('ipfs://', '') : null,\n );\n\n // Only set the preview URL if it hasn't been set yet\n setPreviewImageUrl((prev) => prev ?? account.image ?? null);\n }\n }, [account, network.type]);\n\n // Watch all form values for changes\n const formValues = watch();\n\n const handleImageUpload = async (\n event: React.ChangeEvent<HTMLInputElement>,\n ) => {\n const file = event.target.files?.[0];\n if (!file) return;\n\n try {\n setIsUploading(true);\n\n // Clear the previous preview URL first\n if (previewImageUrl) {\n URL.revokeObjectURL(previewImageUrl);\n }\n\n // Create temporary preview URL\n const newPreviewUrl = URL.createObjectURL(file);\n setPreviewImageUrl(newPreviewUrl);\n\n const uploadedImage = await onUpload(file);\n if (!uploadedImage) throw new Error('Failed to compress image');\n\n const ipfsHash = await uploadBlobToIPFS(\n uploadedImage.file,\n file.name,\n network.type,\n );\n setAvatarIpfsHash(ipfsHash);\n } catch (error) {\n console.error('Error uploading image:', error);\n setPreviewImageUrl(null);\n } finally {\n setIsUploading(false);\n }\n };\n\n // This cleanup effect is important for memory management in the browser. Here's why:\n // When you create a URL using URL.createObjectURL() (which happens in the handleImageUpload function),\n // the browser creates a unique URL that points to the file/blob in memory.\n // This URL remains valid and the object remains in memory until explicitly revoked.\n // If you don't revoke these URLs, you can create memory leaks,\n // especially if users upload multiple images or the component remounts frequently.\n useEffect(() => {\n return () => {\n if (previewImageUrl) {\n URL.revokeObjectURL(previewImageUrl);\n }\n };\n }, [previewImageUrl]);\n\n // Update getChangedValues to use form values\n const getChangedValues = () => {\n const changes: {\n avatarIpfsHash?: string;\n displayName?: string;\n description?: string;\n } = {};\n\n if (avatarIpfsHash !== initialAvatarHash && avatarIpfsHash)\n changes.avatarIpfsHash = avatarIpfsHash;\n if (formValues.displayName !== initialDisplayName)\n changes.displayName = formValues.displayName;\n if (formValues.description !== initialDescription)\n changes.description = formValues.description;\n return changes;\n };\n\n // Add this function to check if there are any changes\n const hasChanges = useMemo(() => {\n const changes = getChangedValues();\n return Object.keys(changes).length > 0;\n }, [getChangedValues]);\n\n const handleSaveChanges = () => {\n setCurrentContent({\n type: 'account-customization-summary',\n props: {\n setCurrentContent,\n changes: getChangedValues(),\n onDoneRedirectContent: initialContentSource,\n },\n });\n };\n\n const handleBack = () => {\n setCurrentContent(initialContentSource);\n };\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader data-testid=\"modal-title\">\n {t('Customization')}\n </ModalHeader>\n <ModalBackButton onClick={handleBack} />\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody>\n <Box\n cursor={hasDomain ? 'pointer' : 'default'}\n pt={2}\n display=\"flex\"\n justifyContent=\"center\"\n position=\"relative\"\n onClick={() => hasDomain && fileInputRef.current?.click()}\n >\n <AccountAvatar\n wallet={account}\n props={{\n width: '100px',\n height: '100px',\n boxShadow: '0px 0px 3px 2px #00000024',\n src: previewImageUrl ?? undefined,\n }}\n />\n {hasDomain && (\n <Icon\n as={LuCamera}\n position=\"absolute\"\n top=\"80px\"\n left=\"60%\"\n bg={cardBg}\n color={textPrimary}\n p=\"1\"\n borderRadius=\"full\"\n boxSize=\"6\"\n />\n )}\n {isUploading && (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor=\"rgba(0, 0, 0, 0.5)\"\n position=\"absolute\"\n transform=\"translateX(0%)\"\n width=\"100px\"\n height=\"100px\"\n borderRadius=\"full\"\n zIndex={10}\n >\n <Text fontSize=\"xs\" color=\"white\">\n {isUploading ? 'Uploading...' : 'Processing...'}\n </Text>\n </Box>\n )}\n </Box>\n\n <VStack spacing={6} mt={4}>\n {!hasDomain && <DomainRequiredAlert />}\n\n <ActionButton\n title={account?.domain ?? t('Choose account name')}\n description={t(\n 'Choose a unique .vet domain name for your account.',\n )}\n onClick={() => {\n if (account?.domain) {\n setCurrentContent({\n type: 'choose-name-search',\n props: {\n name: '',\n setCurrentContent,\n initialContentSource: {\n type: 'account-customization',\n props: {\n setCurrentContent,\n },\n },\n },\n });\n } else {\n setCurrentContent({\n type: 'choose-name',\n props: {\n setCurrentContent,\n initialContentSource: {\n type: 'account-customization',\n props: {\n setCurrentContent,\n },\n },\n onBack: () =>\n setCurrentContent({\n type: 'account-customization',\n props: {\n setCurrentContent,\n },\n }),\n },\n });\n }\n }}\n leftIcon={LuSquareUser}\n rightIcon={LuChevronRight}\n dataTestId=\"set-domain-name-button\"\n />\n\n <FormControl\n isDisabled={!hasDomain}\n isInvalid={!!errors.displayName}\n >\n <FormLabel\n fontSize=\"sm\"\n fontWeight=\"medium\"\n color={textPrimary}\n >\n {t('Display Name')}\n </FormLabel>\n <Input\n {...register('displayName', {\n maxLength: {\n value: 25,\n message: t(\n 'Display name must be less than 25 characters',\n ),\n },\n })}\n placeholder={\n !hasDomain\n ? t('Set a domain first')\n : t('Enter your display name')\n }\n fontWeight=\"medium\"\n color={textPrimary}\n data-testid=\"display-name-input\"\n />\n {errors.displayName && (\n <Text\n color={errorColor}\n fontSize=\"sm\"\n mt={1}\n fontWeight=\"medium\"\n >\n {errors.displayName.message}\n </Text>\n )}\n </FormControl>\n\n <FormControl\n isDisabled={!hasDomain}\n isInvalid={!!errors.description}\n >\n <FormLabel\n fontSize=\"sm\"\n fontWeight=\"medium\"\n color={textPrimary}\n >\n {t('Description')}\n </FormLabel>\n <Textarea\n {...register('description', {\n maxLength: {\n value: 100,\n message: t(\n 'Description must be less than 100 characters',\n ),\n },\n })}\n placeholder={t('Eg: DevRel @ ENS Labs')}\n fontWeight=\"medium\"\n color={textPrimary}\n data-testid=\"description-input\"\n minH=\"50px\"\n />\n {errors.description && (\n <Text\n color={errorColor}\n mt={1}\n fontSize=\"sm\"\n fontWeight=\"medium\"\n >\n {errors.description.message}\n </Text>\n )}\n </FormControl>\n </VStack>\n\n <input\n type=\"file\"\n ref={fileInputRef}\n hidden\n accept=\"image/*\"\n onChange={async (event) => await handleImageUpload(event)}\n />\n <input\n type=\"file\"\n ref={coverInputRef}\n hidden\n accept=\"image/*\"\n onChange={async (event) => {\n /* Add cover upload handler */\n event.preventDefault();\n }}\n />\n </ModalBody>\n\n <ModalFooter w=\"full\">\n <Button\n variant=\"vechainKitPrimary\"\n onClick={handleSaveChanges}\n isDisabled={!hasDomain || !hasChanges || !isValid}\n isLoading={isUploading}\n loadingText={t('Preparing changes...')}\n data-testid=\"save-changes-button\"\n >\n {t('Save Changes')}\n </Button>\n </ModalFooter>\n </>\n );\n};\n","import React, { useMemo } from 'react';\nimport {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Text,\n ModalFooter,\n Icon,\n useToken,\n} from '@chakra-ui/react';\nimport {\n ModalBackButton,\n StickyHeaderContainer,\n TransactionButtonAndStatus,\n GasFeeSummary,\n} from '../../../../common';\nimport { AccountModalContentTypes } from '../../../Types';\nimport { useTranslation } from 'react-i18next';\n// Import from VeChainKitContext to avoid circular dependency with providers barrel\nimport { useVeChainKitConfig } from '../../../../../providers/VeChainKitContext';\nimport {\n useWallet,\n useUpgradeRequired,\n useUpgradeSmartAccountModal,\n getAvatarQueryKey,\n getAvatarOfAddressQueryKey,\n getTextRecordsQueryKey,\n useGasTokenSelection,\n useGenericDelegatorFeeEstimation,\n} from '../../../../../hooks';\nimport { useUpdateTextRecord } from '../../../../../hooks';\nimport { useForm } from 'react-hook-form';\nimport { useGetResolverAddress } from '../../../../../hooks/api/vetDomains/useGetResolverAddress';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { convertUriToUrl } from '../../../../../utils';\nimport type { GasTokenType } from '../../../../../types/gasToken';\nimport { LuFileText } from 'react-icons/lu';\n\nexport type CustomizationSummaryContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n changes: {\n avatarIpfsHash?: string | null;\n displayName?: string;\n description?: string;\n twitter?: string;\n website?: string;\n email?: string;\n };\n onDoneRedirectContent: AccountModalContentTypes;\n};\n\ntype FormValues = {\n avatarIpfsHash?: string;\n displayName?: string;\n description?: string;\n twitter?: string;\n website?: string;\n email?: string;\n};\n\nexport const CustomizationSummaryContent = ({\n setCurrentContent,\n changes,\n onDoneRedirectContent,\n}: CustomizationSummaryContentProps) => {\n const { t } = useTranslation();\n const { darkMode: isDark, network, feeDelegation } = useVeChainKitConfig();\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const { account, connectedWallet, connection } = useWallet();\n const { preferences } = useGasTokenSelection();\n\n const { data: upgradeRequired } = useUpgradeRequired(\n account?.address ?? '',\n connectedWallet?.address ?? '',\n 3,\n );\n const { open: openUpgradeSmartAccountModal } =\n useUpgradeSmartAccountModal();\n\n const { handleSubmit } = useForm<FormValues>({\n defaultValues: {\n ...changes,\n avatarIpfsHash: changes.avatarIpfsHash ?? undefined,\n },\n });\n\n const domain = account?.domain ?? '';\n\n // Pre-fetch the resolver address\n const { data: resolverAddress } = useGetResolverAddress(domain);\n\n const queryClient = useQueryClient();\n\n const {\n sendTransaction: updateTextRecord,\n txReceipt,\n error: txError,\n isWaitingForWalletConfirmation,\n isTransactionPending,\n clauses: getClauses,\n } = useUpdateTextRecord({\n resolverAddress, // Pass the pre-fetched resolver address\n signerAccountAddress: account?.address ?? '',\n onSuccess: async () => {\n try {\n await refresh();\n } catch (error) {\n console.error('Error refreshing data:', error);\n }\n },\n onError: (error) => {\n console.error('Error updating text record:', error);\n },\n });\n\n // Track if we've already shown success to prevent duplicate calls\n const [hasShownSuccess, setHasShownSuccess] = React.useState(false);\n\n // Handle successful transaction via useEffect to avoid synchronous state updates\n React.useEffect(() => {\n // Guard clauses\n if (!txReceipt) return;\n if (txReceipt.reverted) return;\n if (hasShownSuccess) return;\n if (isTransactionPending) return;\n\n const txId = txReceipt.meta.txID;\n if (!txId) return;\n\n setHasShownSuccess(true);\n setCurrentContent({\n type: 'successful-operation',\n props: {\n setCurrentContent,\n txId,\n title: t('Profile Updated'),\n description: t('Your changes have been saved successfully.'),\n onDone: () => {\n setCurrentContent(onDoneRedirectContent);\n },\n },\n });\n }, [\n txReceipt,\n hasShownSuccess,\n isTransactionPending,\n setCurrentContent,\n t,\n onDoneRedirectContent,\n ]);\n\n // Reset the flag when starting a new transaction\n React.useEffect(() => {\n if (isTransactionPending) {\n setHasShownSuccess(false);\n }\n }, [isTransactionPending]);\n\n // Build the text record updates immediately\n const textRecordUpdates = useMemo(() => {\n const domain = account?.domain ?? '';\n const CHANGES_TO_TEXT_RECORDS = {\n displayName: 'display',\n description: 'description',\n twitter: 'com.x',\n website: 'url',\n email: 'email',\n avatarIpfsHash: 'avatar',\n } as const;\n\n return Object.entries(changes)\n .filter(\n (entry): entry is [string, string] =>\n entry[1] !== undefined && entry[1] !== null,\n )\n .map(([key, value]) => ({\n domain,\n key: CHANGES_TO_TEXT_RECORDS[key as keyof FormValues],\n value: key === 'avatarIpfsHash' ? `ipfs://${value}` : value,\n }));\n }, [changes, account?.domain]);\n\n // Build clauses synchronously only if resolver address is available\n const clauses = useMemo(() => {\n try {\n // Don't build clauses until we have a resolver address\n if (\n !resolverAddress ||\n textRecordUpdates.length === 0 ||\n !getClauses\n ) {\n return [];\n }\n return getClauses(textRecordUpdates);\n } catch (error) {\n console.error('Error building clauses:', error);\n return [];\n }\n }, [textRecordUpdates, getClauses, resolverAddress]);\n\n // Gas estimation\n const [selectedGasToken, setSelectedGasToken] =\n React.useState<GasTokenType | null>(null);\n // Track the user's manual selection to show it during loading (before estimation completes)\n const [userSelectedGasToken, setUserSelectedGasToken] =\n React.useState<GasTokenType | null>(null);\n\n const shouldEstimateGas =\n preferences.availableGasTokens.length > 0 &&\n (connection.isConnectedWithPrivy ||\n connection.isConnectedWithVeChain) &&\n !feeDelegation?.delegatorUrl;\n const {\n data: gasEstimation,\n isLoading: gasEstimationLoading,\n error: gasEstimationError,\n refetch: refetchGasEstimation,\n } = useGenericDelegatorFeeEstimation({\n clauses: clauses,\n tokens: selectedGasToken\n ? [selectedGasToken]\n : preferences.availableGasTokens, // Use selected token or all available\n enabled: shouldEstimateGas && !!feeDelegation?.genericDelegatorUrl,\n });\n const usedGasToken = gasEstimation?.usedToken;\n const disableConfirmButtonDuringEstimation =\n (gasEstimationLoading || !gasEstimation) &&\n connection.isConnectedWithPrivy &&\n !feeDelegation?.delegatorUrl;\n\n const handleGasTokenChange = React.useCallback(\n (token: GasTokenType) => {\n setSelectedGasToken(token);\n setUserSelectedGasToken(token); // Track user's choice\n setTimeout(() => refetchGasEstimation(), 100);\n },\n [refetchGasEstimation],\n );\n\n // hasEnoughBalance is now determined by the hook itself\n const hasEnoughBalance = !!usedGasToken && !gasEstimationError;\n\n // Auto-fallback: if the selected token cannot cover fees (estimation error),\n // clear selection to re-estimate across all available tokens\n // Keep userSelectedGasToken to show during loading, but actual result will show the token that succeeds\n React.useEffect(() => {\n if (gasEstimationError && selectedGasToken) {\n setSelectedGasToken(null);\n }\n }, [gasEstimationError, selectedGasToken]);\n\n const onSubmit = async () => {\n if (upgradeRequired) {\n openUpgradeSmartAccountModal();\n return;\n }\n\n try {\n if (textRecordUpdates.length > 0) {\n await updateTextRecord(textRecordUpdates);\n }\n } catch (error) {\n console.error('Error saving changes:', error);\n }\n };\n\n const renderField = (label: string, value: string) => {\n if (!value?.trim()) return null;\n return (\n <VStack align=\"flex-start\" w=\"full\" spacing={1}>\n <Text\n fontSize=\"sm\"\n color={isDark ? 'whiteAlpha.600' : 'blackAlpha.600'}\n >\n {label}\n </Text>\n <Text fontSize=\"md\">{value}</Text>\n </VStack>\n );\n };\n\n const handleRetry = () => {\n handleSubmit(onSubmit)();\n };\n\n const handleBack = () => {\n setCurrentContent({\n type: 'account-customization',\n props: {\n setCurrentContent,\n },\n });\n };\n\n const refresh = async () => {\n // only update avatar data if it's being changed\n if (changes.avatarIpfsHash) {\n queryClient.setQueryData(\n getAvatarQueryKey(domain, network.type),\n convertUriToUrl(\n 'ipfs://' + changes.avatarIpfsHash,\n network.type,\n ),\n );\n\n queryClient.setQueryData(\n getAvatarOfAddressQueryKey(account?.address ?? ''),\n convertUriToUrl(\n 'ipfs://' + changes.avatarIpfsHash,\n network.type,\n ),\n );\n }\n\n // still refresh text records since they might have other changes\n await queryClient.invalidateQueries({\n queryKey: getTextRecordsQueryKey(domain, network.type),\n });\n\n await queryClient.refetchQueries({\n queryKey: getTextRecordsQueryKey(domain, network.type),\n });\n };\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{t('Confirm Changes')}</ModalHeader>\n <ModalBackButton\n isDisabled={isTransactionPending}\n onClick={handleBack}\n />\n <ModalCloseButton isDisabled={isTransactionPending} />\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack spacing={6} align=\"center\" mt={10}>\n <Icon\n as={LuFileText}\n color={textPrimary}\n fontSize={'60px'}\n opacity={0.5}\n />\n <Text fontSize=\"md\" textAlign=\"center\" color={textPrimary}>\n {t(\n 'By confirming, the following details attached to your name ({{domain}}) will be updated',\n {\n domain,\n },\n )}\n </Text>\n </VStack>\n <VStack spacing={4} align=\"stretch\" mt={6}>\n {changes.avatarIpfsHash && (\n <VStack align=\"flex-start\" w=\"full\" spacing={1}>\n <Text\n fontSize=\"sm\"\n color={\n isDark ? 'whiteAlpha.600' : 'blackAlpha.600'\n }\n >\n {t('Profile Image')}\n </Text>\n <Text fontSize=\"md\">{t('New image selected')}</Text>\n </VStack>\n )}\n\n {changes.displayName &&\n renderField(t('Display Name'), changes.displayName)}\n {changes.description &&\n renderField(t('Description'), changes.description)}\n {changes.twitter &&\n renderField(t('Twitter'), changes.twitter)}\n {changes.website &&\n renderField(t('Website'), changes.website)}\n {changes.email && renderField(t('Email'), changes.email)}\n </VStack>\n {connection.isConnectedWithPrivy && (\n <GasFeeSummary\n estimation={gasEstimation}\n isLoading={gasEstimationLoading}\n isLoadingTransaction={isTransactionPending}\n onTokenChange={handleGasTokenChange}\n clauses={clauses as any}\n userSelectedToken={userSelectedGasToken}\n />\n )}\n </ModalBody>\n\n <ModalFooter gap={4} w=\"full\">\n <TransactionButtonAndStatus\n transactionError={txError}\n isSubmitting={isTransactionPending}\n isTxWaitingConfirmation={isWaitingForWalletConfirmation}\n onConfirm={handleSubmit(onSubmit)}\n onRetry={handleRetry}\n transactionPendingText={t('Saving changes...')}\n txReceipt={txReceipt}\n buttonText={t('Confirm')}\n isDisabled={\n isTransactionPending ||\n disableConfirmButtonDuringEstimation\n }\n gasEstimationError={gasEstimationError}\n hasEnoughGasBalance={hasEnoughBalance}\n isLoadingGasEstimation={gasEstimationLoading}\n showGasEstimationError={\n !feeDelegation?.delegatorUrl &&\n connection.isConnectedWithPrivy\n }\n context=\"customization\"\n />\n </ModalFooter>\n </>\n );\n};\n","import {\n Box,\n HStack,\n Icon,\n Link,\n Text,\n useToken,\n VStack,\n} from '@chakra-ui/react';\nimport { AccountAvatar, AddressDisplay } from '../../../../../common';\nimport { useWalletMetadata } from '../../../../../../hooks';\nimport { LuMail, LuGlobe, LuPencil } from 'react-icons/lu';\nimport { FaXTwitter } from 'react-icons/fa6';\nimport { getPicassoImage } from '../../../../../../utils';\n// Import from VeChainKitContext to avoid circular dependency with providers barrel\nimport { useVeChainKitConfig } from '../../../../../../providers/VeChainKitContext';\nimport { AccountModalContentTypes } from '../../../../Types';\n\nexport type ProfileCardProps = {\n address: string;\n onEditClick?: () => void;\n onLogout?: () => void;\n showHeader?: boolean;\n showLinks?: boolean;\n showDescription?: boolean;\n showDisplayName?: boolean;\n showEdit?: boolean;\n setCurrentContent?: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n};\n\nexport const ProfileCard = ({\n address,\n showHeader = true,\n showLinks = true,\n showDescription = true,\n showDisplayName = true,\n setCurrentContent,\n onLogout,\n}: ProfileCardProps) => {\n const { network } = useVeChainKitConfig();\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const cardBg = useToken('colors', 'vechain-kit-card');\n\n const metadata = useWalletMetadata(address, network.type);\n\n const headerImageSvg = getPicassoImage(address);\n\n const hasLinks =\n metadata?.records?.url ||\n metadata?.records?.['com.x'] ||\n metadata?.records?.email;\n\n const safeHttpUrl = (raw: string): string | null => {\n try {\n const u = new URL(raw);\n return u.protocol === 'http:' || u.protocol === 'https:'\n ? u.toString()\n : null;\n } catch {\n return null;\n }\n };\n\n return (\n <VStack spacing={0} w=\"full\">\n <Box\n p={0}\n backgroundSize=\"100% !important\"\n backgroundPosition=\"center\"\n position=\"relative\"\n // h=\"80px\"\n background={\n showHeader ? `no-repeat url('${headerImageSvg}')` : 'none'\n }\n w=\"100%\"\n borderRadius=\"14px 14px 0 0\"\n />\n <Box\n position=\"relative\"\n display=\"inline-block\"\n cursor={setCurrentContent ? 'pointer' : 'default'}\n onClick={\n setCurrentContent\n ? () => {\n setCurrentContent({\n type: 'account-customization',\n props: {\n setCurrentContent,\n initialContentSource: 'profile',\n },\n });\n }\n : undefined\n }\n >\n <AccountAvatar\n wallet={{\n address,\n domain: metadata?.domain,\n image: metadata?.image,\n isLoadingMetadata: metadata?.isLoading,\n metadata: metadata?.records,\n }}\n props={{\n width: '120px',\n height: '120px',\n // boxShadow: '0px 0px 3px 2px #00000024',\n }}\n />\n {setCurrentContent && (\n <Icon\n as={LuPencil}\n position=\"absolute\"\n bottom=\"0\"\n right=\"0\"\n bg={cardBg}\n color={textPrimary}\n p=\"1\"\n borderRadius=\"full\"\n boxSize=\"6\"\n border=\"2px solid\"\n borderColor={cardBg}\n />\n )}\n </Box>\n\n <VStack w={'full'} spacing={2}>\n {showDisplayName && metadata?.records?.display && (\n <Text\n fontSize=\"xl\"\n color={textPrimary}\n fontWeight=\"bold\"\n w=\"full\"\n textAlign=\"center\"\n mt={2}\n data-testid=\"display-name-val\"\n >\n {metadata?.records?.display}\n </Text>\n )}\n\n {showDescription && metadata?.records?.description && (\n <Text\n fontSize=\"sm\"\n color={textSecondary}\n w=\"full\"\n textAlign=\"center\"\n data-testid=\"description-val\"\n >\n {metadata?.records?.description}\n </Text>\n )}\n\n {showLinks && hasLinks && (\n <HStack w={'full'} justify={'center'} spacing={5} mt={4}>\n {metadata?.records?.email && (\n <Link\n href={`mailto:${metadata?.records?.email}`}\n target=\"_blank\"\n data-testid=\"mail-link\"\n >\n <Icon as={LuMail} color={textPrimary} />\n </Link>\n )}\n {metadata?.records?.url && (\n <Link\n href={\n safeHttpUrl(metadata.records.url) ??\n undefined\n }\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-testid=\"website-link\"\n >\n <Icon as={LuGlobe} color={textPrimary} />\n </Link>\n )}\n {metadata?.records?.['com.x'] && (\n <Link\n href={`https://x.com/${encodeURIComponent(\n String(metadata.records['com.x']),\n )}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-testid=\"twitter-link\"\n >\n <Icon as={FaXTwitter} color={textPrimary} />\n </Link>\n )}\n </HStack>\n )}\n\n <AddressDisplay\n onLogout={onLogout}\n wallet={{\n address,\n domain: metadata?.domain,\n image: metadata?.image,\n isLoadingMetadata: metadata?.isLoading,\n metadata: metadata?.records,\n }}\n style={{ mt: 4 }}\n setCurrentContent={setCurrentContent}\n />\n </VStack>\n </VStack>\n );\n};\n","import { useUpgradeRequired, useWallet } from '../../hooks';\nimport { IconButton, IconButtonProps, Box, Icon } from '@chakra-ui/react';\nimport { useEffect, useState } from 'react';\nimport { LuSettings2 } from 'react-icons/lu';\n\ntype ModalSettingsButtonProps = {\n onClick: () => void;\n} & Partial<IconButtonProps>;\n\nexport const ModalSettingsButton = ({\n onClick,\n ...props\n}: ModalSettingsButtonProps) => {\n const { smartAccount, connectedWallet, connection } = useWallet();\n const [isFirstVisit, setIsFirstVisit] = useState(false);\n\n useEffect(() => {\n const hasVisited = localStorage.getItem('app-first-visit');\n setIsFirstVisit(!hasVisited);\n }, []);\n\n const { data: upgradeRequired } = useUpgradeRequired(\n smartAccount?.address ?? '',\n connectedWallet?.address ?? '',\n 3,\n );\n const showRedDot = connection.isConnectedWithPrivy && upgradeRequired;\n\n const handleOnClick = () => {\n if (isFirstVisit) {\n localStorage.setItem('app-first-visit', 'true');\n setIsFirstVisit(false);\n }\n\n onClick();\n };\n\n return (\n <IconButton\n aria-label=\"Settings\"\n size=\"sm\"\n variant=\"vechainKitHeaderIconButtons\"\n position=\"absolute\"\n left=\"10px\"\n top=\"8px\"\n lineHeight={'0'}\n onClick={handleOnClick}\n icon={\n <Box position=\"relative\">\n <Icon as={LuSettings2} fontSize={'18px'} />\n {showRedDot && (\n <Box\n position=\"absolute\"\n top=\"-1px\"\n right=\"-1px\"\n minWidth=\"8px\"\n height=\"8px\"\n bg=\"red.500\"\n borderRadius=\"full\"\n />\n )}\n </Box>\n }\n {...props}\n />\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n ModalFooter,\n VStack,\n HStack,\n Button,\n Icon,\n Text,\n} from '@chakra-ui/react';\nimport {\n useSwitchWallet,\n useWallet,\n useTotalBalance,\n LocalStorageKey,\n useLocalStorage,\n} from '../../../../hooks';\n// Use optional hook to handle missing DAppKitProvider gracefully\nimport { useOptionalDAppKitWallet } from '../../../../hooks/api/dappkit/useOptionalDAppKitWallet';\nimport { FeatureAnnouncementCard } from '../../Components';\nimport { ProfileCard } from './Components/ProfileCard/ProfileCard';\nimport {\n StickyHeaderContainer,\n WalletSwitchFeedback,\n} from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { useTranslation } from 'react-i18next';\nimport { LuArrowLeftRight, LuLogOut, LuWalletCards } from 'react-icons/lu';\nimport { ModalSettingsButton } from '../../../common/ModalSettingsButton';\nimport { AssetIcons } from '../../../WalletButton/AssetIcons';\n\nexport type ProfileContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n onLogoutSuccess: () => void;\n switchFeedback?: { showFeedback: boolean };\n};\n\nexport const ProfileContent = ({\n setCurrentContent,\n onLogoutSuccess,\n switchFeedback,\n}: ProfileContentProps) => {\n const { t } = useTranslation();\n const { account, disconnect, connection } = useWallet();\n const { switchWallet, isSwitching, isInAppBrowser } = useSwitchWallet();\n const { isSwitchWalletEnabled } = useOptionalDAppKitWallet();\n const { hasAnyBalance, formattedBalance } = useTotalBalance({\n address: account?.address,\n });\n const [showAssets] = useLocalStorage(LocalStorageKey.SHOW_ASSETS, true);\n\n const handleSwitchWallet = () => {\n if (isInAppBrowser) {\n switchWallet();\n } else {\n // Desktop: navigate to select wallet screen\n setCurrentContent({\n type: 'select-wallet',\n props: {\n setCurrentContent,\n onClose: () => {},\n returnTo: 'profile',\n onLogoutSuccess,\n },\n });\n }\n };\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader data-testid=\"modal-title\">\n {t('Profile')}\n </ModalHeader>\n\n <ModalSettingsButton\n onClick={() => {\n setCurrentContent('settings');\n }}\n data-testid=\"settings-button\"\n />\n\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody w={'full'}>\n <VStack w={'full'} spacing={6}>\n <WalletSwitchFeedback\n showFeedback={switchFeedback?.showFeedback}\n />\n {!account?.domain && (\n <FeatureAnnouncementCard\n setCurrentContent={setCurrentContent}\n />\n )}\n\n <ProfileCard\n onEditClick={() => {\n setCurrentContent({\n type: 'account-customization',\n props: {\n setCurrentContent,\n initialContentSource: 'profile',\n },\n });\n }}\n address={account?.address ?? ''}\n showHeader={false}\n setCurrentContent={setCurrentContent}\n onLogout={() => {\n disconnect();\n onLogoutSuccess?.();\n }}\n />\n </VStack>\n </ModalBody>\n <ModalFooter w=\"full\">\n <HStack w=\"full\" justify=\"space-between\" spacing={4} mt={4}>\n <Button\n size=\"md\"\n width=\"full\"\n height=\"40px\"\n variant=\"vechainKitSecondary\"\n leftIcon={\n hasAnyBalance ? undefined : (\n <Icon as={LuWalletCards} />\n )\n }\n onClick={() => setCurrentContent('main')}\n data-testid=\"wallet-button\"\n >\n {hasAnyBalance ? (\n <HStack spacing={2} w=\"full\" justify=\"center\">\n <AssetIcons\n address={account?.address ?? ''}\n maxIcons={2}\n />\n <Text fontWeight=\"600\">\n {showAssets\n ? formattedBalance\n : formattedBalance[0] +\n '*'.repeat(formattedBalance.slice(1).length)}\n </Text>\n </HStack>\n ) : (\n t('Wallet')\n )}\n </Button>\n\n {/* In VeWorld mobile we call switchWallet\n on the desktop we call setCurrentContent to select-wallet\n otherwise we show logout button\n */}\n {(connection.isInAppBrowser && isSwitchWalletEnabled) ||\n (!connection.isInAppBrowser &&\n connection.isConnectedWithDappKit) ? (\n <Button\n size=\"md\"\n width=\"full\"\n height=\"40px\"\n variant=\"vechainKitSecondary\"\n leftIcon={<Icon as={LuArrowLeftRight} />}\n colorScheme=\"red\"\n onClick={async () => {\n handleSwitchWallet();\n }}\n isLoading={isSwitching}\n isDisabled={isSwitching}\n data-testid=\"switch-wallet-button\"\n >\n {t('Switch')}\n </Button>\n ) : (\n <Button\n size=\"md\"\n width=\"full\"\n height=\"40px\"\n variant=\"vechainKitSecondary\"\n leftIcon={<Icon as={LuLogOut} />}\n colorScheme=\"red\"\n onClick={() =>\n setCurrentContent({\n type: 'disconnect-confirm',\n props: {\n onDisconnect: () => {\n disconnect();\n onLogoutSuccess?.();\n },\n onBack: () =>\n setCurrentContent?.('profile'),\n },\n })\n }\n data-testid=\"logout-button\"\n >\n {t('Logout')}\n </Button>\n )}\n </HStack>\n </ModalFooter>\n </>\n );\n};\n","import {\n ModalHeader,\n ModalBody,\n ModalFooter,\n Text,\n VStack,\n Alert,\n AlertIcon,\n AlertTitle,\n AlertDescription,\n Box,\n ModalCloseButton,\n Button,\n HStack,\n Circle,\n Image,\n Heading,\n Icon,\n} from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport {\n ModalBackButton,\n StickyHeaderContainer,\n TransactionButtonAndStatus,\n} from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { useUpgradeRequired, useUpgradeSmartAccount, useWallet } from '../../../../hooks';\nimport { LuArrowRight } from 'react-icons/lu';\n\nexport type UpgradeSmartAccountContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n handleClose?: () => void;\n initialContent?: AccountModalContentTypes;\n};\n\nexport const UpgradeSmartAccountContent = ({\n setCurrentContent,\n handleClose,\n initialContent = 'settings',\n}: UpgradeSmartAccountContentProps) => {\n const { t } = useTranslation();\n const { smartAccount, connectedWallet } = useWallet();\n const { data: upgradeRequired } = useUpgradeRequired(\n smartAccount?.address ?? '',\n connectedWallet?.address ?? '',\n 3,\n );\n\n // Set up the upgrade transaction\n const {\n sendTransaction: upgradeSmartAccount,\n isTransactionPending,\n isWaitingForWalletConfirmation,\n error: upgradeError,\n txReceipt,\n } = useUpgradeSmartAccount({\n smartAccountAddress: smartAccount?.address ?? '',\n targetVersion: 3,\n onSuccess: () => {\n setCurrentContent({\n type: 'successful-operation',\n props: {\n setCurrentContent,\n txId: txReceipt?.meta.txID,\n title: t('Upgrade Successful!'),\n description: t(\n 'Your account has been successfully upgraded to the latest version. You can now enjoy a better user experience, lower gas costs, and enhanced security.',\n ),\n onDone: () => {\n if (handleClose) {\n handleClose();\n } else {\n setCurrentContent(initialContent);\n }\n },\n showSocialButtons: false,\n },\n });\n },\n onError: () => {\n console.error('Error upgrading Smart Account');\n },\n });\n\n // Handle the upgrade process\n const handleUpgrade = async () => {\n try {\n await upgradeSmartAccount();\n } catch (err) {\n console.error('Failed to upgrade Smart Account:', err);\n }\n };\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{t('Account upgrade required')}</ModalHeader>\n <ModalBackButton\n onClick={() => {\n setCurrentContent(initialContent);\n }}\n />\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack spacing={10} align=\"stretch\">\n <Text fontSize=\"sm\" textAlign=\"center\">\n {upgradeRequired\n ? t(\n 'Your smart account needs to be upgraded to the latest version (v3).',\n )\n : t(\n 'Your smart account is already upgraded to this version.',\n )}\n </Text>\n\n <HStack\n align=\"center\"\n justifyContent=\"space-evenly\"\n rounded=\"md\"\n >\n <Box position=\"relative\" display=\"inline-block\">\n <Circle size=\"60px\" bg=\"gray.200\">\n <Image\n borderRadius=\"full\"\n src={smartAccount?.image}\n alt={t('Profile Picture')}\n w=\"100%\"\n h=\"100%\"\n objectFit=\"cover\"\n />\n </Circle>\n\n <Heading\n position=\"absolute\"\n top=\"-5\"\n right=\"-5\"\n color=\"#D23F63\"\n fontSize=\"28px\"\n >\n {`v1`}\n </Heading>\n </Box>\n\n <Icon as={LuArrowRight} color=\"#3DBA67\" />\n\n <Box position=\"relative\" display=\"inline-block\">\n <Circle size=\"60px\" bg=\"gray.200\">\n <Image\n borderRadius=\"full\"\n src={smartAccount?.image}\n alt={t('Profile Picture')}\n w=\"100%\"\n h=\"100%\"\n objectFit=\"cover\"\n />\n </Circle>\n <Heading\n position=\"absolute\"\n top=\"-5\"\n right=\"-5\"\n color=\"#3DBA67\"\n fontSize=\"28px\"\n >\n {`v3`}\n </Heading>\n </Box>\n </HStack>\n\n <Alert status=\"info\" borderRadius=\"md\">\n <AlertIcon />\n <Box>\n <AlertTitle fontSize=\"sm\">\n {t('Benefits of this upgrade:')}\n </AlertTitle>\n <AlertDescription fontSize=\"xs\">\n <VStack align=\"start\" spacing={0} mt={1}>\n <Text fontSize=\"xs\" lineHeight=\"1.2\">\n • {t('Improved security features')}\n </Text>\n <Text fontSize=\"xs\">\n • {t('Better transaction handling')}\n </Text>\n <Text fontSize=\"xs\">\n •{' '}\n {t('Enhanced compatibility with dApps')}\n </Text>\n <Text fontSize=\"xs\">\n •{' '}\n {t('Reduced gas costs for operations')}\n </Text>\n </VStack>\n </AlertDescription>\n </Box>\n </Alert>\n </VStack>\n </ModalBody>\n\n <ModalFooter justifyContent=\"center\">\n <VStack spacing={3} w=\"full\">\n <TransactionButtonAndStatus\n buttonText={\n upgradeRequired\n ? t('Upgrade account')\n : t('Account already upgraded')\n }\n onConfirm={handleUpgrade}\n isTxWaitingConfirmation={isWaitingForWalletConfirmation}\n isSubmitting={isTransactionPending}\n transactionPendingText={t('Upgrading...')}\n txReceipt={txReceipt}\n transactionError={upgradeError}\n isDisabled={!upgradeRequired}\n />\n\n <Button\n mt={2}\n variant={'link'}\n onClick={() => {\n if (handleClose) {\n handleClose();\n } else {\n setCurrentContent(initialContent);\n }\n }}\n isDisabled={isTransactionPending}\n >\n {upgradeRequired\n ? t('Close and do this later')\n : t('Close')}\n </Button>\n </VStack>\n </ModalFooter>\n </>\n );\n};\n","import {\n Button,\n Container,\n Icon,\n Input,\n InputGroup,\n InputLeftElement,\n ModalBody,\n ModalCloseButton,\n ModalFooter,\n ModalHeader,\n VStack,\n useToken,\n} from '@chakra-ui/react';\nimport { useWallet, useTokensWithValues, TokenWithValue } from '../../../../hooks';\nimport {\n AssetButton,\n ModalBackButton,\n StickyHeaderContainer,\n} from '../../../common';\n// Import from VeChainKitContext to avoid circular dependency with providers barrel\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\nimport { useTranslation } from 'react-i18next';\nimport { LuPencil } from 'react-icons/lu';\nimport { AccountModalContentTypes } from '../../Types';\nimport { LuSearch } from 'react-icons/lu';\nimport { useState } from 'react';\nimport { useCurrency } from '../../../../hooks';\nimport { SupportedCurrency } from '../../../../utils/currencyUtils';\nimport { useAccountModalOptions } from '../../../../hooks/modals/useAccountModalOptions';\n\nexport type AssetsContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n};\n\nexport const AssetsContent = ({ setCurrentContent }: AssetsContentProps) => {\n const { account } = useWallet();\n const { sortedTokens } = useTokensWithValues({ address: account?.address });\n const { allowCustomTokens, darkMode } = useVeChainKitConfig();\n const { currentCurrency } = useCurrency();\n \n const textTertiary = useToken('colors', 'vechain-kit-text-tertiary');\n const { t } = useTranslation();\n const { isolatedView } = useAccountModalOptions();\n const [searchQuery, setSearchQuery] = useState('');\n\n const handleTokenSelect = (token: TokenWithValue) => {\n setCurrentContent({\n type: 'send-token',\n props: {\n setCurrentContent,\n preselectedToken: token,\n onBack: () => setCurrentContent('assets'),\n },\n });\n };\n\n // Filter tokens by search query\n const filteredTokens = sortedTokens.filter(({ symbol }) =>\n symbol.toLowerCase().includes(searchQuery.toLowerCase()),\n );\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{t('Assets')}</ModalHeader>\n {!isolatedView && (\n <ModalBackButton\n onClick={() => setCurrentContent('main')}\n />\n )}\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <Container h={['540px', 'auto']} p={0}>\n <ModalBody>\n <InputGroup size=\"lg\">\n <Input\n placeholder=\"Search token\"\n bg={darkMode ? '#00000038' : 'gray.50'}\n borderRadius=\"xl\"\n height=\"56px\"\n pl={12}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n data-testid=\"search-token-input\"\n />\n <InputLeftElement h=\"56px\" w=\"56px\" pl={4}>\n <LuSearch\n color={textTertiary}\n />\n </InputLeftElement>\n </InputGroup>\n\n <VStack spacing={2} align=\"stretch\" mt={2}>\n {filteredTokens.map((token) => {\n const hasBalance = Number(token.balance) > 0;\n\n return (\n <AssetButton\n key={token.address}\n symbol={token.symbol}\n amount={Number(token.balance)}\n currencyValue={token.valueInCurrency}\n currentCurrency={\n currentCurrency as SupportedCurrency\n }\n onClick={() => handleTokenSelect(token)}\n isDisabled={!hasBalance}\n />\n );\n })}\n </VStack>\n </ModalBody>\n <ModalFooter>\n {allowCustomTokens && (\n <Button\n variant=\"vechainKitSecondary\"\n leftIcon={<Icon as={LuPencil} boxSize={4} />}\n onClick={() =>\n setCurrentContent('add-custom-token')\n }\n >\n {t('Manage Custom Tokens')}\n </Button>\n )}\n </ModalFooter>\n </Container>\n </>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Input,\n Button,\n Text,\n Box,\n HStack,\n ModalFooter,\n FormControl,\n FormLabel,\n Image,\n useToken,\n} from '@chakra-ui/react';\nimport { ModalBackButton, StickyHeaderContainer } from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { useTranslation } from 'react-i18next';\nimport { useForm } from 'react-hook-form';\nimport { useCustomTokens } from '../../../../hooks/api/wallet/useCustomTokens';\nimport { humanAddress, TOKEN_LOGOS } from '../../../../utils';\nimport { LuTrash2 } from 'react-icons/lu';\n\nexport type ManageCustomTokenContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n};\n\n// Add form values type\ntype FormValues = {\n newTokenAddress: string;\n};\n\nexport const ManageCustomTokenContent = ({\n setCurrentContent,\n}: ManageCustomTokenContentProps) => {\n const { t } = useTranslation();\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const backgroundCard = useToken('colors', 'vechain-kit-card');\n const backgroundOverlay = useToken('colors', 'vechain-kit-overlay');\n\n const {\n addToken,\n removeToken,\n isTokenIncluded,\n isDefaultToken,\n customTokens,\n } = useCustomTokens();\n\n // Form setup with validation rules\n const {\n register,\n setError,\n setValue,\n formState: { errors, isValid },\n handleSubmit,\n } = useForm<FormValues>({\n defaultValues: {\n newTokenAddress: '',\n },\n mode: 'onChange',\n });\n\n const onSubmit = async (data: FormValues) => {\n if (!data.newTokenAddress) return;\n\n if (\n isTokenIncluded(data.newTokenAddress) ||\n isDefaultToken(data.newTokenAddress)\n ) {\n return setError('newTokenAddress', {\n type: 'manual',\n message: t('Token already added'),\n });\n }\n\n try {\n await addToken(data.newTokenAddress);\n setValue('newTokenAddress', ''); // Clear the input after successful addition\n } catch (error) {\n console.error('Error adding token 2:', error);\n setError('newTokenAddress', {\n type: 'manual',\n message: t('Invalid token address'),\n });\n }\n };\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{t('Manage Custom Tokens')}</ModalHeader>\n <ModalBackButton onClick={() => setCurrentContent('assets')} />\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack spacing={4} align=\"stretch\" position=\"relative\">\n {/* Input Section */}\n <Box p={6} borderRadius=\"xl\" bg={backgroundCard}>\n <VStack align=\"stretch\" spacing={2}>\n <FormControl isInvalid={!!errors.newTokenAddress}>\n <FormLabel\n fontSize=\"sm\"\n fontWeight=\"medium\"\n color={textPrimary}\n >\n {t('Token Contract Address')}\n </FormLabel>\n <Input\n {...register('newTokenAddress', {\n required: t('Address is required'),\n pattern: {\n value: /^0x[a-fA-F0-9]{40}$/,\n message: t(\n 'Please enter a valid contract address',\n ),\n },\n validate: (value) =>\n /^0x[a-fA-F0-9]{40}$/.test(value) ||\n t('Invalid contract address'),\n })}\n onChange={(e) => {\n const trimmed = e.target.value.trim();\n e.target.value = trimmed;\n setValue('newTokenAddress', trimmed, {\n shouldValidate: true,\n });\n }}\n placeholder=\"0x...\"\n variant=\"outline\"\n fontSize=\"md\"\n fontWeight=\"medium\"\n />\n {errors.newTokenAddress && (\n <Text color=\"#ef4444\" fontSize=\"sm\">\n {errors.newTokenAddress.message}\n </Text>\n )}\n </FormControl>\n </VStack>\n </Box>\n\n {/* Existing Tokens List */}\n {customTokens.length > 0 && (\n <Box p={4} borderRadius=\"xl\" bg={backgroundOverlay}>\n <Text fontSize=\"sm\" fontWeight=\"medium\" mb={2}>\n {t('Existing Custom Tokens')}\n </Text>\n <VStack align=\"stretch\" spacing={2}>\n {customTokens.map((token) => (\n <HStack\n key={token.address}\n justify=\"space-between\"\n fontSize=\"sm\"\n p={2}\n borderRadius=\"md\"\n bg={backgroundCard}\n >\n <HStack>\n <Image\n src={TOKEN_LOGOS[token?.symbol]}\n alt={`${token.symbol} logo`}\n boxSize=\"20px\"\n borderRadius=\"full\"\n fallback={\n <Box\n boxSize=\"20px\"\n borderRadius=\"full\"\n bg=\"whiteAlpha.200\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Text\n fontSize=\"8px\"\n fontWeight=\"bold\"\n color={textPrimary}\n >\n {token.symbol?.slice(\n 0,\n 3,\n )}\n </Text>\n </Box>\n }\n />\n <Text\n fontWeight=\"medium\"\n color={textPrimary}\n >\n {token.symbol ?? 'Unknown'}\n </Text>\n </HStack>\n <Text color={textSecondary}>\n {humanAddress(\n token.address ?? '',\n 4,\n 4,\n )}\n </Text>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n color={textPrimary}\n borderRadius=\"md\"\n p={2}\n onClick={() =>\n removeToken(token.address)\n }\n >\n <LuTrash2\n size={16}\n color={textPrimary}\n />\n </Button>\n </HStack>\n ))}\n </VStack>\n </Box>\n )}\n </VStack>\n </ModalBody>\n\n <ModalFooter>\n <Button\n variant=\"vechainKitPrimary\"\n isDisabled={!isValid}\n onClick={handleSubmit(onSubmit)}\n >\n {t('Add Token')}\n </Button>\n </ModalFooter>\n </>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Button,\n ModalFooter,\n Text,\n Icon,\n HStack,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport {\n ModalBackButton,\n ScrollToTopWrapper,\n StickyHeaderContainer,\n} from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport type { CURRENCY } from '../../../../types';\nimport { CURRENCY_SYMBOLS } from '../../../../types';\nimport { useCurrency } from '../../../../hooks';\nimport { LuCheck } from 'react-icons/lu';\nimport { useTranslation } from 'react-i18next';\nimport { useEffect } from 'react';\nimport { setLocalStorageItem } from '../../../../utils/ssrUtils';\n\nexport type ChangeCurrencyContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n};\n\nexport const ChangeCurrencyContent = ({\n setCurrentContent,\n}: ChangeCurrencyContentProps) => {\n const { t } = useTranslation();\n const { currentCurrency, changeCurrency, allCurrencies } = useCurrency();\n const selectedBg = useColorModeValue(\n 'rgba(0, 0, 0, 0.1)',\n 'rgba(255, 255, 255, 0.05)',\n );\n\n useEffect(() => {\n // Ensure we mark the currency settings as visited when this component mounts\n setLocalStorageItem('settings-currency-visited', 'true');\n }, []);\n\n const renderCurrencyButton = (currency: CURRENCY) => {\n const isSelected = currentCurrency === currency;\n return (\n <Button\n key={currency}\n w=\"full\"\n variant=\"ghost\"\n justifyContent=\"space-between\"\n onClick={() => changeCurrency(currency)}\n py={6}\n px={4}\n bg={isSelected ? selectedBg : undefined}\n >\n <HStack spacing={3}>\n <Text fontSize=\"xl\">{CURRENCY_SYMBOLS[currency]}</Text>\n <Text>{currency.toUpperCase()}</Text>\n </HStack>\n {isSelected && (\n <Icon as={LuCheck} boxSize={5} color=\"blue.500\" />\n )}\n </Button>\n );\n };\n\n return (\n <ScrollToTopWrapper>\n <StickyHeaderContainer>\n <ModalHeader>{t('Select currency')}</ModalHeader>\n <ModalBackButton\n onClick={() => setCurrentContent('settings')}\n />\n <ModalCloseButton />\n </StickyHeaderContainer>\n <ModalBody w={'full'}>\n <VStack\n justify={'center'}\n spacing={3}\n align=\"flex-start\"\n w={'full'}\n >\n {allCurrencies.map((cur) => renderCurrencyButton(cur))}\n </VStack>\n </ModalBody>\n <ModalFooter pt={0} />\n </ScrollToTopWrapper>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n VStack,\n ModalFooter,\n ModalHeader,\n Text,\n Button,\n Icon,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport {\n ModalBackButton,\n ScrollToTopWrapper,\n StickyHeaderContainer,\n} from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { useTranslation } from 'react-i18next';\nimport { languageNames, supportedLanguages } from '../../../../../i18n';\nimport { LuCheck } from 'react-icons/lu';\n\ntype Props = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n};\n\nexport const LanguageSettingsContent = ({ setCurrentContent }: Props) => {\n const { t, i18n } = useTranslation();\n const selectedBg = useColorModeValue(\n 'rgba(0, 0, 0, 0.1)',\n 'rgba(255, 255, 255, 0.05)',\n );\n\n const handleLanguageChange = (lang: string) => {\n i18n.changeLanguage(lang);\n };\n\n const renderLanguageButton = (lang: string) => {\n const isSelected = i18n.language === lang;\n return (\n <Button\n key={lang}\n w=\"full\"\n variant=\"ghost\"\n justifyContent=\"space-between\"\n onClick={() => handleLanguageChange(lang)}\n py={6}\n px={4}\n bg={isSelected ? selectedBg : undefined}\n >\n <Text>{languageNames[lang as keyof typeof languageNames]}</Text>\n {isSelected && (\n <Icon as={LuCheck} boxSize={5} color=\"blue.500\" />\n )}\n </Button>\n );\n };\n\n return (\n <ScrollToTopWrapper>\n <StickyHeaderContainer>\n <ModalHeader>{t('Select language')}</ModalHeader>\n\n <ModalBackButton\n onClick={() => setCurrentContent('settings')}\n />\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody w={'full'}>\n <VStack\n justify={'center'}\n spacing={3}\n align=\"flex-start\"\n w={'full'}\n >\n {supportedLanguages.map((lang: string) =>\n renderLanguageButton(lang),\n )}\n </VStack>\n </ModalBody>\n <ModalFooter pt={0} />\n </ScrollToTopWrapper>\n );\n};\n","import { useState, useRef } from 'react';\nimport {\n Box,\n HStack,\n VStack,\n Text,\n Switch,\n Icon,\n useToken,\n} from '@chakra-ui/react';\nimport { LuGripVertical } from 'react-icons/lu';\nimport type { GasTokenType } from '../../../../types/gasToken';\nimport { SUPPORTED_GAS_TOKENS } from '../../../../utils/constants';\n// Direct import to avoid circular dependency via providers barrel export\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\n\ninterface DragListProps {\n tokens: GasTokenType[];\n excludedTokens: GasTokenType[];\n onReorder: (newOrder: GasTokenType[]) => void;\n onToggleExclusion: (token: GasTokenType) => void;\n}\n\ninterface TokenItemProps {\n token: GasTokenType;\n index: number;\n isExcluded: boolean;\n onToggleExclusion: (token: GasTokenType) => void;\n onDragStart: (index: number) => void;\n onDragOver: (index: number) => void;\n onDrop: (index: number) => void;\n onTouchStart: (index: number, event: React.TouchEvent) => void;\n onTouchMove: (event: React.TouchEvent) => void;\n onTouchEnd: () => void;\n isDragging: boolean;\n isDraggedOver: boolean;\n}\n\nconst TokenPriorityItem = ({\n token,\n index,\n isExcluded,\n onToggleExclusion,\n onDragStart,\n onDragOver,\n onDrop,\n onTouchStart,\n onTouchMove,\n onTouchEnd,\n isDragging,\n isDraggedOver,\n}: TokenItemProps) => {\n const tokenInfo = SUPPORTED_GAS_TOKENS[token];\n const { darkMode: isDark } = useVeChainKitConfig();\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const cardBg = useToken('colors', 'vechain-kit-card');\n\n return (\n <Box\n bg={isDark ? '#ffffff0a' : 'blackAlpha.50'}\n borderRadius=\"md\"\n border=\"1px\"\n borderColor={\n isDragging\n ? isDark\n ? 'blue.500'\n : 'blue.300'\n : isDraggedOver\n ? isDark\n ? 'blue.400'\n : 'blue.200'\n : cardBg\n }\n p={3}\n mb={2}\n opacity={isDragging ? 0.5 : isExcluded ? 0.5 : 1}\n cursor=\"move\"\n transition=\"background-color 0.2s ease, border-color 0.2s ease\"\n draggable\n onDragStart={() => onDragStart(index)}\n onDragOver={(e) => {\n e.preventDefault();\n onDragOver(index);\n }}\n onDrop={() => onDrop(index)}\n onTouchStart={(e) => onTouchStart(index, e)}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n _hover={{\n backgroundColor: isDark ? '#ffffff12' : 'blackAlpha.200',\n }}\n >\n <HStack justify=\"space-between\">\n <HStack opacity={isExcluded ? 0.5 : 1}>\n <Box\n cursor=\"grab\"\n _active={{ cursor: 'grabbing' }}\n pointerEvents=\"none\"\n >\n <Icon as={LuGripVertical} color={textSecondary} />\n </Box>\n <VStack align=\"start\" spacing={0}>\n <Text fontWeight=\"medium\" color={textPrimary}>\n {tokenInfo.name}\n </Text>\n <Text fontSize=\"sm\" color={textSecondary}>\n {tokenInfo.description}\n </Text>\n </VStack>\n </HStack>\n <Switch\n isChecked={!isExcluded}\n onChange={() => onToggleExclusion(token)}\n colorScheme=\"blue\"\n size=\"sm\"\n />\n </HStack>\n </Box>\n );\n};\n\nexport const GasTokenDragList = ({\n tokens,\n excludedTokens,\n onReorder,\n onToggleExclusion,\n}: DragListProps) => {\n const [draggedIndex, setDraggedIndex] = useState<number | null>(null);\n const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);\n const itemRefs = useRef<(HTMLDivElement | null)[]>([]);\n const touchStartY = useRef<number>(0);\n\n const handleDragStart = (index: number) => {\n setDraggedIndex(index);\n };\n\n const handleDragOver = (index: number) => {\n setDragOverIndex(index);\n };\n\n const handleDrop = (dropIndex: number) => {\n if (draggedIndex === null || draggedIndex === dropIndex) {\n setDraggedIndex(null);\n setDragOverIndex(null);\n return;\n }\n\n const newOrder = [...tokens];\n const draggedToken = newOrder[draggedIndex];\n newOrder.splice(draggedIndex, 1);\n newOrder.splice(dropIndex, 0, draggedToken);\n\n onReorder(newOrder);\n setDraggedIndex(null);\n setDragOverIndex(null);\n };\n\n // Touch event handlers for mobile support\n const handleTouchStart = (index: number, event: React.TouchEvent) => {\n touchStartY.current = event.touches[0].clientY;\n setDraggedIndex(index);\n };\n\n const handleTouchMove = (event: React.TouchEvent) => {\n if (draggedIndex === null) return;\n\n const touch = event.touches[0];\n const currentY = touch.clientY;\n\n // Find which item is under the current touch position\n for (let i = 0; i < itemRefs.current.length; i++) {\n const element = itemRefs.current[i];\n if (!element) continue;\n\n const rect = element.getBoundingClientRect();\n if (currentY >= rect.top && currentY <= rect.bottom) {\n setDragOverIndex(i);\n break;\n }\n }\n };\n\n const handleTouchEnd = () => {\n if (\n draggedIndex !== null &&\n dragOverIndex !== null &&\n draggedIndex !== dragOverIndex\n ) {\n const newOrder = [...tokens];\n const draggedToken = newOrder[draggedIndex];\n newOrder.splice(draggedIndex, 1);\n newOrder.splice(dragOverIndex, 0, draggedToken);\n onReorder(newOrder);\n }\n\n setDraggedIndex(null);\n setDragOverIndex(null);\n touchStartY.current = 0;\n };\n\n return (\n <Box w=\"full\">\n {tokens.map((token, index) => (\n <Box\n key={token}\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n >\n <TokenPriorityItem\n token={token}\n index={index}\n isExcluded={excludedTokens.includes(token)}\n onToggleExclusion={onToggleExclusion}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n isDragging={draggedIndex === index}\n isDraggedOver={dragOverIndex === index}\n />\n </Box>\n ))}\n </Box>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n VStack,\n ModalHeader,\n Text,\n Alert,\n AlertIcon,\n AlertDescription,\n useToken,\n} from '@chakra-ui/react';\nimport {\n ModalBackButton,\n ScrollToTopWrapper,\n StickyHeaderContainer,\n} from '../../../common';\nimport { useTranslation } from 'react-i18next';\nimport { AccountModalContentTypes } from '../../Types';\nimport { useGasTokenSelection } from '../../../../hooks';\nimport type { GasTokenType } from '../../../../types/gasToken';\nimport { GasTokenDragList } from './GasTokenDragList';\nimport { useCallback } from 'react';\n\ntype Props = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n};\n\nexport const GasTokenSettingsContent = ({ setCurrentContent }: Props) => {\n const { t } = useTranslation();\n const { preferences, reorderTokenPriority, toggleTokenExclusion } =\n useGasTokenSelection();\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n\n const handleReorder = useCallback(\n (newOrder: GasTokenType[]) => {\n reorderTokenPriority(newOrder);\n },\n [reorderTokenPriority],\n );\n\n return (\n <ScrollToTopWrapper>\n <StickyHeaderContainer>\n <ModalHeader>{t('Gas Token Preferences')}</ModalHeader>\n <ModalBackButton\n onClick={() => setCurrentContent('settings')}\n />\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody w=\"full\">\n <VStack\n justify=\"center\"\n spacing={6}\n align=\"flex-start\"\n w=\"full\"\n >\n <VStack w=\"full\" justifyContent=\"center\" spacing={3} mb={3}>\n <Text\n fontSize=\"sm\"\n color={textSecondary}\n textAlign=\"center\"\n >\n {t(\n 'Choose which tokens to use for transaction fees when the app is not covering them.',\n )}\n </Text>\n </VStack>\n\n {/* Warning when all tokens are disabled */}\n {preferences.availableGasTokens.length === 0 && (\n <Alert status=\"warning\" borderRadius=\"md\">\n <AlertIcon />\n <AlertDescription\n fontSize=\"sm\"\n color={textSecondary}\n >\n {t(\n 'You must enable at least one token to perform transactions. Without any enabled tokens, you will not be able to pay for gas fees.' as any,\n )}\n </AlertDescription>\n </Alert>\n )}\n\n {/* Token Priority List */}\n <VStack w=\"full\" align=\"start\" spacing={3}>\n <Text\n fontSize=\"md\"\n fontWeight=\"semibold\"\n color={textPrimary}\n >\n {t('Token Priority Order')}\n </Text>\n <Text fontSize=\"sm\" color={textSecondary}>\n {t(\n 'Drag to reorder. The system will automatically use the highest priority token with sufficient balance.',\n )}\n </Text>\n\n <GasTokenDragList\n tokens={preferences.tokenPriority}\n excludedTokens={preferences.excludedTokens}\n onReorder={handleReorder}\n onToggleExclusion={toggleTokenExclusion}\n />\n </VStack>\n </VStack>\n </ModalBody>\n </ScrollToTopWrapper>\n );\n};\n","'use client';\n\n// Use static import to ensure we use the same module instance as LazyPrivyProvider\n// This avoids ESM/CJS interop issues that can occur with require() in bundled contexts\nimport { useMfaEnrollment } from '@privy-io/react-auth';\nimport { useVeChainKitConfig } from '../../../providers/VeChainKitContext';\n\n/**\n * Type for the optional MFA enrollment hook return value.\n */\nexport type UseOptionalMfaEnrollmentReturnType = {\n showMfaEnrollmentModal: () => void;\n};\n\n// Default return value when Privy is not available\nconst DEFAULT_MFA_ENROLLMENT_STATE: UseOptionalMfaEnrollmentReturnType = {\n showMfaEnrollmentModal: () => {\n console.warn(\n 'Privy is not configured. Add privy prop to VeChainKitProvider to enable MFA enrollment.',\n );\n },\n};\n\n/**\n * Optional hook to access Privy MFA enrollment.\n * Returns default values when Privy is not configured.\n *\n * Uses static import to ensure the same module instance as LazyPrivyProvider,\n * avoiding ESM/CJS interop issues that can occur with require().\n *\n * @returns MFA enrollment functions, or defaults if Privy is not configured\n */\nexport const useOptionalMfaEnrollment =\n (): UseOptionalMfaEnrollmentReturnType => {\n const config = useVeChainKitConfig();\n const isPrivyConfigured = !!config.privy;\n\n // Always call hooks unconditionally to satisfy React's rules of hooks\n let mfaResult: ReturnType<typeof useMfaEnrollment> | null = null;\n try {\n mfaResult = useMfaEnrollment();\n } catch {\n // Hook threw (no PrivyProvider in tree), will use defaults\n }\n\n // If Privy is not configured, return defaults immediately\n if (!isPrivyConfigured) {\n return DEFAULT_MFA_ENROLLMENT_STATE;\n }\n\n // Privy is configured, return actual values (or defaults if hook threw)\n if (!mfaResult) {\n return DEFAULT_MFA_ENROLLMENT_STATE;\n }\n\n return {\n showMfaEnrollmentModal:\n mfaResult.showMfaEnrollmentModal ?? (() => {}),\n };\n };\n","import {\n ModalBody,\n VStack,\n ModalFooter,\n ModalHeader,\n Box,\n ModalCloseButton,\n Text,\n useToken,\n} from '@chakra-ui/react';\nimport { useUpgradeRequired, useWallet } from '../../../../hooks';\n// Use optional hooks to handle missing PrivyProvider gracefully\nimport { useOptionalPrivy } from '../../../../hooks/api/privy/useOptionalPrivy';\nimport { useOptionalMfaEnrollment } from '../../../../hooks/api/privy/useOptionalMfaEnrollment';\nimport {\n LuChevronRight,\n LuCircleHelp,\n LuShield,\n LuLogOut,\n LuDollarSign,\n LuLanguages,\n LuFuel,\n LuLayoutGrid,\n LuUserCog,\n LuKey,\n LuShieldCheck,\n LuSettings2,\n LuFingerprint,\n} from 'react-icons/lu';\nimport { ActionButton } from '../../Components';\nimport { ModalBackButton, StickyHeaderContainer } from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { useTranslation } from 'react-i18next';\nimport { LuUnlink } from 'react-icons/lu';\nimport { useAccountModalOptions } from '../../../../hooks/modals/useAccountModalOptions';\n// Direct import to avoid circular dependency via providers barrel export\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\n\nexport type SettingsContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n onLogoutSuccess: () => void;\n};\n\nexport const SettingsContent = ({\n setCurrentContent,\n onLogoutSuccess,\n}: SettingsContentProps) => {\n const { t } = useTranslation();\n const { isolatedView } = useAccountModalOptions();\n\n const { exportWallet, linkPasskey } = useOptionalPrivy();\n const { showMfaEnrollmentModal } = useOptionalMfaEnrollment();\n\n const { feeDelegation } = useVeChainKitConfig();\n\n const { connection, disconnect, smartAccount, connectedWallet } =\n useWallet();\n\n const { data: upgradeRequired } = useUpgradeRequired(\n smartAccount?.address ?? '',\n connectedWallet?.address ?? '',\n 3,\n );\n\n const handleUpgradeSmartAccountClick = () => {\n setCurrentContent({\n type: 'upgrade-smart-account',\n props: {\n setCurrentContent,\n initialContent: 'settings',\n },\n });\n };\n\n const handleConnectionDetails = () => {\n setCurrentContent('connection-details');\n };\n\n const handleLogout = () => {\n disconnect();\n onLogoutSuccess();\n };\n\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n\n const handleCurrencyClick = () => {\n setCurrentContent('change-currency');\n };\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{t('Settings')}</ModalHeader>\n\n {!isolatedView && (\n <ModalBackButton\n onClick={() => setCurrentContent('profile')}\n />\n )}\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody w={'full'}>\n <VStack w={'full'} spacing={2}>\n <Text\n fontSize={'sm'}\n fontWeight={'bold'}\n color={textSecondary}\n textAlign={'left'}\n w={'full'}\n >\n {t('General')}\n </Text>\n\n <ActionButton\n title={t('Currency')}\n onClick={handleCurrencyClick}\n leftIcon={LuDollarSign}\n rightIcon={LuChevronRight}\n />\n\n <ActionButton\n title={t('Language')}\n onClick={() => {\n setCurrentContent('change-language');\n }}\n leftIcon={LuLanguages}\n rightIcon={LuChevronRight}\n />\n\n {connection.isConnectedWithPrivy &&\n !feeDelegation?.delegatorUrl && (\n <ActionButton\n title={t('Gas Token Preferences')}\n onClick={() => {\n setCurrentContent('gas-token-settings');\n }}\n leftIcon={LuFuel}\n rightIcon={LuChevronRight}\n />\n )}\n\n <ActionButton\n title={t('Terms and Policies')}\n onClick={() => {\n setCurrentContent({\n type: 'terms-and-privacy',\n props: {\n onGoBack: () =>\n setCurrentContent('settings'),\n },\n });\n }}\n leftIcon={LuShield}\n rightIcon={LuChevronRight}\n />\n\n <ActionButton\n title={t('Logout')}\n onClick={() =>\n setCurrentContent({\n type: 'disconnect-confirm',\n props: {\n onDisconnect: handleLogout,\n onBack: () => setCurrentContent('settings'),\n },\n })\n }\n leftIcon={LuLogOut}\n />\n </VStack>\n\n {upgradeRequired && (\n <VStack w={'full'} spacing={2} mt={4}>\n <ActionButton\n title={t('Upgrade Smart Account to V3')}\n description={t(\n 'A new version is available for your account',\n )}\n onClick={handleUpgradeSmartAccountClick}\n leftIcon={LuSettings2}\n extraContent={\n <Box\n minWidth=\"8px\"\n height=\"8px\"\n bg=\"red.500\"\n borderRadius=\"full\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n ml={2}\n />\n }\n />\n </VStack>\n )}\n\n {connection.isConnectedWithSocialLogin && (\n <VStack w={'full'} spacing={2} mt={4}>\n <Text\n fontSize={'sm'}\n fontWeight={'bold'}\n color={textSecondary}\n textAlign={'left'}\n w={'full'}\n >\n {t('Access and security')}\n </Text>\n <ActionButton\n title={t('Passkey')}\n onClick={() => linkPasskey()}\n leftIcon={LuFingerprint}\n />\n\n <ActionButton\n title={t('Backup')}\n onClick={() => {\n exportWallet();\n }}\n leftIcon={LuKey}\n />\n\n <ActionButton\n title={t('Manage MFA')}\n onClick={() => {\n showMfaEnrollmentModal();\n }}\n leftIcon={LuShieldCheck}\n />\n\n <ActionButton\n title={t('Login methods')}\n onClick={() => {\n setCurrentContent('privy-linked-accounts');\n }}\n leftIcon={LuUserCog}\n rightIcon={LuChevronRight}\n />\n </VStack>\n )}\n\n <VStack w={'full'} spacing={2} mt={4}>\n <Text\n fontSize={'sm'}\n fontWeight={'bold'}\n color={textSecondary}\n textAlign={'left'}\n w={'full'}\n >\n {t('Help')}\n </Text>\n\n <ActionButton\n title={t('Connection details')}\n onClick={handleConnectionDetails}\n leftIcon={LuUnlink}\n rightIcon={LuChevronRight}\n />\n\n <ActionButton\n title={t('Explore ecosystem')}\n onClick={() => setCurrentContent('ecosystem')}\n leftIcon={LuLayoutGrid}\n rightIcon={LuChevronRight}\n />\n\n <ActionButton\n title={t('Frequently asked questions')}\n onClick={() =>\n setCurrentContent({\n type: 'faq',\n props: {\n onGoBack: () =>\n setCurrentContent('settings'),\n showLanguageSelector: false,\n },\n })\n }\n leftIcon={LuCircleHelp}\n rightIcon={LuChevronRight}\n />\n </VStack>\n </ModalBody>\n <ModalFooter p={0} />\n </>\n );\n};\n","import { VStack, Icon, Text, useToken } from '@chakra-ui/react';\nimport { ElementType } from 'react';\n\ntype Props = {\n title: string;\n description?: string;\n icon: ElementType;\n};\n\nexport const EmptyContent = ({ title, description, icon }: Props) => {\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n\n return (\n <VStack spacing={6} align=\"center\" py={8}>\n <Icon as={icon} boxSize={16} color={textSecondary} />\n <VStack spacing={2}>\n <Text\n fontSize=\"lg\"\n fontWeight=\"500\"\n textAlign=\"center\"\n color={textPrimary}\n >\n {title}\n </Text>\n <Text\n fontSize=\"md\"\n color={textSecondary}\n textAlign=\"center\"\n px={4}\n >\n {description}\n </Text>\n </VStack>\n </VStack>\n );\n};\n","export const formatDate = (timestamp: number, locale: string = 'en-US') => {\n //Return intl (Eg. Sep 15)\n\n return new Intl.DateTimeFormat(locale, {\n month: 'short',\n day: 'numeric',\n }).format(new Date(timestamp));\n};\n","import type { LegalDocumentAgreement } from '../../../../types';\nimport { LegalDocumentSource, LegalDocumentType } from '../../../../types';\nimport { formatDate } from '../../../../utils/dateUtils';\nimport { HStack, Tag, Text, useToken } from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\n\nexport const AcceptedPolicyItem = ({\n document,\n}: {\n document: LegalDocumentAgreement;\n}) => {\n const { t } = useTranslation();\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const isVechainKitTerms =\n document.documentSource === LegalDocumentSource.VECHAIN_KIT &&\n document.documentType === LegalDocumentType.TERMS;\n return (\n <HStack>\n <Tag size=\"sm\" borderRadius=\"full\" color={textSecondary}>\n v{document.version}\n </Tag>\n <Text\n fontSize=\"xs\"\n cursor=\"pointer\"\n color={textSecondary}\n onClick={() => {\n window.open(document.url, '_blank');\n }}\n _hover={{\n textDecoration: 'underline',\n }}\n >\n {isVechainKitTerms\n ? t(\"'{{policyName}}' on connect\", {\n policyName:\n document.displayName ?? t('Vechain Kit Policy'),\n })\n : t(\"'{{policyName}}' on {{date}}\", {\n policyName: document.displayName ?? t('Policy'),\n date: formatDate(document.timestamp),\n })}\n </Text>\n </HStack>\n );\n};\n","import {\n AccordionButton,\n AccordionItem,\n AccordionPanel,\n Button,\n HStack,\n Icon,\n Text,\n useToken,\n VStack,\n} from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport { LuChevronDown, LuChevronUp, LuCheck } from 'react-icons/lu';\n\nimport type { EnrichedLegalDocument, LegalDocumentAgreement } from '../../../../types';\nimport { formatDate } from '../../../../utils/dateUtils';\nimport { AcceptedPolicyItem } from './AcceptedPolicyItem';\n\ntype PolicyAccordionProps = {\n title: string;\n description: string;\n documents: LegalDocumentAgreement[];\n bg: string;\n hoverBg: string;\n currentPolicy?: EnrichedLegalDocument | undefined;\n};\n\nexport const PolicyAccordion = ({\n title,\n description,\n documents,\n bg,\n hoverBg,\n currentPolicy,\n}: PolicyAccordionProps) => {\n const { t } = useTranslation();\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n\n const hasDocuments = documents?.length > 0;\n\n const currentPolicyAgreement = documents?.find(\n (document) => document.id === currentPolicy?.id,\n );\n\n if (!hasDocuments) return null;\n\n return (\n <AccordionItem border=\"none\" mb={3}>\n {({ isExpanded }) => (\n <>\n <AccordionButton\n bg={bg}\n borderRadius=\"xl\"\n _hover={{\n bg: hoverBg,\n }}\n >\n <VStack w=\"full\" align=\"flex-start\" textAlign=\"left\">\n <Text fontWeight=\"700\" color={textPrimary}>\n {title}\n </Text>\n <Text fontSize=\"xs\" color={textSecondary}>\n {description}\n </Text>\n </VStack>\n <Icon\n as={isExpanded ? LuChevronUp : LuChevronDown}\n fontSize=\"20px\"\n color={textSecondary}\n />\n </AccordionButton>\n <AccordionPanel pb={4} pt={3}>\n <VStack align=\"stretch\" spacing={4}>\n {currentPolicyAgreement?.id ? (\n <HStack w=\"full\">\n <Icon as={LuCheck} color={textPrimary} />\n <Text fontSize=\"xs\" color={textSecondary}>\n {t(\n 'You accepted current policy on {{date}}',\n {\n date: formatDate(\n currentPolicyAgreement.timestamp,\n ),\n },\n )}\n </Text>\n </HStack>\n ) : null}\n\n <HStack w=\"full\" textAlign=\"left\">\n <Text\n fontSize=\"xs\"\n fontWeight=\"bold\"\n color={textSecondary}\n >\n {t('All policies you have accepted')}\n </Text>\n </HStack>\n\n <HStack w=\"full\" gap={2}>\n <VStack align=\"stretch\" spacing={2}>\n {documents.map((document) => (\n <AcceptedPolicyItem\n key={document.id}\n document={document}\n />\n ))}\n </VStack>\n </HStack>\n\n {currentPolicy && (\n <Button\n variant=\"outline\"\n size=\"xs\"\n alignSelf=\"flex-end\"\n onClick={() => {\n window.open(\n currentPolicy.url,\n '_blank',\n );\n }}\n >\n {t('View Current Policy')}\n </Button>\n )}\n </VStack>\n </AccordionPanel>\n </>\n )}\n </AccordionItem>\n );\n};\n","import { EmptyContent } from '../../../common/EmptyContent';\nimport { useWallet } from '../../../../hooks';\n// Import from specific provider files to avoid circular dependency with providers barrel\nimport { useLegalDocuments } from '../../../../providers/LegalDocumentsProvider';\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\nimport type { LegalDocumentAgreement } from '../../../../types';\nimport { LegalDocumentSource, LegalDocumentType } from '../../../../types';\nimport { compareAddresses, VECHAIN_KIT_TERMS_CONFIG } from '../../../../utils';\nimport { Accordion, VStack } from '@chakra-ui/react';\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { LuGavel } from 'react-icons/lu';\n\nimport { PolicyAccordion } from './PolicyAccordion';\n\nexport const TermsAndPrivacyAccordion = () => {\n const { account } = useWallet();\n const { t } = useTranslation();\n const { darkMode: isDark } = useVeChainKitConfig();\n const { agreements, documents } = useLegalDocuments();\n\n const agreementsByDocumentType = useMemo(() => {\n const userAgreements = agreements?.filter((agreement) =>\n compareAddresses(agreement.walletAddress, account?.address),\n );\n const vechainKitDefaultTerms: LegalDocumentAgreement = {\n id: 'vechain-kit-terms',\n ...VECHAIN_KIT_TERMS_CONFIG,\n documentType: LegalDocumentType.TERMS,\n documentSource: LegalDocumentSource.VECHAIN_KIT,\n walletAddress: account?.address ?? '',\n timestamp: new Date().getTime(),\n };\n\n const userAgreementsWithVechainKitTerms = [\n vechainKitDefaultTerms,\n ...userAgreements,\n ];\n\n return userAgreementsWithVechainKitTerms?.reduce((acc, agreement) => {\n acc[agreement.documentType] = [\n ...(acc[agreement.documentType] || []),\n agreement,\n ];\n return acc;\n }, {} as Record<LegalDocumentType, LegalDocumentAgreement[]>);\n }, [agreements, account?.address]);\n\n const latestDocumentsByType = useMemo(() => {\n return documents.reduce((acc, document) => {\n const docType = document.documentType;\n if (!acc[docType] || document.version > acc[docType].version) {\n acc[docType] = document;\n }\n return acc;\n }, {} as Record<LegalDocumentType, (typeof documents)[0]>);\n }, [documents]);\n\n const hasAgreements = useMemo(() => {\n return Object.values(agreementsByDocumentType).some(\n (agreements) => agreements.length > 0,\n );\n }, [agreementsByDocumentType]);\n\n const accordionBg = isDark ? 'whiteAlpha.50' : 'blackAlpha.50';\n const accordionHoverBg = isDark ? 'whiteAlpha.100' : 'blackAlpha.100';\n\n const defaultOpenIndices = useMemo(() => {\n const indices: number[] = [];\n\n if (agreementsByDocumentType[LegalDocumentType.TERMS]?.length > 0) {\n indices.push(0);\n }\n if (agreementsByDocumentType[LegalDocumentType.PRIVACY]?.length > 0) {\n indices.push(1);\n }\n if (agreementsByDocumentType[LegalDocumentType.COOKIES]?.length > 0) {\n indices.push(2);\n }\n\n return indices;\n }, [agreementsByDocumentType]);\n\n if (!hasAgreements) {\n return (\n <EmptyContent\n title={t('No policies accepted')}\n description={t(\n 'When you have accepted a policy, it will appear here',\n )}\n icon={LuGavel}\n />\n );\n }\n\n return (\n <VStack spacing={4} align=\"stretch\">\n <Accordion allowMultiple defaultIndex={defaultOpenIndices}>\n <PolicyAccordion\n title={t('Terms and Conditions')}\n description={t(\n 'Legal agreement between you, Vechain Kit and the current app, outlining the rules for using wallet services.',\n )}\n documents={\n agreementsByDocumentType[LegalDocumentType.TERMS]\n }\n bg={accordionBg}\n hoverBg={accordionHoverBg}\n currentPolicy={\n latestDocumentsByType[LegalDocumentType.TERMS]\n }\n />\n\n <PolicyAccordion\n title={t('Privacy Policy')}\n description={t(\n 'Privacy policy outlining the data collection and processing practices.',\n )}\n documents={\n agreementsByDocumentType[LegalDocumentType.PRIVACY]\n }\n bg={accordionBg}\n hoverBg={accordionHoverBg}\n currentPolicy={\n latestDocumentsByType[LegalDocumentType.PRIVACY]\n }\n />\n\n <PolicyAccordion\n title={t('Cookie Policy')}\n description={t(\n 'Cookie policy outlining the use of cookies and tracking technologies.',\n )}\n documents={\n agreementsByDocumentType[LegalDocumentType.COOKIES]\n }\n bg={accordionBg}\n hoverBg={accordionHoverBg}\n currentPolicy={\n latestDocumentsByType[LegalDocumentType.COOKIES]\n }\n />\n </Accordion>\n </VStack>\n );\n};\n","import {\n ModalBackButton,\n ScrollToTopWrapper,\n StickyHeaderContainer,\n} from '../../../common';\nimport {\n ModalBody,\n ModalCloseButton,\n ModalFooter,\n ModalHeader,\n VStack,\n} from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\n\nimport { TermsAndPrivacyAccordion } from './TermsAndPrivacyAccordion';\n\nexport type TermsAndPrivacyContentProps = {\n onGoBack: () => void;\n};\n\nexport const TermsAndPrivacyContent = ({\n onGoBack,\n}: TermsAndPrivacyContentProps) => {\n const { t } = useTranslation();\n\n return (\n <ScrollToTopWrapper>\n <StickyHeaderContainer>\n <ModalHeader>{t('Terms and Policies')}</ModalHeader>\n <ModalBackButton onClick={onGoBack} />\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody w={'full'}>\n <VStack spacing={6} align=\"stretch\">\n <TermsAndPrivacyAccordion />\n </VStack>\n </ModalBody>\n <ModalFooter pt={0} />\n </ScrollToTopWrapper>\n );\n};\n","import {\n Card,\n CardBody,\n HStack,\n VStack,\n Text,\n IconButton,\n Icon,\n useToken,\n Box,\n} from '@chakra-ui/react';\nimport { AccountAvatar } from '../../../../common';\nimport { humanAddress, humanDomain } from '../../../../../utils';\nimport { useTotalBalance, useWalletMetadata } from '../../../../../hooks';\nimport { StoredWallet } from '../../../../../hooks/api/wallet/useWalletStorage';\nimport { LuTrash2, LuCheck } from 'react-icons/lu';\nimport { useTranslation } from 'react-i18next';\n// Direct import to avoid circular dependency via providers barrel export\nimport { useVeChainKitConfig } from '../../../../../providers/VeChainKitContext';\n\ntype Props = {\n wallet: StoredWallet;\n isActive: boolean;\n onSelect: () => void;\n onRemove: () => void;\n showRemove?: boolean;\n};\n\nexport const WalletCard = ({\n wallet,\n isActive,\n onSelect,\n onRemove,\n showRemove = true,\n}: Props) => {\n const { t } = useTranslation();\n const { network } = useVeChainKitConfig();\n const { formattedBalance, isLoading: isLoadingBalance } = useTotalBalance({\n address: wallet.address,\n });\n const {\n domain,\n image,\n isLoading: isLoadingMetadata,\n } = useWalletMetadata(wallet.address, network.type);\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const borderColor = useToken('colors', 'vechain-kit-border');\n\n const isLoading = isLoadingBalance || isLoadingMetadata;\n\n return (\n <Card\n variant=\"vechainKitWalletCard\"\n onClick={onSelect}\n borderWidth={isActive ? '2px' : '1px'}\n borderColor={isActive ? 'vechain-kit-primary' : borderColor}\n _hover={{\n borderColor: isActive\n ? 'vechain-kit-primary'\n : 'vechain-kit-text-secondary',\n }}\n >\n <CardBody p={4}>\n <HStack spacing={3} w=\"full\" justifyContent=\"space-between\">\n <HStack spacing={3} flex={1} minW={0}>\n <AccountAvatar\n wallet={{\n address: wallet.address,\n domain: domain ?? undefined,\n image: image ?? undefined,\n isLoadingMetadata,\n }}\n props={{ width: 10, height: 10 }}\n />\n <VStack\n spacing={0}\n alignItems=\"flex-start\"\n flex={1}\n minW={0}\n >\n <Text\n fontSize=\"sm\"\n fontWeight=\"medium\"\n color={textPrimary}\n noOfLines={1}\n >\n {domain\n ? humanDomain(domain, 22, 0)\n : humanAddress(wallet.address, 6, 4)}\n </Text>\n <Text\n fontSize=\"xs\"\n color={textSecondary}\n noOfLines={1}\n >\n {isLoading ? t('Loading...') : formattedBalance}\n </Text>\n </VStack>\n </HStack>\n {isActive && (\n <Box>\n <Icon\n as={LuCheck}\n boxSize={5}\n color=\"vechain-kit-primary\"\n />\n </Box>\n )}\n {showRemove && !isActive && (\n <IconButton\n aria-label={t('Remove wallet')}\n icon={<Icon as={LuTrash2} />}\n variant=\"vechainKitSecondary\"\n height=\"30px\"\n w=\"30px\"\n borderRadius=\"5px\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n />\n )}\n </HStack>\n </CardBody>\n </Card>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Button,\n Heading,\n useToken,\n ModalFooter,\n} from '@chakra-ui/react';\nimport { StickyHeaderContainer, ModalBackButton } from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { WalletCard } from './Components/WalletCard';\nimport { useSwitchWallet, useWallet, useRefreshBalances } from '../../../../hooks';\n// Use optional hooks to handle missing DAppKitProvider gracefully\nimport { useOptionalDAppKitWallet } from '../../../../hooks/api/dappkit/useOptionalDAppKitWallet';\nimport { useOptionalDAppKitWalletModal } from '../../../../hooks/api/dappkit/useOptionalDAppKitWalletModal';\nimport { useWalletStorage } from '../../../../hooks/api/wallet/useWalletStorage';\nimport { useAccountModalOptions } from '../../../../hooks';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { StoredWallet } from '../../../../hooks/api/wallet/useWalletStorage';\nimport { LuLogOut, LuPlus } from 'react-icons/lu';\nimport { useTranslation } from 'react-i18next';\nimport { simpleHash } from '../../../../utils';\n\nconst hashWallets = (wallets: StoredWallet[]): string => {\n const addresses = wallets\n .map((w) => w.address.toLowerCase())\n .sort()\n .join('|');\n return simpleHash(addresses);\n};\n\ntype Props = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n onClose: () => void;\n returnTo?: 'main' | 'profile';\n onLogoutSuccess?: () => void;\n};\n\nexport const SelectWalletContent = ({\n setCurrentContent,\n returnTo = 'main',\n onLogoutSuccess: _onLogoutSuccess,\n}: Props) => {\n const { t } = useTranslation();\n const { isolatedView } = useAccountModalOptions();\n const { account, disconnect } = useWallet();\n const { disconnect: dappKitDisconnect } = useOptionalDAppKitWallet();\n const { open: openDappKitModal } = useOptionalDAppKitWalletModal();\n const { getStoredWallets, setActiveWallet, removeWallet } =\n useSwitchWallet();\n const { saveWallet } = useWalletStorage();\n const { refresh } = useRefreshBalances();\n\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n\n const [wallets, setWallets] = useState(getStoredWallets());\n const walletsHashRef = useRef(hashWallets(getStoredWallets()));\n\n // Function to refresh wallets list\n const refreshWallets = useCallback(() => {\n const updatedWallets = getStoredWallets();\n setWallets(updatedWallets);\n walletsHashRef.current = hashWallets(updatedWallets);\n }, [getStoredWallets]);\n\n // Refresh wallets list when account changes (new wallet connected) or when wallets are updated\n useEffect(() => {\n refreshWallets();\n }, [refreshWallets, account?.address]);\n\n // Listen for wallet switch events to refresh the list\n useEffect(() => {\n const handleWalletSwitch = () => {\n // Small delay to ensure storage is updated\n setTimeout(() => {\n refreshWallets();\n }, 100);\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('wallet_switched', handleWalletSwitch);\n return () => {\n window.removeEventListener(\n 'wallet_switched',\n handleWalletSwitch,\n );\n };\n }\n }, [refreshWallets]);\n\n // Poll for wallet changes when modal is open to catch new wallets being added\n // This ensures we catch wallets added via dappkit modal even if account doesn't change immediately\n useEffect(() => {\n const interval = setInterval(() => {\n const currentWallets = getStoredWallets();\n const currentHash = hashWallets(currentWallets);\n\n // If wallet hash changed, refresh\n if (currentHash !== walletsHashRef.current) {\n refreshWallets();\n }\n }, 200); // Check every 200ms\n\n return () => clearInterval(interval);\n }, [getStoredWallets, refreshWallets]);\n\n // Always use the stored active wallet from cache\n // This is the wallet the user has selected as active\n const activeWalletAddress = useMemo(() => {\n const storedActive = wallets.find((w) => w.isActive);\n // Use stored active wallet if it exists\n if (storedActive) {\n return storedActive.address;\n }\n // Fallback to account address if no stored active wallet (new connection)\n return account?.address ?? null;\n }, [wallets, account?.address]);\n\n const activeWallet = useMemo(() => {\n return wallets.find(\n (w) =>\n w.address.toLowerCase() === activeWalletAddress?.toLowerCase(),\n );\n }, [wallets, activeWalletAddress]);\n\n const otherWallets = useMemo(() => {\n return wallets.filter(\n (w) =>\n w.address.toLowerCase() !== activeWalletAddress?.toLowerCase(),\n );\n }, [wallets, activeWalletAddress]);\n\n const handleWalletSelect = useCallback(\n (address: string) => {\n if (address.toLowerCase() === activeWalletAddress?.toLowerCase()) {\n return;\n }\n\n // Ensure the wallet that was previously active is saved\n // Metadata will be fetched dynamically when needed\n if (activeWallet) {\n saveWallet(activeWallet.address);\n }\n\n setActiveWallet(address);\n\n // Refresh wallets list immediately after switch\n setTimeout(() => {\n refreshWallets();\n }, 50);\n // Refresh balances after switching\n refresh();\n\n // Close modal and go back to the screen we came from\n // Pass feedback flag through content props\n setCurrentContent({\n type: returnTo,\n props: {\n switchFeedback: {\n showFeedback: true,\n },\n },\n });\n },\n [\n activeWalletAddress,\n activeWallet,\n account,\n setActiveWallet,\n refresh,\n setCurrentContent,\n refreshWallets,\n saveWallet,\n ],\n );\n\n const handleRemoveWallet = useCallback(\n (wallet: StoredWallet) => {\n const isActiveWallet =\n wallet.address.toLowerCase() ===\n activeWalletAddress?.toLowerCase();\n const remainingWallets = wallets.filter(\n (w) => w.address.toLowerCase() !== wallet.address.toLowerCase(),\n );\n\n // Navigate to remove wallet confirmation screen\n setCurrentContent({\n type: 'remove-wallet-confirm',\n props: {\n walletAddress: wallet.address,\n walletDomain: null, // Domain will be fetched dynamically in RemoveWalletConfirmContent\n onConfirm: async () => {\n // If removing the active wallet and there are other wallets, switch to the first one\n if (isActiveWallet && remainingWallets.length > 0) {\n const nextActiveWallet = remainingWallets[0];\n setActiveWallet(nextActiveWallet.address);\n } else if (\n isActiveWallet &&\n remainingWallets.length === 0\n ) {\n // If removing the last wallet, disconnect\n try {\n await dappKitDisconnect();\n } catch (error) {\n console.error('Error disconnecting:', error);\n }\n }\n\n removeWallet(wallet.address);\n\n // Refresh wallets list after removal\n setTimeout(() => {\n refreshWallets();\n }, 50);\n\n // If no wallets remain, close the modal\n if (remainingWallets.length === 0) {\n if (_onLogoutSuccess) {\n _onLogoutSuccess();\n }\n return;\n }\n\n // Go back to select wallet screen\n setCurrentContent({\n type: 'select-wallet',\n props: {\n setCurrentContent,\n onClose: () => {},\n returnTo,\n onLogoutSuccess: _onLogoutSuccess,\n },\n });\n },\n onBack: () => {\n setCurrentContent({\n type: 'select-wallet',\n props: {\n setCurrentContent,\n onClose: () => {},\n returnTo,\n onLogoutSuccess: _onLogoutSuccess,\n },\n });\n },\n },\n });\n },\n [\n removeWallet,\n refreshWallets,\n setCurrentContent,\n returnTo,\n _onLogoutSuccess,\n activeWalletAddress,\n wallets,\n setActiveWallet,\n dappKitDisconnect,\n ],\n );\n\n const handleAddNewWallet = useCallback(() => {\n openDappKitModal();\n }, [openDappKitModal]);\n\n const handleLogout = () => {\n disconnect();\n _onLogoutSuccess?.();\n };\n\n return (\n <>\n <StickyHeaderContainer>\n {!isolatedView && (\n <ModalBackButton\n onClick={() => {\n setCurrentContent(returnTo);\n }}\n />\n )}\n <ModalHeader>{t('Select Wallet')}</ModalHeader>\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody w={'full'}>\n <VStack w={'full'} spacing={4}>\n {activeWallet && (\n <VStack w={'full'} spacing={2} alignItems=\"flex-start\">\n <Heading size=\"sm\" color={textSecondary}>\n {t('Active Wallet')}\n </Heading>\n <WalletCard\n wallet={activeWallet}\n isActive={true}\n onSelect={() => {}}\n onRemove={() =>\n handleRemoveWallet(activeWallet)\n }\n showRemove={wallets.length > 1}\n />\n </VStack>\n )}\n\n {otherWallets.length > 0 && (\n <VStack w={'full'} spacing={2} alignItems=\"flex-start\">\n <Heading size=\"sm\" color={textSecondary}>\n {t('Other Wallets')}\n </Heading>\n {otherWallets.map((wallet) => (\n <WalletCard\n key={wallet.address}\n wallet={wallet}\n isActive={false}\n onSelect={() =>\n handleWalletSelect(wallet.address)\n }\n onRemove={() => handleRemoveWallet(wallet)}\n showRemove={true}\n />\n ))}\n </VStack>\n )}\n </VStack>\n </ModalBody>\n <ModalFooter w=\"full\">\n <VStack w=\"full\" spacing={2}>\n <Button\n w=\"full\"\n leftIcon={<LuPlus />}\n variant=\"vechainKitSecondary\"\n onClick={handleAddNewWallet}\n >\n {t('Add New Wallet')}\n </Button>\n <Button\n w=\"full\"\n leftIcon={<LuLogOut />}\n variant=\"vechainKitLogout\"\n onClick={() =>\n setCurrentContent({\n type: 'disconnect-confirm',\n props: {\n onDisconnect: handleLogout,\n onBack: () =>\n setCurrentContent({\n type: 'select-wallet',\n props: {\n setCurrentContent,\n onClose: () => {},\n returnTo: returnTo,\n onLogoutSuccess:\n _onLogoutSuccess,\n },\n }),\n },\n })\n }\n >\n {t('Logout')}\n </Button>\n </VStack>\n </ModalFooter>\n </>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Button,\n Text,\n useToken,\n Icon,\n ModalFooter,\n} from '@chakra-ui/react';\nimport { ModalBackButton, StickyHeaderContainer } from '../../../common';\nimport { useTranslation } from 'react-i18next';\nimport { LuTrash2 } from 'react-icons/lu';\nimport { humanAddress, humanDomain } from '../../../../utils';\nimport { useWalletMetadata } from '../../../../hooks';\n// Direct import to avoid circular dependency via providers barrel export\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\n\nexport type RemoveWalletConfirmContentProps = {\n walletAddress: string;\n walletDomain: string | null; // Kept for backward compatibility but will be fetched dynamically\n onConfirm: () => void;\n onBack: () => void;\n onClose?: () => void;\n};\n\nexport const RemoveWalletConfirmContent = ({\n walletAddress,\n walletDomain: _walletDomain,\n onConfirm,\n onBack,\n onClose,\n}: RemoveWalletConfirmContentProps) => {\n const { t } = useTranslation();\n const { network } = useVeChainKitConfig();\n const { domain } = useWalletMetadata(walletAddress, network.type);\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n\n const displayName = domain\n ? humanDomain(domain, 20, 0)\n : humanAddress(walletAddress, 6, 4);\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{t('Remove')}</ModalHeader>\n <ModalBackButton onClick={onBack} />\n {onClose && <ModalCloseButton onClick={onClose} />}\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack spacing={6} align=\"center\" mt={10}>\n <Icon\n as={LuTrash2}\n color={'#ef4444'}\n fontSize={'60px'}\n opacity={0.5}\n />\n <Text fontSize=\"md\" textAlign=\"center\" color={textPrimary}>\n {t('Are you sure you want to remove this wallet?')}\n </Text>\n <Text\n fontSize=\"sm\"\n textAlign=\"center\"\n color=\"vechain-kit-text-secondary\"\n fontWeight=\"600\"\n >\n {displayName}\n </Text>\n <Text\n fontSize=\"sm\"\n textAlign=\"center\"\n color=\"vechain-kit-text-secondary\"\n >\n {humanAddress(walletAddress, 8, 7)}\n </Text>\n </VStack>\n </ModalBody>\n <ModalFooter w=\"full\" mt={4}>\n <VStack spacing={3} w=\"full\">\n <Button\n onClick={onConfirm}\n data-testid=\"remove-wallet-button\"\n variant=\"vechainKitLogout\"\n >\n {t('Remove')}\n </Button>\n <Button\n variant=\"vechainKitSecondary\"\n onClick={onBack}\n data-testid=\"cancel-remove-button\"\n >\n {t('Cancel')}\n </Button>\n </VStack>\n </ModalFooter>\n </>\n );\n};\n","import { getConfig } from '../../../../../config';\nimport {\n useFetchAppInfo,\n useWallet,\n useFetchPrivyStatus,\n useGetAccountVersion,\n} from '../../../../../hooks';\n// Direct import to avoid circular dependency via providers barrel export\nimport { useVeChainKitConfig } from '../../../../../providers/VeChainKitContext';\nimport {\n VStack,\n Text,\n Spinner,\n HStack,\n useToken,\n useClipboard,\n Icon,\n Divider,\n} from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport type { CrossAppConnectionCache } from '../../../../../types';\n// Use optional hook to handle missing DAppKitProvider gracefully\nimport { useOptionalDAppKitWallet } from '../../../../../hooks/api/dappkit/useOptionalDAppKitWallet';\nimport packageJson from '../../../../../../package.json';\nimport { humanAddress } from '../../../../../utils';\nimport { LuCheck, LuCopy } from 'react-icons/lu';\n\n// Get DAppKit version from package.json (this is the version constraint, not the installed version)\nconst dappKitVersion =\n packageJson.dependencies?.['@vechain/dapp-kit-react'] ||\n packageJson.peerDependencies?.['@vechain/dapp-kit-react'] ||\n 'unknown';\n\n// Get Privy version from package.json\nconst privyVersion =\n packageJson.dependencies?.['@privy-io/react-auth'] || 'unknown';\n\ntype Props = {\n connectionCache?: CrossAppConnectionCache;\n};\n\nexport const ConnectionCard = ({ connectionCache }: Props) => {\n const { t } = useTranslation();\n const { connection, smartAccount, connectedWallet } = useWallet();\n const { source: sourceDappKit } = useOptionalDAppKitWallet();\n const { privy, network } = useVeChainKitConfig();\n\n const privyAppId = privy?.appId;\n const { data: appInfo, isLoading: isPrivyLoading } = useFetchAppInfo(\n privyAppId ? privyAppId : [],\n );\n\n const { onCopy, hasCopied } = useClipboard('');\n\n const { data: privyStatus, isLoading: isPrivyStatusLoading } =\n useFetchPrivyStatus();\n\n const { data: accountVersion, isLoading: isAccountVersionLoading } =\n useGetAccountVersion(\n smartAccount.address ?? '',\n connectedWallet?.address ?? '',\n );\n\n const cardBg = useToken('colors', 'vechain-kit-card');\n const textColorSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n\n const getConnectionName = (): string | null => {\n if (\n connection.isConnectedWithCrossApp &&\n connectionCache?.ecosystemApp\n ) {\n return connectionCache.ecosystemApp.name;\n }\n if (connection.isConnectedWithSocialLogin && appInfo) {\n const first = Object.values(appInfo)[0];\n return first?.name ?? null;\n }\n if (connection.isConnectedWithDappKit && sourceDappKit) {\n return sourceDappKit;\n }\n return null;\n };\n\n const connectionName = getConnectionName();\n const isLoading = connection.isConnectedWithSocialLogin && isPrivyLoading;\n\n const InfoRow = ({\n label,\n value,\n isLoading: isLoadingRow = false,\n href,\n }: {\n label: string;\n value: string | number;\n isLoading?: boolean;\n href?: string;\n }) => (\n <HStack w=\"full\" justifyContent=\"space-between\">\n <Text fontSize=\"sm\" color={textPrimary}>\n {label}:\n </Text>\n <Text\n fontSize=\"sm\"\n as={href ? 'a' : undefined}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ textDecoration: href ? 'underline' : 'none' }}\n color={textColorSecondary}\n >\n {isLoadingRow ? 'Loading...' : value}\n </Text>\n </HStack>\n );\n\n if (isLoading) {\n return (\n <VStack\n w=\"full\"\n h=\"full\"\n justify=\"center\"\n align=\"center\"\n minH=\"200px\"\n borderRadius={'xl'}\n bg={cardBg}\n >\n <Spinner />\n </VStack>\n );\n }\n\n if (!connectionName) {\n return null;\n }\n\n return (\n <VStack\n p={4}\n bg={cardBg}\n borderRadius={'xl'}\n spacing={4}\n w=\"full\"\n justifyContent=\"space-between\"\n >\n <InfoRow label={t('Logged in with')} value={connectionName} />\n\n {connection.isConnectedWithCrossApp &&\n connectionCache?.timestamp && (\n <InfoRow\n label={t('At')}\n value={new Date(\n connectionCache.timestamp,\n ).toLocaleString()}\n />\n )}\n\n <InfoRow\n label={t('Connection Type')}\n value={connection.source.type}\n isLoading={connection.isLoading}\n />\n\n <Divider />\n\n <InfoRow label={t('Network')} value={network.type} />\n <InfoRow\n label={t('Node URL')}\n value={network.nodeUrl || getConfig(network.type).nodeUrl}\n />\n\n {connection.isConnectedWithPrivy && <Divider />}\n\n {connection.isConnectedWithPrivy && (\n <HStack w=\"full\" justifyContent=\"space-between\">\n <Text fontSize=\"sm\" color={textPrimary}>\n {t('Embedded wallet')}:\n </Text>\n\n <HStack>\n <Text fontSize=\"sm\" color={textColorSecondary}>\n {connectedWallet?.address\n ? humanAddress(connectedWallet.address, 8, 7)\n : '-'}\n </Text>\n\n <Icon\n color={textColorSecondary}\n onClick={() => {\n if (connectedWallet?.address)\n onCopy(connectedWallet.address);\n }}\n opacity={connectedWallet?.address ? 1 : 0.4}\n pointerEvents={\n connectedWallet?.address ? 'auto' : 'none'\n }\n cursor=\"pointer\"\n as={hasCopied ? LuCheck : LuCopy}\n />\n </HStack>\n </HStack>\n )}\n\n {connection.isConnectedWithPrivy ? (\n <>\n <InfoRow\n label={t('Smart Account')}\n value={`v${accountVersion?.version ?? ''} ${\n accountVersion?.isDeployed ? '' : '(not deployed)'\n }`}\n isLoading={isAccountVersionLoading}\n />\n <InfoRow\n label={t('Privy Status')}\n value={privyStatus || ''}\n isLoading={isPrivyStatusLoading}\n />\n </>\n ) : (\n smartAccount.isDeployed && (\n <InfoRow\n label={t('Smart Account')}\n value={`v${accountVersion?.version ?? ''}`}\n isLoading={isAccountVersionLoading}\n />\n )\n )}\n\n <Divider />\n\n <InfoRow\n label={t('VeChain Kit')}\n value={packageJson.version}\n href={`https://github.com/vechain/vechain-kit/releases/tag/${packageJson.version}`}\n />\n\n <InfoRow label={'DAppKit'} value={dappKitVersion} />\n\n <InfoRow label={'Privy'} value={privyVersion} />\n </VStack>\n );\n};\n","import { PrivyLogo, VechainLogo } from '../../../../../assets';\nimport { useCrossAppConnectionCache, useWallet } from '../../../../../hooks';\n// Direct import to avoid circular dependency via providers barrel export\nimport { useVeChainKitConfig } from '../../../../../providers/VeChainKitContext';\nimport { HStack, Icon, Image, Text, VStack, useToken } from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport { LuMinus } from 'react-icons/lu';\n\nexport const WalletSecuredBy = () => {\n const { connection } = useWallet();\n const { t } = useTranslation();\n const { privy, darkMode: isDark } = useVeChainKitConfig();\n const { getConnectionCache } = useCrossAppConnectionCache();\n\n const connectionCache = getConnectionCache();\n const cardBg = useToken('colors', 'vechain-kit-card');\n\n if (!connection.isConnectedWithPrivy) {\n return null;\n }\n\n return (\n <VStack\n w={'full'}\n align=\"stretch\"\n textAlign={'center'}\n mt={5}\n p={3}\n borderRadius=\"lg\"\n bg={cardBg}\n shadow=\"sm\"\n >\n <Text fontSize={'xs'} fontWeight={'800'}>\n {t('Wallet secured by')}\n </Text>\n <HStack justify={'center'}>\n <PrivyLogo isDark={isDark} w={'50px'} />\n <Icon as={LuMinus} ml={3} />\n\n {connection.isConnectedWithVeChain ? (\n <VechainLogo\n isDark={isDark}\n w={'80px'}\n h={'auto'}\n mb={'3px'}\n />\n ) : (\n connection.isConnectedWithCrossApp &&\n connectionCache && (\n <Image\n src={connectionCache.ecosystemApp.logoUrl}\n alt={connectionCache.ecosystemApp.name}\n maxW=\"40px\"\n borderRadius=\"md\"\n />\n )\n )}\n\n {connection.isConnectedWithSocialLogin &&\n !connection.isConnectedWithVeChain && (\n <Image\n src={privy?.appearance.logo}\n alt={privy?.appearance.logo}\n maxW=\"40px\"\n borderRadius=\"md\"\n />\n )}\n </HStack>\n </VStack>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalFooter,\n ModalHeader,\n} from '@chakra-ui/react';\nimport {\n ModalBackButton,\n ScrollToTopWrapper,\n StickyHeaderContainer,\n} from '../../../common';\nimport { useTranslation } from 'react-i18next';\nimport { useCrossAppConnectionCache } from '../../../../hooks';\nimport { ConnectionCard, WalletSecuredBy } from './Components';\n\ntype Props = {\n onGoBack: () => void;\n};\n\nexport const ConnectionDetailsContent = ({ onGoBack }: Props) => {\n const { t } = useTranslation();\n const { getConnectionCache } = useCrossAppConnectionCache();\n\n const connectionCache = getConnectionCache() ?? undefined;\n\n return (\n <ScrollToTopWrapper>\n <StickyHeaderContainer>\n <ModalHeader>{t('Connection Details')}</ModalHeader>\n\n <ModalBackButton\n onClick={() => {\n onGoBack();\n }}\n />\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody w={'full'}>\n <ConnectionCard connectionCache={connectionCache} />\n <WalletSecuredBy />\n </ModalBody>\n <ModalFooter pt={0} />\n </ScrollToTopWrapper>\n );\n};\n","import { LinkedAccountWithMetadata, usePrivy } from '@privy-io/react-auth';\nimport {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Button,\n Flex,\n Text,\n Icon,\n ModalFooter,\n useToken,\n} from '@chakra-ui/react';\nimport { FcGoogle } from 'react-icons/fc';\nimport { SiFarcaster } from 'react-icons/si';\nimport {\n FaSpotify,\n FaApple,\n FaInstagram,\n FaTiktok,\n FaLinkedin,\n FaTelegram,\n FaDiscord,\n} from 'react-icons/fa';\nimport {\n LuMail,\n LuWallet,\n LuPhone,\n LuGithub,\n LuPlus,\n LuFingerprint,\n} from 'react-icons/lu';\nimport { FaXTwitter } from 'react-icons/fa6';\n// Import directly to avoid circular dependency with components barrel\nimport { ActionButton } from '../../Components/ActionButton';\nimport {\n ModalBackButton,\n ScrollToTopWrapper,\n StickyHeaderContainer,\n} from '../../../common';\nimport { useTranslation } from 'react-i18next';\nimport { useState, useMemo } from 'react';\n// Import from VeChainKitContext to avoid circular dependency with providers barrel\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\nimport { humanAddress } from '../../../../utils';\n\ntype ConfirmUnlinkProps = {\n accountType: string;\n accountDescription: string;\n isLoading: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nconst ConfirmUnlink = ({\n accountType,\n accountDescription,\n isLoading,\n onConfirm,\n onCancel,\n}: ConfirmUnlinkProps) => {\n const { t } = useTranslation();\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n\n return (\n <VStack spacing={6} align=\"stretch\">\n <Text fontSize=\"md\" textAlign=\"center\" color={textPrimary}>\n {t(\n 'Are you sure you want to unlink {{accountType}} as a login method linked to {{accountDescription}}?',\n {\n accountType,\n accountDescription,\n },\n )}\n </Text>\n\n <VStack spacing={3} w=\"full\">\n <Button\n height=\"60px\"\n colorScheme=\"red\"\n w=\"full\"\n onClick={onConfirm}\n isLoading={isLoading}\n >\n {t('Remove Login Method')}\n </Button>\n <Button\n isLoading={isLoading}\n height=\"60px\"\n w=\"full\"\n onClick={onCancel}\n >\n {t('Cancel')}\n </Button>\n </VStack>\n </VStack>\n );\n};\n\ntype PrivyLinkedAccountsProps = {\n onBack: () => void;\n};\n\nexport const PrivyLinkedAccounts = ({ onBack }: PrivyLinkedAccountsProps) => {\n const { t } = useTranslation();\n const { privy, dappKit } = useVeChainKitConfig();\n const [unlinkingAccount, setUnlinkingAccount] = useState<any>(null);\n const [showLinkOptions, setShowLinkOptions] = useState(false);\n const [showFullText, setShowFullText] = useState(false);\n const [isLoadingUnlink, setIsLoadingUnlink] = useState(false);\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n\n const {\n user,\n linkEmail,\n linkGoogle,\n linkTwitter,\n linkPhone,\n linkSpotify,\n linkApple,\n linkInstagram,\n linkTiktok,\n linkGithub,\n linkLinkedIn,\n linkTelegram,\n linkFarcaster,\n linkPasskey,\n linkDiscord,\n unlinkEmail,\n unlinkGoogle,\n unlinkApple,\n unlinkSpotify,\n unlinkInstagram,\n unlinkTiktok,\n unlinkGithub,\n unlinkLinkedIn,\n unlinkTelegram,\n unlinkFarcaster,\n unlinkPhone,\n unlinkPasskey,\n unlinkDiscord,\n linkWallet,\n } = usePrivy();\n\n const canLinkWallets = useMemo(() => {\n const privyWallets =\n privy?.loginMethods?.filter((method) =>\n [\n 'rabby_wallet',\n 'coinbase_wallet',\n 'rainbow',\n 'phantom',\n 'metamask',\n ].includes(method),\n ) ?? [];\n\n const dappKitWallets = dappKit?.allowedWallets ?? [];\n\n return privyWallets.length > 0 || dappKitWallets.length > 0;\n }, [privy?.loginMethods, dappKit?.allowedWallets]);\n\n const getAccountIcon = (type: string) => {\n switch (type) {\n case 'google_oauth':\n return FcGoogle;\n case 'email':\n return LuMail;\n case 'passkey':\n return LuFingerprint;\n case 'wallet':\n return LuWallet;\n case 'twitter_oauth':\n return FaXTwitter;\n case 'phone':\n return LuPhone;\n case 'spotify_oauth':\n return FaSpotify;\n case 'apple_oauth':\n return FaApple;\n case 'instagram_oauth':\n return FaInstagram;\n case 'tiktok_oauth':\n return FaTiktok;\n case 'github_oauth':\n return LuGithub;\n case 'linkedin_oauth':\n return FaLinkedin;\n case 'telegram':\n return FaTelegram;\n case 'farcaster':\n return SiFarcaster;\n case 'discord_oauth':\n return FaDiscord;\n default:\n return undefined;\n }\n };\n\n const canUnlink = () => {\n // the embedded wallet is always in this list, so we need to exclude it\n const linkedAccountsExcludingWallet = user?.linkedAccounts?.filter(\n (account) =>\n account.type !== 'wallet' ||\n (account.type === 'wallet' &&\n account.connectorType !== 'embedded'),\n );\n return (\n linkedAccountsExcludingWallet &&\n linkedAccountsExcludingWallet?.length > 1\n );\n };\n\n const handleUnlink = async (account: any) => {\n if (!canUnlink()) return;\n\n setIsLoadingUnlink(true);\n\n try {\n switch (account.type) {\n case 'google_oauth':\n await unlinkGoogle(account.subject);\n break;\n case 'email':\n await unlinkEmail(account.address);\n break;\n case 'passkey':\n await unlinkPasskey(account.subject);\n break;\n case 'phone':\n await unlinkPhone(account.number);\n break;\n case 'spotify_oauth':\n await unlinkSpotify(account.subject);\n break;\n case 'apple_oauth':\n await unlinkApple(account.subject);\n break;\n case 'instagram_oauth':\n await unlinkInstagram(account.subject);\n break;\n case 'tiktok_oauth':\n await unlinkTiktok(account.subject);\n break;\n case 'github_oauth':\n await unlinkGithub(account.subject);\n break;\n case 'linkedin_oauth':\n await unlinkLinkedIn(account.subject);\n break;\n case 'telegram':\n await unlinkTelegram(account.subject);\n break;\n case 'farcaster':\n await unlinkFarcaster(account.subject);\n break;\n case 'discord_oauth':\n await unlinkDiscord(account.subject);\n break;\n default:\n break;\n }\n } catch (error) {\n console.error(error);\n } finally {\n setIsLoadingUnlink(false);\n setUnlinkingAccount(null);\n }\n };\n\n const getAccountDescription = (account: LinkedAccountWithMetadata) => {\n switch (account.type) {\n case 'google_oauth':\n return account.email;\n case 'email':\n return account.address;\n case 'passkey':\n return `${account.authenticatorName} - ${account.createdWithBrowser}`;\n case 'phone':\n return account.number;\n case 'wallet':\n return `${humanAddress(account.address)} - ${\n account.walletClientType\n }`;\n default:\n return '';\n }\n };\n\n const linkedAccountTypes =\n user?.linkedAccounts?.map((account) => account.type) || [];\n const availableLoginMethods = privy?.loginMethods || [];\n\n const canLinkGoogle =\n !linkedAccountTypes.includes('google_oauth') &&\n availableLoginMethods.includes('google');\n const canLinkEmail =\n !linkedAccountTypes.includes('email') &&\n availableLoginMethods.includes('email');\n const canLinkTwitter =\n !linkedAccountTypes.includes('twitter_oauth') &&\n availableLoginMethods.includes('twitter');\n const canLinkSms =\n !linkedAccountTypes.includes('phone') &&\n availableLoginMethods.includes('sms');\n const canLinkSpotify =\n !linkedAccountTypes.includes('spotify_oauth') &&\n availableLoginMethods.includes('spotify');\n const canLinkApple =\n !linkedAccountTypes.includes('apple_oauth') &&\n availableLoginMethods.includes('apple');\n const canLinkInstagram =\n !linkedAccountTypes.includes('instagram_oauth') &&\n availableLoginMethods.includes('instagram');\n const canLinkTiktok =\n !linkedAccountTypes.includes('tiktok_oauth') &&\n availableLoginMethods.includes('tiktok');\n const canLinkGithub =\n !linkedAccountTypes.includes('github_oauth') &&\n availableLoginMethods.includes('github');\n const canLinkLinkedin =\n !linkedAccountTypes.includes('linkedin_oauth') &&\n availableLoginMethods.includes('linkedin');\n const canLinkTelegram =\n !linkedAccountTypes.includes('telegram') &&\n availableLoginMethods.includes('telegram');\n const canLinkFarcaster =\n !linkedAccountTypes.includes('farcaster') &&\n availableLoginMethods.includes('farcaster');\n const canLinkDiscord =\n !linkedAccountTypes.includes('discord_oauth') &&\n availableLoginMethods.includes('discord');\n\n if (showLinkOptions) {\n return (\n <ScrollToTopWrapper>\n <StickyHeaderContainer>\n <ModalHeader>\n {t('Select Additional Login Method')}\n </ModalHeader>\n <ModalBackButton\n onClick={() => setShowLinkOptions(false)}\n />\n <ModalCloseButton />\n </StickyHeaderContainer>\n <ModalBody w=\"full\">\n <VStack spacing={3} align=\"stretch\" w=\"full\">\n <ActionButton\n title={t('Set up Passkey')}\n description={t(\n 'Set up a passkey for easier access',\n )}\n onClick={() => linkPasskey()}\n leftIcon={LuFingerprint}\n />\n\n {canLinkGoogle && (\n <ActionButton\n title={t('Link Google Account')}\n description={t(\n 'Connect your Google account for easier access',\n )}\n onClick={() => linkGoogle()}\n leftIcon={FcGoogle}\n />\n )}\n {canLinkEmail && (\n <ActionButton\n title={t('Link Email Account')}\n description={t(\n 'Connect your email for easier access',\n )}\n onClick={() => linkEmail()}\n leftIcon={LuMail}\n stacked={true}\n />\n )}\n {canLinkTwitter && (\n <ActionButton\n title={t('Link Twitter Account')}\n description={t(\n 'Connect your Twitter account for easier access',\n )}\n onClick={() => linkTwitter()}\n leftIcon={FaXTwitter}\n />\n )}\n {canLinkSms && (\n <ActionButton\n title={t('Link Phone Number')}\n description={t(\n 'Connect your phone number for easier access',\n )}\n onClick={() => linkPhone()}\n leftIcon={LuPhone}\n />\n )}\n {canLinkSpotify && (\n <ActionButton\n title={t('Link Spotify Account')}\n description={t(\n 'Connect your Spotify account for easier access',\n )}\n onClick={() => linkSpotify()}\n leftIcon={FaSpotify}\n />\n )}\n {canLinkApple && (\n <ActionButton\n title={t('Link Apple Account')}\n description={t(\n 'Connect your Apple account for easier access',\n )}\n onClick={() => linkApple()}\n leftIcon={FaApple}\n />\n )}\n {canLinkInstagram && (\n <ActionButton\n title={t('Link Instagram Account')}\n description={t(\n 'Connect your Instagram account for easier access',\n )}\n onClick={() => linkInstagram()}\n leftIcon={FaInstagram}\n />\n )}\n {canLinkTiktok && (\n <ActionButton\n title={t('Link Tiktok Account')}\n description={t(\n 'Connect your Tiktok account for easier access',\n )}\n onClick={() => linkTiktok()}\n leftIcon={FaTiktok}\n />\n )}\n {canLinkGithub && (\n <ActionButton\n title={t('Link Github Account')}\n description={t(\n 'Connect your Github account for easier access',\n )}\n onClick={() => linkGithub()}\n leftIcon={LuGithub}\n />\n )}\n {canLinkLinkedin && (\n <ActionButton\n title={t('Link LinkedIn Account')}\n description={t(\n 'Connect your LinkedIn account for easier access',\n )}\n onClick={() => linkLinkedIn()}\n leftIcon={FaLinkedin}\n />\n )}\n {canLinkTelegram && (\n <ActionButton\n title={t('Link Telegram Account')}\n description={t(\n 'Connect your Telegram account for easier access',\n )}\n onClick={() => linkTelegram()}\n leftIcon={FaTelegram}\n />\n )}\n {canLinkFarcaster && (\n <ActionButton\n title={t('Link Farcaster Account')}\n description={t(\n 'Connect your Farcaster account for easier access',\n )}\n onClick={() => linkFarcaster()}\n leftIcon={SiFarcaster}\n />\n )}\n {canLinkDiscord && (\n <ActionButton\n title={t('Link Discord Account')}\n description={t(\n 'Connect your Discord account for easier access',\n )}\n onClick={() => linkDiscord()}\n leftIcon={FaDiscord}\n />\n )}\n {canLinkWallets && (\n <ActionButton\n title={t('Link External Wallet')}\n description={t(\n 'Connect an external wallet for easier access',\n )}\n onClick={() => linkWallet()}\n leftIcon={LuWallet}\n />\n )}\n {!canLinkGoogle &&\n !canLinkEmail &&\n !canLinkTwitter &&\n !canLinkSms &&\n !canLinkSpotify &&\n !canLinkApple &&\n !canLinkInstagram &&\n !canLinkTiktok &&\n !canLinkGithub &&\n !canLinkLinkedin &&\n !canLinkTelegram &&\n !canLinkFarcaster &&\n !canLinkDiscord && (\n <Text\n fontSize=\"sm\"\n textAlign=\"center\"\n opacity={0.7}\n >\n {t(\n 'No additional accounts available to link',\n )}\n </Text>\n )}\n </VStack>\n </ModalBody>\n <ModalFooter pt={0} />\n </ScrollToTopWrapper>\n );\n }\n\n if (unlinkingAccount) {\n return (\n <ScrollToTopWrapper>\n <StickyHeaderContainer>\n <ModalHeader>{t('Remove Login Method')}</ModalHeader>\n <ModalBackButton\n onClick={() => setUnlinkingAccount(null)}\n />\n <ModalCloseButton />\n </StickyHeaderContainer>\n <ModalBody>\n <ConfirmUnlink\n accountType={unlinkingAccount.type}\n accountDescription={getAccountDescription(\n unlinkingAccount,\n )}\n isLoading={isLoadingUnlink}\n onConfirm={() => handleUnlink(unlinkingAccount)}\n onCancel={() => setUnlinkingAccount(null)}\n />\n </ModalBody>\n <ModalFooter pt={0} />\n </ScrollToTopWrapper>\n );\n }\n\n return (\n <ScrollToTopWrapper>\n <StickyHeaderContainer>\n <ModalHeader>{t('Login methods')}</ModalHeader>\n <ModalBackButton onClick={onBack} />\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody w={'full'}>\n <VStack\n spacing={3}\n align=\"center\"\n w={'full'}\n justify={'center'}\n >\n <VStack\n spacing={1}\n justify={'flex-start'}\n alignItems=\"flex-start\"\n mb={5}\n textAlign=\"left\"\n w={'full'}\n >\n <Text fontSize=\"sm\" color={textSecondary}>\n {t(\n 'These accounts are linked to your embedded wallet and can be used to login to your wallet and access your private key.',\n )}\n </Text>\n {showFullText && (\n <Text fontSize=\"sm\" color={textSecondary}>\n {t(\n 'Adding more linked accounts increases security against loss of access, but also introduces additional potential attack vectors. For enhanced security, we recommend enabling MFA.',\n )}\n </Text>\n )}\n <Button\n variant=\"link\"\n mt={0}\n size=\"sm\"\n onClick={() => setShowFullText(!showFullText)}\n color={textPrimary}\n >\n {t(showFullText ? 'Show Less' : 'Read More')}\n </Button>\n </VStack>\n\n {user?.linkedAccounts\n ?.filter(\n (account) =>\n account.type !== 'wallet' ||\n (account.type === 'wallet' &&\n account.connectorType !== 'embedded'),\n )\n .map((account) => (\n <Flex\n key={account.type}\n p={4}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n align=\"center\"\n justify=\"space-between\"\n w={'full'}\n >\n <Flex align=\"center\" gap={3}>\n <Icon\n as={getAccountIcon(account.type)}\n color={textPrimary}\n />\n <VStack align=\"start\" spacing={0}>\n <Text\n fontWeight=\"500\"\n color={textPrimary}\n >\n {account.type === 'google_oauth'\n ? t('Google')\n : account.type === 'email'\n ? t('Email')\n : account.type === 'passkey'\n ? t('Passkey')\n : account.type ===\n 'twitter_oauth'\n ? t('Twitter')\n : account.type === 'phone'\n ? t('Phone Number')\n : account.type ===\n 'spotify_oauth'\n ? t('Spotify')\n : account.type === 'apple_oauth'\n ? t('Apple')\n : account.type ===\n 'instagram_oauth'\n ? t('Instagram')\n : account.type ===\n 'tiktok_oauth'\n ? t('Tiktok')\n : account.type ===\n 'github_oauth'\n ? t('Github')\n : account.type ===\n 'linkedin_oauth'\n ? t('LinkedIn')\n : account.type === 'telegram'\n ? t('Telegram')\n : account.type === 'farcaster'\n ? t('Farcaster')\n : account.type ===\n 'discord_oauth'\n ? t('Discord')\n : t('Wallet')}\n </Text>\n <Text\n fontSize=\"sm\"\n color={textSecondary}\n >\n {getAccountDescription(account)}\n </Text>\n </VStack>\n </Flex>\n\n <Button\n size=\"sm\"\n variant=\"ghost\"\n colorScheme=\"red\"\n isDisabled={!canUnlink()}\n onClick={() => {\n if (account.type === 'passkey') {\n linkPasskey();\n } else {\n setUnlinkingAccount(account);\n }\n }}\n >\n {t('Remove')}\n </Button>\n </Flex>\n ))}\n </VStack>\n </ModalBody>\n <ModalFooter w={'full'}>\n <Button\n w=\"full\"\n variant=\"vechainKitPrimary\"\n onClick={() => setShowLinkOptions(true)}\n leftIcon={<Icon as={LuPlus} />}\n isDisabled={\n !canLinkGoogle &&\n !canLinkEmail &&\n !canLinkTwitter &&\n !canLinkSms &&\n !canLinkSpotify &&\n !canLinkApple &&\n !canLinkInstagram &&\n !canLinkTiktok &&\n !canLinkGithub &&\n !canLinkLinkedin &&\n !canLinkTelegram &&\n !canLinkFarcaster &&\n !canLinkDiscord\n }\n >\n {t('Add Login Method')}\n </Button>\n </ModalFooter>\n </ScrollToTopWrapper>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { EmptyContent } from '../../../../common/EmptyContent';\nimport { LuBell, LuArchive } from 'react-icons/lu';\n\ntype Props = {\n showArchived: boolean;\n};\n\nexport const EmptyNotifications = ({ showArchived }: Props) => {\n const { t } = useTranslation();\n\n return (\n <EmptyContent\n title={\n showArchived\n ? t('No archived notifications')\n : t('No notifications')\n }\n description={\n showArchived\n ? t('Cleared notifications will appear here')\n : t('When you have notifications, they will appear here')\n }\n icon={showArchived ? LuArchive : LuBell}\n />\n );\n};\n","import {\n Alert,\n AlertIcon,\n Box,\n AlertDescription,\n IconButton,\n AlertTitle,\n} from '@chakra-ui/react';\nimport { LuCircleX } from 'react-icons/lu';\nimport { useTranslation } from 'react-i18next';\nimport { Notification } from '../../../../../hooks/notifications/types';\n\ntype Props = {\n notification: Notification;\n isArchiveView: boolean;\n onMarkAsRead: (id: string) => void;\n};\n\nexport const NotificationItem = ({\n notification,\n isArchiveView,\n onMarkAsRead,\n}: Props) => {\n const { t } = useTranslation();\n\n const handleDismiss = () => {\n onMarkAsRead(notification.id);\n };\n\n if (notification.isRead && !isArchiveView) {\n return null;\n }\n\n return (\n <Alert\n key={notification.id}\n status={notification.status}\n variant=\"subtle\"\n borderRadius={'lg'}\n pr={8}\n position=\"relative\"\n opacity={notification.isRead ? 0.7 : 1}\n cursor=\"pointer\"\n _hover={{ opacity: 0.8 }}\n data-testid=\"notification-item\"\n >\n <AlertIcon boxSize={'16px'} />\n <Box>\n <AlertTitle fontSize={'sm'} data-testid=\"notification-title\">\n {/* @ts-ignore */}\n {t(notification.title)}\n </AlertTitle>\n <AlertDescription fontSize={'xs'} lineHeight={'1.2'} data-testid=\"notification-text\">\n {/* @ts-ignore */}\n {t(notification.description)}\n </AlertDescription>\n </Box>\n {!isArchiveView && !notification.isRead && (\n <IconButton\n position=\"absolute\"\n right={1}\n top={1}\n size=\"sm\"\n variant=\"ghost\"\n icon={<LuCircleX />}\n onClick={(e) => {\n e.stopPropagation();\n handleDismiss();\n }}\n aria-label=\"Mark as read and archive\"\n data-testid=\"remove-notification-button\"\n />\n )}\n </Alert>\n );\n};\n","import {\n Container,\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Icon,\n ModalFooter,\n Button,\n HStack,\n} from '@chakra-ui/react';\nimport { LuBell, LuArchive } from 'react-icons/lu';\nimport {\n ModalBackButton,\n ScrollToTopWrapper,\n StickyHeaderContainer,\n} from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { useTranslation } from 'react-i18next';\nimport { useNotifications } from '../../../../hooks/notifications';\nimport { useState } from 'react';\nimport { EmptyNotifications } from './Components/EmptyNotifications';\nimport { NotificationItem } from './Components/NotificationItem';\nimport { useAccountModalOptions } from '../../../../hooks/modals/useAccountModalOptions';\n\ntype Props = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n};\n\nexport const NotificationsContent = ({ setCurrentContent }: Props) => {\n const { t } = useTranslation();\n const { isolatedView } = useAccountModalOptions();\n const {\n getNotifications,\n getArchivedNotifications,\n clearAllNotifications,\n markAsRead,\n } = useNotifications();\n const [isArchiveView, setIsArchiveView] = useState(false);\n const [notifications, setNotifications] = useState(getNotifications());\n const [archivedNotifications, setArchivedNotifications] = useState(\n getArchivedNotifications(),\n );\n\n const handleClearAll = () => {\n clearAllNotifications();\n setArchivedNotifications([...archivedNotifications, ...notifications]);\n setNotifications([]);\n };\n\n const handleMarkAsRead = (id: string) => {\n markAsRead(id);\n const notificationToArchive = notifications.find((n) => n.id === id);\n setNotifications(notifications.filter((n) => n.id !== id));\n if (notificationToArchive) {\n setArchivedNotifications([\n { ...notificationToArchive, isRead: true },\n ...archivedNotifications,\n ]);\n }\n };\n\n const handleToggleView = () => {\n setIsArchiveView(!isArchiveView);\n };\n\n const currentNotifications = isArchiveView\n ? archivedNotifications\n : notifications;\n\n // Sort notifications by date in descending order (newest first)\n const sortedNotifications = [...currentNotifications].sort((a, b) => {\n // Welcome notification always first\n if (a.id === 'welcome') return -1;\n if (b.id === 'welcome') return 1;\n\n // Smart account second\n if (a.id === 'smart-account') return -1;\n if (b.id === 'smart-account') return 1;\n\n // Multiclause third\n if (a.id === 'multiclause') return -1;\n if (b.id === 'multiclause') return 1;\n\n // All other notifications sorted by timestamp\n return b.timestamp - a.timestamp;\n });\n\n return (\n <ScrollToTopWrapper>\n <StickyHeaderContainer>\n {!isolatedView && (\n <ModalBackButton onClick={() => setCurrentContent('main')} />\n )}\n <ModalHeader data-testid=\"modal-title\">\n {isArchiveView\n ? t('Archived Notifications')\n : t('Notifications')}\n </ModalHeader>\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <Container h={['540px', 'auto']} p={0}>\n <ModalBody>\n <VStack spacing={4} align=\"stretch\" w=\"full\">\n <HStack justify=\"space-between\">\n <Button\n variant=\"ghost\"\n leftIcon={\n <Icon\n as={isArchiveView ? LuBell : LuArchive}\n />\n }\n size=\"sm\"\n onClick={handleToggleView}\n data-testid=\"toggle-view-button\"\n >\n {isArchiveView ? t('Current') : t('Archived')}\n </Button>\n {!isArchiveView && notifications.length > 0 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleClearAll}\n data-testid=\"clear-all-button\"\n >\n {t('Clear all')}\n </Button>\n )}\n </HStack>\n\n {currentNotifications.length === 0 ? (\n <EmptyNotifications showArchived={isArchiveView} />\n ) : (\n <VStack spacing={3}>\n {sortedNotifications.map((notification) => (\n <NotificationItem\n key={notification.id}\n notification={notification}\n isArchiveView={isArchiveView}\n onMarkAsRead={handleMarkAsRead}\n />\n ))}\n </VStack>\n )}\n </VStack>\n </ModalBody>\n <ModalFooter pt={0} />\n </Container>\n </ScrollToTopWrapper>\n );\n};\n","import { Tag, TagProps } from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport type { AllowedCategories } from '../../../../../types';\n\n// Re-export type for backwards compatibility\nexport type { AllowedCategories };\n\ntype CategoryProps = {\n category: AllowedCategories;\n} & Omit<TagProps, 'category'>;\n\nconst getCategoryColor = (category: AllowedCategories): string => {\n switch (category) {\n case 'defi':\n return 'blue';\n case 'games':\n return 'green';\n case 'collectibles':\n return 'purple';\n case 'marketplaces':\n return 'orange';\n case 'utilities':\n return 'cyan';\n default:\n return 'gray';\n }\n};\n\nexport const CategoryLabel = ({ category, ...props }: CategoryProps) => {\n const { t } = useTranslation();\n\n const categoryKey = category.toLowerCase() as AllowedCategories;\n const color = getCategoryColor(categoryKey);\n\n return (\n <Tag\n size=\"sm\"\n colorScheme={color}\n borderRadius=\"full\"\n px={2}\n {...props}\n >\n {t(categoryKey)}\n </Tag>\n );\n};\n","import { Card, CardBody, Image, Text, VStack, Box } from '@chakra-ui/react';\nimport { notFoundImage } from '../../../../../utils';\nimport { CategoryLabel, AllowedCategories } from './CategoryLabel';\n\nexport type SharedAppCardProps = {\n name?: string;\n imageUrl: string;\n linkUrl: string;\n category?: AllowedCategories;\n logoComponent?: JSX.Element;\n onClick: () => void;\n size?: 'sm' | 'md';\n};\n\nexport const SharedAppCard = ({\n name,\n imageUrl,\n logoComponent,\n category,\n onClick,\n size = 'md',\n}: SharedAppCardProps) => {\n return (\n <Card\n variant=\"vechainKitAppCard\"\n _hover={{ opacity: 0.8 }}\n cursor=\"pointer\"\n onClick={onClick}\n position=\"relative\"\n >\n {category && (\n <Box position=\"absolute\" top=\"2\" right=\"2\" zIndex=\"1\">\n <CategoryLabel category={category} />\n </Box>\n )}\n <CardBody p={size === 'sm' ? 2 : 4} alignItems=\"center\">\n <VStack spacing={2} h=\"100%\" justifyContent=\"space-between\">\n {logoComponent\n ? logoComponent\n : imageUrl && (\n <Image\n src={imageUrl}\n fallbackSrc={notFoundImage}\n alt={name}\n height=\"90px\"\n objectFit=\"contain\"\n rounded=\"full\"\n />\n )}\n {name && (\n <Text\n fontWeight=\"medium\"\n wordBreak=\"break-word\"\n noOfLines={1}\n textAlign=\"center\"\n w=\"full\"\n >\n {name}\n </Text>\n )}\n </VStack>\n </CardBody>\n </Card>\n );\n};\n","import { useIpfsImage, useXAppMetadata, XApp } from '../../../../../hooks';\nimport { SharedAppCard } from './SharedAppCard';\nimport { AccountModalContentTypes } from '../../../Types';\nimport { Skeleton } from '@chakra-ui/react';\nimport { CategoryFilter } from './CategoryFilterSection';\n\ntype Props = {\n xApp: XApp;\n selectedCategory?: CategoryFilter;\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n};\n\nexport const AppComponent = ({\n xApp,\n setCurrentContent,\n selectedCategory,\n}: Props) => {\n const { data: appMetadata, isLoading: appMetadataLoading } =\n useXAppMetadata(xApp.id);\n const { data: logo, isLoading: isLogoLoading } = useIpfsImage(\n appMetadata?.logo,\n );\n\n const handleAppClick = () => {\n if (appMetadata?.name) {\n setCurrentContent({\n type: 'app-overview',\n props: {\n name: appMetadata.name,\n image: logo?.image ?? '',\n url: appMetadata?.external_url ?? '',\n description: appMetadata?.description ?? '',\n category: 'vebetter',\n selectedCategory,\n setCurrentContent,\n },\n });\n }\n };\n\n return (\n <Skeleton\n isLoaded={!appMetadataLoading && !isLogoLoading}\n borderRadius=\"md\"\n height=\"100%\"\n >\n <SharedAppCard\n name={appMetadata?.name ?? ''}\n imageUrl={logo?.image ?? ''}\n linkUrl={appMetadata?.external_url ?? ''}\n category=\"vebetter\"\n onClick={handleAppClick}\n />\n </Skeleton>\n );\n};\n","import { AccountModalContentTypes } from '../../../Types';\nimport { SharedAppCard } from './SharedAppCard';\nimport { CategoryFilter } from './CategoryFilterSection';\nimport { AllowedCategories } from './CategoryLabel';\n\ntype Props = {\n name: string;\n image: string;\n url: string;\n description: string;\n category?: AllowedCategories;\n logoComponent?: JSX.Element;\n selectedCategory?: CategoryFilter;\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n};\n\nexport const CustomAppComponent = ({\n name,\n image,\n url,\n description,\n category,\n logoComponent,\n selectedCategory,\n setCurrentContent,\n}: Props) => {\n const handleAppClick = () => {\n setCurrentContent({\n type: 'app-overview',\n props: {\n name,\n image,\n url,\n description,\n category,\n logoComponent,\n selectedCategory,\n setCurrentContent,\n },\n });\n };\n\n return (\n <SharedAppCard\n name={name}\n imageUrl={image}\n linkUrl={url}\n category={category}\n onClick={handleAppClick}\n {...(logoComponent && { logoComponent })}\n />\n );\n};\n","import {\n Card,\n CardBody,\n Grid,\n GridItem,\n Image,\n Text,\n VStack,\n} from '@chakra-ui/react';\nimport { useEcosystemShortcuts } from '../../../../../hooks';\nimport { AccountModalContentTypes } from '../../../Types';\nimport { useTranslation } from 'react-i18next';\nimport { notFoundImage } from '../../../../../utils';\n\ntype Props = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n};\n\nexport const ShortcutsSection = ({}: Props) => {\n const { t } = useTranslation();\n const { shortcuts } = useEcosystemShortcuts();\n\n if (shortcuts.length === 0) return null;\n\n return (\n <VStack w=\"full\" align=\"flex-start\" spacing={2}>\n <Text fontSize=\"sm\" fontWeight=\"500\">\n {t('Shortcuts')}\n </Text>\n <Grid templateColumns=\"repeat(4, 1fr)\" gap={2} w=\"full\">\n {shortcuts.map((shortcut) => (\n <GridItem key={shortcut.url}>\n <Card\n _hover={{ opacity: 0.8 }}\n cursor=\"pointer\"\n onClick={() => window.open(shortcut.url, '_blank')}\n >\n <CardBody p={2} alignItems=\"center\">\n <Image\n src={shortcut.image}\n fallbackSrc={notFoundImage}\n alt={shortcut.name}\n objectFit=\"contain\"\n rounded=\"full\"\n />\n </CardBody>\n </Card>\n </GridItem>\n ))}\n </Grid>\n </VStack>\n );\n};\n","import { Box, Tag, Text, Wrap, WrapItem } from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport { CategoryLabel, AllowedCategories } from './CategoryLabel';\n\nexport type CategoryFilter = string | null;\n\ntype CategoryFilterSectionProps = {\n selectedCategory: CategoryFilter;\n onCategoryChange: (category: CategoryFilter) => void;\n categories: AllowedCategories[];\n darkMode: boolean;\n};\n\nexport const CategoryFilterSection = ({\n selectedCategory,\n onCategoryChange,\n categories,\n darkMode,\n}: CategoryFilterSectionProps) => {\n const { t } = useTranslation();\n\n return (\n <Box width=\"full\" mb={4}>\n <Text fontSize=\"sm\" fontWeight=\"500\" mb={2}>\n {t('Filter by category')}\n </Text>\n <Wrap spacing={2}>\n <WrapItem>\n <Tag\n size=\"md\"\n borderRadius=\"full\"\n variant={\n selectedCategory === null ? 'solid' : 'outline'\n }\n colorScheme={darkMode ? 'gray' : 'blackAlpha'}\n cursor=\"pointer\"\n onClick={() => onCategoryChange(null)}\n >\n {t('All')}\n </Tag>\n </WrapItem>\n\n {categories.map((category) => (\n <WrapItem key={category}>\n <CategoryLabel\n category={category}\n size=\"md\"\n variant={\n selectedCategory === category\n ? 'solid'\n : 'outline'\n }\n cursor=\"pointer\"\n onClick={() => onCategoryChange(category)}\n />\n </WrapItem>\n ))}\n </Wrap>\n </Box>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Input,\n InputGroup,\n InputLeftElement,\n Grid,\n GridItem,\n ModalFooter,\n Text,\n Spinner,\n Center,\n useToken,\n} from '@chakra-ui/react';\nimport { LuSearch } from 'react-icons/lu';\nimport { ModalBackButton, StickyHeaderContainer } from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { useTranslation } from 'react-i18next';\n// Direct import to avoid circular dependency via providers barrel export\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\nimport React, { useState, useMemo, useEffect } from 'react';\nimport {\n useCurrentAllocationsRoundId,\n useEcosystemShortcuts,\n useMostVotedAppsInRound,\n XAppMetadata,\n} from '../../../../hooks';\nimport { useAppHubApps, AppHubApp } from '../../../../hooks';\nimport { AppComponent } from './Components/AppComponent';\nimport { CustomAppComponent } from './Components/CustomAppComponent';\nimport { ShortcutsSection } from './Components/ShortcutsSection';\nimport {\n CategoryFilterSection,\n CategoryFilter,\n} from './Components/CategoryFilterSection';\nimport { AllowedCategories } from './Components/CategoryLabel';\nimport { useAccountModalOptions } from '../../../../hooks/modals/useAccountModalOptions';\nimport {\n VEBETTERDAO_GOVERNANCE_BASE_URL,\n VET_DOMAINS_BASE_URL,\n COINMARKETCAP_STATIC_BASE_URL,\n} from '../../../../constants';\n\nexport type EcosystemWithCategoryProps = {\n selectedCategory: CategoryFilter;\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n};\n\ntype Props = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n selectedCategory?: CategoryFilter;\n};\n\n// Mock data - Replace with real data from your API\nconst DEFAULT_APPS: XAppMetadata[] = [\n {\n name: 'VeBetterDAO',\n description: 'Engage, earn and prosper by doing sustainable actions.',\n external_url: VEBETTERDAO_GOVERNANCE_BASE_URL,\n logo: new URL(\n '/static/img/coins/64x64/33509.png',\n COINMARKETCAP_STATIC_BASE_URL,\n ).toString(),\n banner: new URL(\n '/static/img/icons/vbd.png',\n COINMARKETCAP_STATIC_BASE_URL,\n ).toString(),\n screenshots: [],\n social_urls: [],\n app_urls: [],\n tweets: [],\n ve_world: {\n banner: new URL(\n '/static/img/icons/vbd.png',\n COINMARKETCAP_STATIC_BASE_URL,\n ).toString(),\n },\n categories: [],\n },\n {\n name: 'vet.domains',\n description:\n '.vet.domains provides a unique and unchangeable identity for Vechain users by linking information to their wallet addresses. It becomes easier for people to use the blockchain by replacing complicated wallet addresses with easy-to-remember names.',\n external_url: VET_DOMAINS_BASE_URL,\n logo: new URL(\n '/assets/walletconnect.png',\n VET_DOMAINS_BASE_URL,\n ).toString(),\n banner: new URL(\n '/assets/walletconnect.png',\n VET_DOMAINS_BASE_URL,\n ).toString(),\n screenshots: [],\n social_urls: [],\n app_urls: [],\n tweets: [],\n ve_world: {\n banner: new URL(\n '/assets/walletconnect.png',\n VET_DOMAINS_BASE_URL,\n ).toString(),\n },\n categories: [],\n },\n];\n\nexport const ExploreEcosystemContent = ({\n setCurrentContent,\n selectedCategory,\n}: Props) => {\n const { t } = useTranslation();\n const { darkMode: isDark, network } = useVeChainKitConfig();\n const { isolatedView } = useAccountModalOptions();\n\n const textTertiary = useToken('colors', 'vechain-kit-text-tertiary');\n const [searchQuery, setSearchQuery] = useState('');\n\n // Initialize currentCategory with selectedCategory or null\n const [currentCategory, setCurrentCategory] = useState<CategoryFilter>(\n selectedCategory || null,\n );\n\n // Update currentCategory when selectedCategory changes\n useEffect(() => {\n if (selectedCategory !== undefined) {\n setCurrentCategory(selectedCategory);\n }\n }, [selectedCategory]);\n\n const { data: currentRoundId } = useCurrentAllocationsRoundId();\n const { data: vbdApps } = useMostVotedAppsInRound(\n currentRoundId ? (parseInt(currentRoundId) - 1).toString() : '1',\n );\n const {\n data: appHubApps,\n isLoading: appHubLoading,\n error: appHubError,\n } = useAppHubApps();\n\n // Extract unique categories from app hub apps and add VeBetter category\n const categories = useMemo(() => {\n const categorySet = new Set<AllowedCategories>();\n\n // Add VeBetter category if there are VBD apps and we're on mainnet\n if (network.type === 'main' && vbdApps && vbdApps.length > 0) {\n categorySet.add('vebetter');\n }\n\n // Add categories from app hub\n if (appHubApps) {\n appHubApps.forEach((app) => {\n if (app.category) {\n categorySet.add(app.category);\n }\n });\n }\n\n return Array.from(categorySet).sort();\n }, [appHubApps, vbdApps, network.type]);\n\n // Only show VBD apps if we're on mainnet\n const isMainnet = network.type === 'main';\n\n // Filter VeBetterDAO apps based on search query\n const filteredVbdApps = isMainnet\n ? vbdApps.filter((dapp) =>\n dapp.app.name.toLowerCase().includes(searchQuery.toLowerCase()),\n )\n : [];\n\n // Filter default apps based on search query\n const filteredDefaultApps = DEFAULT_APPS.filter((dapp) =>\n dapp.name.toLowerCase().includes(searchQuery.toLowerCase()),\n );\n\n // Filter App Hub apps based on search query and selected category\n const filteredAppHubApps =\n appHubApps?.filter(\n (app: AppHubApp) =>\n // Text search filter\n (app.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n app.description\n .toLowerCase()\n .includes(searchQuery.toLowerCase()) ||\n app.tags.some((tag: string) =>\n tag.toLowerCase().includes(searchQuery.toLowerCase()),\n )) &&\n // Category filter\n (currentCategory === null || app.category === currentCategory),\n ) || [];\n\n // Determine which apps to display based on category filter\n const shouldShowDefaultApps = currentCategory === null;\n const shouldShowVbdApps =\n currentCategory === null || currentCategory === 'vebetter';\n\n const { shortcuts } = useEcosystemShortcuts();\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e.target.value);\n };\n\n const handleCategoryChange = (category: CategoryFilter) => {\n setCurrentCategory(category);\n };\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{t('Ecosystem')}</ModalHeader>\n {!isolatedView && (\n <ModalBackButton\n onClick={() => setCurrentContent('settings')}\n />\n )}\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody overflowY=\"auto\" minH=\"300px\">\n <VStack spacing={6} w=\"full\">\n <ShortcutsSection setCurrentContent={setCurrentContent} />\n\n {shortcuts.length > 0 && (\n <Text\n fontSize=\"sm\"\n fontWeight=\"500\"\n w=\"full\"\n textAlign=\"left\"\n >\n {t('All apps')}\n </Text>\n )}\n <InputGroup size=\"lg\">\n <Input\n placeholder={t('Search Apps')}\n value={searchQuery}\n onChange={handleSearchChange}\n bg={isDark ? '#00000038' : 'gray.50'}\n borderRadius=\"xl\"\n height=\"56px\"\n pl={12}\n />\n <InputLeftElement h=\"56px\" w=\"56px\" pl={4}>\n <LuSearch color={textTertiary} />\n </InputLeftElement>\n </InputGroup>\n\n {/* Category filter section */}\n {categories.length > 0 && (\n <CategoryFilterSection\n selectedCategory={currentCategory}\n onCategoryChange={handleCategoryChange}\n categories={categories}\n darkMode={isDark}\n />\n )}\n\n <Grid templateColumns=\"repeat(2, 1fr)\" gap={4} w=\"full\">\n {/* Default Apps */}\n {shouldShowDefaultApps &&\n filteredDefaultApps.length > 0 && (\n <>\n {filteredDefaultApps.map((dapp) => (\n <GridItem key={dapp.name}>\n <CustomAppComponent\n name={dapp.name}\n image={dapp.logo}\n url={dapp.external_url}\n setCurrentContent={\n setCurrentContent\n }\n description={dapp.description}\n selectedCategory={\n currentCategory\n }\n />\n </GridItem>\n ))}\n </>\n )}\n\n {/* VeBetterDAO Apps */}\n {shouldShowVbdApps && filteredVbdApps.length > 0 && (\n <>\n {filteredVbdApps.map((dapp) => (\n <GridItem key={dapp.id}>\n <AppComponent\n xApp={dapp.app}\n setCurrentContent={\n setCurrentContent\n }\n selectedCategory={currentCategory}\n />\n </GridItem>\n ))}\n </>\n )}\n\n {/* App Hub Apps */}\n {appHubLoading ? (\n <GridItem colSpan={2}>\n <Center py={4}>\n <Spinner />\n </Center>\n </GridItem>\n ) : appHubError ? (\n <GridItem colSpan={2}>\n <Text color=\"red.500\" textAlign=\"center\">\n {t('Failed to load App Hub apps')}\n </Text>\n </GridItem>\n ) : filteredAppHubApps.length > 0 ? (\n filteredAppHubApps.map((app: AppHubApp) => (\n <GridItem key={app.id}>\n <CustomAppComponent\n name={app.name}\n image={app.logo}\n url={app.url}\n setCurrentContent={setCurrentContent}\n description={app.description}\n category={app.category}\n selectedCategory={currentCategory}\n />\n </GridItem>\n ))\n ) : (\n currentCategory &&\n !shouldShowVbdApps && (\n <GridItem colSpan={2}>\n <Center py={4}>\n <Text>\n {t(\n 'No apps found in this category',\n )}\n </Text>\n </Center>\n </GridItem>\n )\n )}\n </Grid>\n </VStack>\n </ModalBody>\n\n <ModalFooter pt={0} />\n </>\n );\n};\n","import { Button, Icon } from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport { LuBookmark, LuBookmarkCheck } from 'react-icons/lu';\nimport { useEcosystemShortcuts } from '../../../../../hooks';\n\ntype Props = {\n name: string;\n image: string;\n url: string;\n description?: string;\n};\n\nexport const ShortcutButton = ({ name, image, url, description }: Props) => {\n const { t } = useTranslation();\n const { isShortcut, addShortcut, removeShortcut } = useEcosystemShortcuts();\n const hasShortcut = isShortcut(url);\n\n const handleShortcutClick = () => {\n if (hasShortcut) {\n removeShortcut(url);\n } else {\n addShortcut({ name, image, url, description });\n }\n };\n\n return (\n <Button\n px={4}\n width=\"full\"\n height=\"45px\"\n variant=\"vechainKitSecondary\"\n borderRadius=\"xl\"\n onClick={handleShortcutClick}\n leftIcon={<Icon as={hasShortcut ? LuBookmarkCheck : LuBookmark} />}\n >\n {hasShortcut ? t('Remove from shortcuts') : t('Add to shortcuts')}\n </Button>\n );\n};\n","import {\n Button,\n Icon,\n Image,\n ModalBody,\n ModalCloseButton,\n ModalFooter,\n ModalHeader,\n Text,\n VStack,\n Flex,\n HStack,\n} from '@chakra-ui/react';\nimport { ModalBackButton, StickyHeaderContainer } from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { useTranslation } from 'react-i18next';\nimport { LuExternalLink } from 'react-icons/lu';\nimport { ShortcutButton } from './Components/ShortcutButton';\nimport { CategoryLabel, AllowedCategories } from './Components/CategoryLabel';\nimport { CategoryFilter } from './Components/CategoryFilterSection';\n\nexport type AppOverviewContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n name: string;\n image: string;\n url: string;\n description: string;\n category?: AllowedCategories;\n selectedCategory?: CategoryFilter;\n logoComponent?: JSX.Element;\n};\n\nexport const AppOverviewContent = ({\n setCurrentContent,\n name,\n image,\n url,\n description,\n category,\n selectedCategory,\n logoComponent,\n}: AppOverviewContentProps) => {\n const { t } = useTranslation();\n\n const handleLaunchApp = () => {\n window.open(url, '_blank');\n };\n\n const handleBackClick = () => {\n if (selectedCategory) {\n setCurrentContent({\n type: 'ecosystem-with-category',\n props: {\n selectedCategory,\n setCurrentContent,\n },\n });\n } else {\n setCurrentContent('ecosystem');\n }\n };\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{name}</ModalHeader>\n <ModalBackButton onClick={handleBackClick} />\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack spacing={6} align=\"center\" w=\"full\">\n <Flex direction=\"column\" align=\"center\">\n {logoComponent ? (\n logoComponent\n ) : (\n <Image\n src={image}\n alt={name}\n w={'200px'}\n h={'200px'}\n objectFit=\"contain\"\n borderRadius={'xl'}\n />\n )}\n\n {category && (\n <HStack mt={2}>\n <CategoryLabel category={category} />\n </HStack>\n )}\n </Flex>\n\n <Text fontSize=\"sm\" textAlign=\"center\">\n {description}\n </Text>\n\n <Text fontSize=\"sm\" textAlign=\"center\">\n {t(\n 'Click below to access {{ name }} and explore its features.',\n { name },\n )}\n </Text>\n </VStack>\n </ModalBody>\n\n <ModalFooter>\n <VStack w=\"full\" spacing={4}>\n <Button\n variant=\"vechainKitSecondary\"\n onClick={handleLaunchApp}\n >\n {t('Launch {{name}}', { name })}\n <Icon as={LuExternalLink} ml={2} />\n </Button>\n\n <ShortcutButton\n name={name}\n image={image}\n url={url}\n description={description}\n />\n </VStack>\n </ModalFooter>\n </>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Text,\n Button,\n ModalFooter,\n Icon,\n Link,\n HStack,\n useToken,\n} from '@chakra-ui/react';\nimport { StickyHeaderContainer } from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { useTranslation } from 'react-i18next';\n// Direct import to avoid circular dependency via providers barrel export\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\nimport { getConfig } from '../../../../config';\nimport { LuExternalLink, LuCircleCheck } from 'react-icons/lu';\nimport { ShareButtons } from '../../../TransactionModal';\n\nexport type SuccessfulOperationContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n txId?: string;\n title: string;\n description?: string;\n onDone: () => void;\n showSocialButtons?: boolean;\n};\n\nexport const SuccessfulOperationContent = ({\n txId,\n title,\n description,\n onDone,\n showSocialButtons = false,\n}: SuccessfulOperationContentProps) => {\n const { t } = useTranslation();\n const { network } = useVeChainKitConfig();\n const explorerUrl = getConfig(network.type).explorerUrl;\n const socialDescription = `${explorerUrl}/${txId}`;\n\n const successColor = useToken('colors', 'vechain-kit-success');\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{title}</ModalHeader>\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack align={'center'} p={6} spacing={3}>\n <Icon\n as={LuCircleCheck}\n fontSize={'100px'}\n color={successColor}\n data-testid=\"success-icon\"\n />\n\n {description && (\n <Text\n fontSize=\"sm\"\n textAlign=\"center\"\n color={textPrimary}\n >\n {description}\n </Text>\n )}\n\n {showSocialButtons && txId && (\n <VStack mt={2} spacing={3}>\n <Text\n fontSize=\"sm\"\n fontWeight={'bold'}\n color={textSecondary}\n >\n {t('Share on')}\n </Text>\n <ShareButtons description={socialDescription} />\n </VStack>\n )}\n </VStack>\n </ModalBody>\n\n <ModalFooter justifyContent={'center'}>\n <VStack width=\"full\" spacing={4}>\n <Button\n onClick={onDone}\n variant=\"vechainKitSecondary\"\n width=\"full\"\n >\n {t('Done')}\n </Button>\n\n {txId && (\n <Link\n href={`${explorerUrl}/${txId}`}\n isExternal\n opacity={0.5}\n fontSize={'14px'}\n textDecoration={'underline'}\n >\n <HStack\n spacing={1}\n alignItems={'center'}\n w={'full'}\n justifyContent={'center'}\n >\n <Text color={textSecondary}>\n {t('View transaction on the explorer')}\n </Text>\n <Icon size={16} as={LuExternalLink} />\n </HStack>\n </Link>\n )}\n </VStack>\n </ModalFooter>\n </>\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Text,\n Button,\n ModalFooter,\n Icon,\n Link,\n HStack,\n} from '@chakra-ui/react';\nimport { StickyHeaderContainer } from '../../../common';\nimport { AccountModalContentTypes } from '../../Types';\nimport { useTranslation } from 'react-i18next';\n// Direct import to avoid circular dependency via providers barrel export\nimport { useVeChainKitConfig } from '../../../../providers/VeChainKitContext';\nimport { getConfig } from '../../../../config';\nimport { LuExternalLink, LuCircleAlert } from 'react-icons/lu';\n\nexport type FailedOperationContentProps = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<AccountModalContentTypes>\n >;\n txId?: string;\n title: string;\n description?: string;\n onDone: () => void;\n};\n\nexport const FailedOperationContent = ({\n txId,\n title,\n description,\n onDone,\n}: FailedOperationContentProps) => {\n const { t } = useTranslation();\n const { network, darkMode } = useVeChainKitConfig();\n const explorerUrl = getConfig(network.type).explorerUrl;\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{title}</ModalHeader>\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack align={'center'} p={6} spacing={3}>\n <Icon\n as={LuCircleAlert}\n fontSize={'100px'}\n color={darkMode ? 'red.400' : 'red.500'}\n data-testid=\"error-icon\"\n />\n\n {description && (\n <Text fontSize=\"sm\" textAlign=\"center\">\n {description}\n </Text>\n )}\n </VStack>\n </ModalBody>\n\n <ModalFooter justifyContent={'center'}>\n <VStack width=\"full\" spacing={4}>\n <Button\n onClick={onDone}\n variant=\"vechainKitSecondary\"\n width=\"full\"\n >\n {t('Done')}\n </Button>\n\n {txId && (\n <Link\n href={`${explorerUrl}/${txId}`}\n isExternal\n opacity={0.5}\n fontSize={'14px'}\n textDecoration={'underline'}\n >\n <HStack\n spacing={1}\n alignItems={'center'}\n w={'full'}\n justifyContent={'center'}\n >\n <Text>\n {t('View transaction on the explorer')}\n </Text>\n <Icon size={16} as={LuExternalLink} />\n </HStack>\n </Link>\n )}\n </VStack>\n </ModalFooter>\n </>\n );\n};\n","'use client';\n\nimport { useWallet } from '../../hooks';\nimport { BaseModal } from '../common';\nimport {\n AccountMainContent,\n SettingsContent,\n SendTokenContent,\n SendTokenSummaryContent,\n ReceiveTokenContent,\n SwapTokenContent,\n ChooseNameContent,\n ChooseNameSearchContent,\n ChooseNameSummaryContent,\n FAQContent,\n ProfileContent,\n AssetsContent,\n LanguageSettingsContent,\n TermsAndPrivacyContent,\n GasTokenSettingsContent,\n SelectWalletContent,\n RemoveWalletConfirmContent,\n} from './Contents';\nimport { AccountModalContentTypes } from './Types/Types';\nimport { ConnectionDetailsContent } from './Contents/ConnectionDetails';\nimport { PrivyLinkedAccounts } from './Contents/PrivyLinkedAccounts';\nimport { NotificationsContent } from './Contents/Notifications/NotificationContent';\nimport { ExploreEcosystemContent } from './Contents/Ecosystem/ExploreEcosystemContent';\nimport { AppOverviewContent } from './Contents/Ecosystem/AppOverviewContent';\nimport { DisconnectConfirmContent } from './Contents/DisconnectConfirmation';\nimport { CustomizationContent, CustomizationSummaryContent } from './Contents';\nimport { SuccessfulOperationContent } from './Contents/SuccessfulOperation/SuccessfulOperationContent';\nimport { FailedOperationContent } from './Contents/FailedOperation/FailedOperationContent';\nimport { ManageCustomTokenContent } from './Contents/Assets/ManageCustomTokenContent';\nimport { UpgradeSmartAccountContent } from './Contents/UpgradeSmartAccount';\n// Import from ModalContext to avoid circular dependency with ModalProvider\nimport { useModal } from '../../providers/ModalContext';\nimport { ChangeCurrencyContent } from './Contents/KitSettings';\n// Import directly to avoid circular dependency with providers barrel\nimport { useVechainKitThemeConfig } from '../../providers/VechainKitThemeProvider';\nimport { useEffect } from 'react';\n\ntype Props = {\n isOpen: boolean;\n onClose: () => void;\n initialContent?: AccountModalContentTypes;\n};\n\nexport const AccountModal = ({\n isOpen,\n onClose,\n initialContent = 'profile',\n}: Props) => {\n const { account } = useWallet();\n const { themeConfig } = useVechainKitThemeConfig();\n\n const {\n accountModalContent: currentContent,\n setAccountModalContent: setCurrentContent,\n } = useModal();\n\n // Reset refs and set initial content when modal opens\n useEffect(() => {\n if (isOpen) {\n // Modal just opened - reset everything and use initialContent\n setCurrentContent(initialContent);\n }\n }, [isOpen, initialContent, setCurrentContent]);\n\n const renderContent = () => {\n if (typeof currentContent === 'object') {\n switch (currentContent.type) {\n case 'send-token':\n return <SendTokenContent {...currentContent.props} />;\n case 'send-token-summary':\n return (\n <SendTokenSummaryContent {...currentContent.props} />\n );\n case 'swap-token':\n return <SwapTokenContent {...currentContent.props} />;\n case 'choose-name':\n return <ChooseNameContent {...currentContent.props} />;\n case 'choose-name-search':\n return (\n <ChooseNameSearchContent {...currentContent.props} />\n );\n case 'choose-name-summary':\n return (\n <ChooseNameSummaryContent {...currentContent.props} />\n );\n case 'app-overview':\n return (\n <AppOverviewContent\n {...currentContent.props}\n setCurrentContent={setCurrentContent}\n />\n );\n case 'disconnect-confirm':\n return (\n <DisconnectConfirmContent {...currentContent.props} />\n );\n case 'remove-wallet-confirm':\n return (\n <RemoveWalletConfirmContent {...currentContent.props} />\n );\n case 'account-customization':\n return <CustomizationContent {...currentContent.props} />;\n case 'account-customization-summary':\n return (\n <CustomizationSummaryContent\n {...currentContent.props}\n />\n );\n case 'successful-operation':\n return (\n <SuccessfulOperationContent {...currentContent.props} />\n );\n case 'failed-operation':\n return <FailedOperationContent {...currentContent.props} />;\n case 'upgrade-smart-account':\n return (\n <UpgradeSmartAccountContent {...currentContent.props} />\n );\n case 'faq':\n return <FAQContent {...currentContent.props} />;\n case 'terms-and-privacy':\n return <TermsAndPrivacyContent {...currentContent.props} />;\n case 'ecosystem-with-category':\n return (\n <ExploreEcosystemContent\n setCurrentContent={setCurrentContent}\n selectedCategory={\n currentContent.props.selectedCategory\n }\n />\n );\n case 'select-wallet':\n return (\n <SelectWalletContent\n setCurrentContent={setCurrentContent}\n onClose={onClose}\n returnTo={currentContent.props.returnTo}\n onLogoutSuccess={\n currentContent.props.onLogoutSuccess\n }\n />\n );\n case 'main':\n return (\n <AccountMainContent\n setCurrentContent={setCurrentContent}\n onClose={onClose}\n wallet={account}\n switchFeedback={currentContent.props?.switchFeedback}\n />\n );\n case 'profile':\n return (\n <ProfileContent\n setCurrentContent={setCurrentContent}\n onLogoutSuccess={() => {\n onClose();\n }}\n switchFeedback={currentContent.props?.switchFeedback}\n />\n );\n }\n }\n\n switch (currentContent) {\n case 'main':\n return (\n <AccountMainContent\n setCurrentContent={setCurrentContent}\n onClose={onClose}\n wallet={account}\n />\n );\n case 'settings':\n return (\n <SettingsContent\n setCurrentContent={setCurrentContent}\n onLogoutSuccess={() => {\n onClose();\n }}\n />\n );\n case 'profile':\n return (\n <ProfileContent\n setCurrentContent={setCurrentContent}\n onLogoutSuccess={() => {\n onClose();\n }}\n />\n );\n case 'assets':\n return <AssetsContent setCurrentContent={setCurrentContent} />;\n case 'notifications':\n return (\n <NotificationsContent\n setCurrentContent={setCurrentContent}\n />\n );\n case 'receive-token':\n return (\n <ReceiveTokenContent\n setCurrentContent={setCurrentContent}\n />\n );\n case 'swap-token':\n return (\n <SwapTokenContent setCurrentContent={setCurrentContent} />\n );\n case 'connection-details':\n return (\n <ConnectionDetailsContent\n onGoBack={() => setCurrentContent('settings')}\n />\n );\n case 'privy-linked-accounts':\n return (\n <PrivyLinkedAccounts\n onBack={() => setCurrentContent('settings')}\n />\n );\n case 'ecosystem':\n return (\n <ExploreEcosystemContent\n setCurrentContent={setCurrentContent}\n />\n );\n case 'add-custom-token':\n return (\n <ManageCustomTokenContent\n setCurrentContent={setCurrentContent}\n />\n );\n case 'change-currency':\n return (\n <ChangeCurrencyContent\n setCurrentContent={setCurrentContent}\n />\n );\n case 'change-language':\n return (\n <LanguageSettingsContent\n setCurrentContent={setCurrentContent}\n />\n );\n case 'gas-token-settings':\n return (\n <GasTokenSettingsContent\n setCurrentContent={setCurrentContent}\n />\n );\n default:\n return null;\n }\n };\n\n return (\n <BaseModal\n isOpen={isOpen}\n onClose={onClose}\n allowExternalFocus={true}\n blockScrollOnMount={true}\n mobileMinHeight={\n themeConfig?.modal?.useBottomSheetOnMobile ? '520px' : '510px'\n }\n mobileMaxHeight={\n themeConfig?.modal?.useBottomSheetOnMobile ? '520px' : '510px'\n }\n desktopMinHeight={'485px'}\n desktopMaxHeight={'485px'}\n >\n {renderContent()}\n </BaseModal>\n );\n};\n"],"mappings":"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"}