@b3dotfun/sdk 0.0.73 → 0.0.74-alpha.0

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 (461) hide show
  1. package/dist/cjs/anyspend/react/components/AnySpend.js +75 -50
  2. package/dist/cjs/anyspend/react/components/AnySpendBuySpin.js +9 -10
  3. package/dist/cjs/anyspend/react/components/AnySpendCustom.js +41 -41
  4. package/dist/cjs/anyspend/react/components/AnySpendCustomExactIn.d.ts +1 -0
  5. package/dist/cjs/anyspend/react/components/AnySpendCustomExactIn.js +17 -9
  6. package/dist/cjs/anyspend/react/components/AnySpendStakeB3.js +7 -8
  7. package/dist/cjs/anyspend/react/components/AnySpendStakeB3ExactIn.js +7 -8
  8. package/dist/cjs/anyspend/react/components/AnyspendDepositHype.d.ts +2 -1
  9. package/dist/cjs/anyspend/react/components/AnyspendDepositHype.js +2 -2
  10. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.d.ts +0 -6
  11. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.js +18 -14
  12. package/dist/cjs/anyspend/react/components/common/FeeDetailPanel.js +1 -1
  13. package/dist/cjs/anyspend/react/components/common/FiatPaymentMethod.js +2 -2
  14. package/dist/cjs/anyspend/react/components/common/InsufficientDepositPayment.js +6 -6
  15. package/dist/cjs/anyspend/react/components/common/OrderDetails.js +35 -35
  16. package/dist/cjs/anyspend/react/components/common/OrderDetailsCollapsible.js +1 -2
  17. package/dist/cjs/anyspend/react/components/common/OrderHistory.d.ts +1 -1
  18. package/dist/cjs/anyspend/react/components/common/OrderHistory.js +7 -3
  19. package/dist/cjs/anyspend/react/components/common/OrderHistoryItem.js +1 -1
  20. package/dist/cjs/anyspend/react/components/common/PanelOnramp.js +4 -4
  21. package/dist/cjs/anyspend/react/components/common/PanelOnrampPayment.js +8 -9
  22. package/dist/cjs/anyspend/react/components/common/PointsDetailPanel.js +1 -1
  23. package/dist/cjs/anyspend/react/components/common/RecipientSelection.js +1 -1
  24. package/dist/cjs/anyspend/react/components/common/TransferCryptoDetails.js +2 -3
  25. package/dist/cjs/anyspend/react/components/webview/WebviewOnrampOrderStatus.js +1 -2
  26. package/dist/cjs/anyspend/react/components/webview/WebviewOnrampPayment.js +12 -12
  27. package/dist/cjs/anyspend/react/hooks/useAnyspendFlow.js +4 -5
  28. package/dist/cjs/anyspend/react/hooks/useConnectedWalletDisplay.js +3 -2
  29. package/dist/cjs/anyspend/react/hooks/usePhantomTransfer.js +17 -17
  30. package/dist/cjs/anyspend/react/utils/toast.d.ts +6 -0
  31. package/dist/cjs/anyspend/react/utils/toast.js +9 -0
  32. package/dist/cjs/global-account/react/components/AccountAssets/AccountAssets.js +38 -2
  33. package/dist/cjs/global-account/react/components/AvatarCreator/AvatarCreator.js +2 -3
  34. package/dist/cjs/global-account/react/components/AvatarEditor/AvatarEditor.d.ts +1 -0
  35. package/dist/cjs/global-account/react/components/AvatarEditor/AvatarEditor.js +275 -39
  36. package/dist/cjs/global-account/react/components/B3DynamicModal.js +40 -13
  37. package/dist/cjs/global-account/react/components/B3Provider/B3Provider.d.ts +1 -1
  38. package/dist/cjs/global-account/react/components/B3Provider/B3Provider.js +19 -3
  39. package/dist/cjs/global-account/react/components/Deposit/Deposit.d.ts +1 -0
  40. package/dist/cjs/global-account/react/components/Deposit/Deposit.js +61 -0
  41. package/dist/cjs/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +39 -0
  42. package/dist/cjs/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.js +34 -0
  43. package/dist/cjs/global-account/react/components/LinkAccount/LinkAccount.d.ts +6 -4
  44. package/dist/cjs/global-account/react/components/LinkAccount/LinkAccount.js +104 -283
  45. package/dist/cjs/global-account/react/components/LinkAccount/LinkNewAccount.d.ts +4 -0
  46. package/dist/cjs/global-account/react/components/LinkAccount/LinkNewAccount.js +320 -0
  47. package/dist/cjs/global-account/react/components/LinkAccount/LinkedAccountItem.d.ts +16 -0
  48. package/dist/cjs/global-account/react/components/LinkAccount/LinkedAccountItem.js +44 -0
  49. package/dist/cjs/global-account/react/components/ManageAccount/BottomNavigation.d.ts +2 -0
  50. package/dist/cjs/global-account/react/components/ManageAccount/BottomNavigation.js +23 -0
  51. package/dist/cjs/global-account/react/components/ManageAccount/ContentTokens.js +1 -2
  52. package/dist/cjs/global-account/react/components/ManageAccount/Header.d.ts +3 -0
  53. package/dist/cjs/global-account/react/components/ManageAccount/Header.js +120 -0
  54. package/dist/cjs/global-account/react/components/ManageAccount/HomeActions.d.ts +5 -0
  55. package/dist/cjs/global-account/react/components/ManageAccount/HomeActions.js +43 -0
  56. package/dist/cjs/global-account/react/components/ManageAccount/HomeContent.d.ts +6 -0
  57. package/dist/cjs/global-account/react/components/ManageAccount/HomeContent.js +16 -0
  58. package/dist/cjs/global-account/react/components/ManageAccount/ManageAccount.js +16 -194
  59. package/dist/cjs/global-account/react/components/ManageAccount/NFTContent.d.ts +2 -0
  60. package/dist/cjs/global-account/react/components/ManageAccount/NFTContent.js +15 -0
  61. package/dist/cjs/global-account/react/components/ManageAccount/NotificationChannel.d.ts +16 -0
  62. package/dist/cjs/global-account/react/components/ManageAccount/NotificationChannel.js +13 -0
  63. package/dist/cjs/global-account/react/components/ManageAccount/NotificationsContent.d.ts +8 -0
  64. package/dist/cjs/global-account/react/components/ManageAccount/NotificationsContent.js +152 -0
  65. package/dist/cjs/global-account/react/components/ManageAccount/ProfileSection.d.ts +2 -0
  66. package/dist/cjs/global-account/react/components/ManageAccount/ProfileSection.js +47 -0
  67. package/dist/cjs/global-account/react/components/ManageAccount/SettingsContent.d.ts +7 -0
  68. package/dist/cjs/global-account/react/components/ManageAccount/SettingsContent.js +60 -0
  69. package/dist/cjs/global-account/react/components/ManageAccount/SettingsMenuItem.d.ts +9 -0
  70. package/dist/cjs/global-account/react/components/ManageAccount/SettingsMenuItem.js +8 -0
  71. package/dist/cjs/global-account/react/components/ManageAccount/SettingsProfileCard.d.ts +2 -0
  72. package/dist/cjs/global-account/react/components/ManageAccount/SettingsProfileCard.js +116 -0
  73. package/dist/cjs/global-account/react/components/ManageAccount/TokenBalanceRow.d.ts +3 -3
  74. package/dist/cjs/global-account/react/components/ManageAccount/TokenBalanceRow.js +2 -2
  75. package/dist/cjs/global-account/react/components/ManageAccount/TokenContent.d.ts +2 -0
  76. package/dist/cjs/global-account/react/components/ManageAccount/TokenContent.js +44 -0
  77. package/dist/cjs/global-account/react/components/ManageAccount/channels/DiscordChannel.d.ts +11 -0
  78. package/dist/cjs/global-account/react/components/ManageAccount/channels/DiscordChannel.js +48 -0
  79. package/dist/cjs/global-account/react/components/ManageAccount/channels/EmailChannel.d.ts +11 -0
  80. package/dist/cjs/global-account/react/components/ManageAccount/channels/EmailChannel.js +68 -0
  81. package/dist/cjs/global-account/react/components/ManageAccount/channels/PhoneChannel.d.ts +14 -0
  82. package/dist/cjs/global-account/react/components/ManageAccount/channels/PhoneChannel.js +79 -0
  83. package/dist/cjs/global-account/react/components/ManageAccount/channels/TelegramChannel.d.ts +11 -0
  84. package/dist/cjs/global-account/react/components/ManageAccount/channels/TelegramChannel.js +79 -0
  85. package/dist/cjs/global-account/react/components/ManageAccount/channels/index.d.ts +4 -0
  86. package/dist/cjs/global-account/react/components/ManageAccount/channels/index.js +11 -0
  87. package/dist/cjs/global-account/react/components/ModalHeader/ModalHeader.d.ts +11 -0
  88. package/dist/cjs/global-account/react/components/ModalHeader/ModalHeader.js +12 -0
  89. package/dist/cjs/global-account/react/components/Send/Send.d.ts +5 -0
  90. package/dist/cjs/global-account/react/components/Send/Send.js +195 -0
  91. package/dist/cjs/global-account/react/components/SignInWithB3/SignIn.js +5 -4
  92. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +1 -1
  93. package/dist/cjs/global-account/react/components/Toast/ToastComponents.d.ts +15 -0
  94. package/dist/cjs/global-account/react/components/Toast/ToastComponents.js +54 -0
  95. package/dist/cjs/global-account/react/components/Toast/ToastContext.d.ts +19 -0
  96. package/dist/cjs/global-account/react/components/Toast/ToastContext.js +59 -0
  97. package/dist/cjs/global-account/react/components/Toast/index.d.ts +4 -0
  98. package/dist/cjs/global-account/react/components/Toast/index.js +12 -0
  99. package/dist/cjs/global-account/react/components/Toast/toastApi.d.ts +21 -0
  100. package/dist/cjs/global-account/react/components/Toast/toastApi.js +93 -0
  101. package/dist/cjs/global-account/react/components/WalletImage/WalletImage.d.ts +4 -0
  102. package/dist/cjs/global-account/react/components/WalletImage/WalletImage.js +13 -0
  103. package/dist/cjs/global-account/react/components/icons/BellIcon.d.ts +3 -0
  104. package/dist/cjs/global-account/react/components/icons/BellIcon.js +5 -0
  105. package/dist/cjs/global-account/react/components/icons/ChevronDownIcon.d.ts +2 -0
  106. package/dist/cjs/global-account/react/components/icons/ChevronDownIcon.js +7 -0
  107. package/dist/cjs/global-account/react/components/icons/CopyIcon.d.ts +2 -0
  108. package/dist/cjs/global-account/react/components/icons/CopyIcon.js +7 -0
  109. package/dist/cjs/global-account/react/components/icons/LinkIcon.d.ts +3 -0
  110. package/dist/cjs/global-account/react/components/icons/LinkIcon.js +5 -0
  111. package/dist/cjs/global-account/react/components/icons/LockIcon.d.ts +3 -0
  112. package/dist/cjs/global-account/react/components/icons/LockIcon.js +5 -0
  113. package/dist/cjs/global-account/react/components/icons/WalletIcon.d.ts +2 -0
  114. package/dist/cjs/global-account/react/components/icons/WalletIcon.js +7 -0
  115. package/dist/cjs/global-account/react/components/index.d.ts +10 -4
  116. package/dist/cjs/global-account/react/components/index.js +29 -9
  117. package/dist/cjs/global-account/react/components/ui/Tabs.js +2 -2
  118. package/dist/cjs/global-account/react/components/ui/dialog.js +2 -2
  119. package/dist/cjs/global-account/react/components/ui/drawer.js +1 -1
  120. package/dist/cjs/global-account/react/hooks/index.d.ts +3 -2
  121. package/dist/cjs/global-account/react/hooks/index.js +7 -3
  122. package/dist/cjs/global-account/react/hooks/useAccountWallet.d.ts +1 -0
  123. package/dist/cjs/global-account/react/hooks/useAccountWallet.js +18 -0
  124. package/dist/cjs/global-account/react/hooks/useB3BalanceFromAddresses.js +1 -0
  125. package/dist/cjs/global-account/react/hooks/useChainSwitchWithAction.js +11 -11
  126. package/dist/cjs/global-account/react/hooks/useNativeBalance.js +2 -2
  127. package/dist/cjs/global-account/react/hooks/useNotifications.d.ts +48 -0
  128. package/dist/cjs/global-account/react/hooks/useNotifications.js +189 -0
  129. package/dist/cjs/global-account/react/hooks/useSimBalance.js +3 -3
  130. package/dist/cjs/global-account/react/hooks/useTokenBalanceDirect.d.ts +1 -0
  131. package/dist/cjs/global-account/react/hooks/useTokenBalanceDirect.js +1 -0
  132. package/dist/cjs/global-account/react/hooks/useUnifiedChainSwitchAndExecute.js +17 -17
  133. package/dist/cjs/global-account/react/stores/index.d.ts +1 -0
  134. package/dist/cjs/global-account/react/stores/index.js +3 -1
  135. package/dist/cjs/global-account/react/stores/useModalStore.d.ts +47 -6
  136. package/dist/cjs/global-account/react/stores/useRecentAddressesStore.d.ts +25 -0
  137. package/dist/cjs/global-account/react/stores/useRecentAddressesStore.js +36 -0
  138. package/dist/cjs/global-account/react/utils/index.d.ts +4 -0
  139. package/dist/cjs/global-account/react/utils/index.js +20 -0
  140. package/dist/cjs/global-account/react/utils/notificationsAPI.d.ts +80 -0
  141. package/dist/cjs/global-account/react/utils/notificationsAPI.js +257 -0
  142. package/dist/cjs/global-account/react/utils/profileDisplay.d.ts +3 -0
  143. package/dist/cjs/global-account/react/utils/profileDisplay.js +8 -4
  144. package/dist/cjs/global-account/react/utils/toast.d.ts +6 -0
  145. package/dist/cjs/global-account/react/utils/toast.js +9 -0
  146. package/dist/cjs/shared/constants/chains/supported.d.ts +3 -2
  147. package/dist/cjs/shared/constants/chains/supported.js +4 -0
  148. package/dist/cjs/shared/utils/ipfs.js +10 -3
  149. package/dist/esm/anyspend/react/components/AnySpend.js +67 -42
  150. package/dist/esm/anyspend/react/components/AnySpendBuySpin.js +1 -2
  151. package/dist/esm/anyspend/react/components/AnySpendCustom.js +10 -10
  152. package/dist/esm/anyspend/react/components/AnySpendCustomExactIn.d.ts +1 -0
  153. package/dist/esm/anyspend/react/components/AnySpendCustomExactIn.js +12 -4
  154. package/dist/esm/anyspend/react/components/AnySpendStakeB3.js +1 -2
  155. package/dist/esm/anyspend/react/components/AnySpendStakeB3ExactIn.js +1 -2
  156. package/dist/esm/anyspend/react/components/AnyspendDepositHype.d.ts +2 -1
  157. package/dist/esm/anyspend/react/components/AnyspendDepositHype.js +2 -2
  158. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.d.ts +0 -6
  159. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.js +9 -5
  160. package/dist/esm/anyspend/react/components/common/FeeDetailPanel.js +1 -1
  161. package/dist/esm/anyspend/react/components/common/FiatPaymentMethod.js +2 -2
  162. package/dist/esm/anyspend/react/components/common/InsufficientDepositPayment.js +1 -1
  163. package/dist/esm/anyspend/react/components/common/OrderDetails.js +2 -2
  164. package/dist/esm/anyspend/react/components/common/OrderDetailsCollapsible.js +1 -2
  165. package/dist/esm/anyspend/react/components/common/OrderHistory.d.ts +1 -1
  166. package/dist/esm/anyspend/react/components/common/OrderHistory.js +6 -5
  167. package/dist/esm/anyspend/react/components/common/OrderHistoryItem.js +2 -2
  168. package/dist/esm/anyspend/react/components/common/PanelOnramp.js +4 -4
  169. package/dist/esm/anyspend/react/components/common/PanelOnrampPayment.js +2 -3
  170. package/dist/esm/anyspend/react/components/common/PointsDetailPanel.js +1 -1
  171. package/dist/esm/anyspend/react/components/common/RecipientSelection.js +1 -1
  172. package/dist/esm/anyspend/react/components/common/TransferCryptoDetails.js +1 -2
  173. package/dist/esm/anyspend/react/components/webview/WebviewOnrampOrderStatus.js +1 -2
  174. package/dist/esm/anyspend/react/components/webview/WebviewOnrampPayment.js +1 -1
  175. package/dist/esm/anyspend/react/hooks/useAnyspendFlow.js +1 -2
  176. package/dist/esm/anyspend/react/hooks/useConnectedWalletDisplay.js +3 -2
  177. package/dist/esm/anyspend/react/hooks/usePhantomTransfer.js +1 -1
  178. package/dist/esm/anyspend/react/utils/toast.d.ts +6 -0
  179. package/dist/esm/anyspend/react/utils/toast.js +5 -0
  180. package/dist/esm/global-account/react/components/AccountAssets/AccountAssets.js +38 -2
  181. package/dist/esm/global-account/react/components/AvatarCreator/AvatarCreator.js +1 -2
  182. package/dist/esm/global-account/react/components/AvatarEditor/AvatarEditor.d.ts +1 -0
  183. package/dist/esm/global-account/react/components/AvatarEditor/AvatarEditor.js +276 -40
  184. package/dist/esm/global-account/react/components/B3DynamicModal.js +37 -13
  185. package/dist/esm/global-account/react/components/B3Provider/B3Provider.d.ts +1 -1
  186. package/dist/esm/global-account/react/components/B3Provider/B3Provider.js +19 -3
  187. package/dist/esm/global-account/react/components/Deposit/Deposit.d.ts +1 -0
  188. package/dist/esm/global-account/react/components/Deposit/Deposit.js +55 -0
  189. package/dist/esm/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +39 -0
  190. package/dist/esm/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.js +31 -0
  191. package/dist/esm/global-account/react/components/LinkAccount/LinkAccount.d.ts +6 -4
  192. package/dist/esm/global-account/react/components/LinkAccount/LinkAccount.js +103 -283
  193. package/dist/esm/global-account/react/components/LinkAccount/LinkNewAccount.d.ts +4 -0
  194. package/dist/esm/global-account/react/components/LinkAccount/LinkNewAccount.js +314 -0
  195. package/dist/esm/global-account/react/components/LinkAccount/LinkedAccountItem.d.ts +16 -0
  196. package/dist/esm/global-account/react/components/LinkAccount/LinkedAccountItem.js +42 -0
  197. package/dist/esm/global-account/react/components/ManageAccount/BottomNavigation.d.ts +2 -0
  198. package/dist/esm/global-account/react/components/ManageAccount/BottomNavigation.js +21 -0
  199. package/dist/esm/global-account/react/components/ManageAccount/ContentTokens.js +1 -2
  200. package/dist/esm/global-account/react/components/ManageAccount/Header.d.ts +3 -0
  201. package/dist/esm/global-account/react/components/ManageAccount/Header.js +81 -0
  202. package/dist/esm/global-account/react/components/ManageAccount/HomeActions.d.ts +5 -0
  203. package/dist/esm/global-account/react/components/ManageAccount/HomeActions.js +41 -0
  204. package/dist/esm/global-account/react/components/ManageAccount/HomeContent.d.ts +6 -0
  205. package/dist/esm/global-account/react/components/ManageAccount/HomeContent.js +10 -0
  206. package/dist/esm/global-account/react/components/ManageAccount/ManageAccount.js +18 -196
  207. package/dist/esm/global-account/react/components/ManageAccount/NFTContent.d.ts +2 -0
  208. package/dist/esm/global-account/react/components/ManageAccount/NFTContent.js +13 -0
  209. package/dist/esm/global-account/react/components/ManageAccount/NotificationChannel.d.ts +16 -0
  210. package/dist/esm/global-account/react/components/ManageAccount/NotificationChannel.js +9 -0
  211. package/dist/esm/global-account/react/components/ManageAccount/NotificationsContent.d.ts +8 -0
  212. package/dist/esm/global-account/react/components/ManageAccount/NotificationsContent.js +147 -0
  213. package/dist/esm/global-account/react/components/ManageAccount/ProfileSection.d.ts +2 -0
  214. package/dist/esm/global-account/react/components/ManageAccount/ProfileSection.js +45 -0
  215. package/dist/esm/global-account/react/components/ManageAccount/SettingsContent.d.ts +7 -0
  216. package/dist/esm/global-account/react/components/ManageAccount/SettingsContent.js +55 -0
  217. package/dist/esm/global-account/react/components/ManageAccount/SettingsMenuItem.d.ts +9 -0
  218. package/dist/esm/global-account/react/components/ManageAccount/SettingsMenuItem.js +6 -0
  219. package/dist/esm/global-account/react/components/ManageAccount/SettingsProfileCard.d.ts +2 -0
  220. package/dist/esm/global-account/react/components/ManageAccount/SettingsProfileCard.js +111 -0
  221. package/dist/esm/global-account/react/components/ManageAccount/TokenBalanceRow.d.ts +3 -3
  222. package/dist/esm/global-account/react/components/ManageAccount/TokenBalanceRow.js +3 -3
  223. package/dist/esm/global-account/react/components/ManageAccount/TokenContent.d.ts +2 -0
  224. package/dist/esm/global-account/react/components/ManageAccount/TokenContent.js +42 -0
  225. package/dist/esm/global-account/react/components/ManageAccount/channels/DiscordChannel.d.ts +11 -0
  226. package/dist/esm/global-account/react/components/ManageAccount/channels/DiscordChannel.js +44 -0
  227. package/dist/esm/global-account/react/components/ManageAccount/channels/EmailChannel.d.ts +11 -0
  228. package/dist/esm/global-account/react/components/ManageAccount/channels/EmailChannel.js +64 -0
  229. package/dist/esm/global-account/react/components/ManageAccount/channels/PhoneChannel.d.ts +14 -0
  230. package/dist/esm/global-account/react/components/ManageAccount/channels/PhoneChannel.js +75 -0
  231. package/dist/esm/global-account/react/components/ManageAccount/channels/TelegramChannel.d.ts +11 -0
  232. package/dist/esm/global-account/react/components/ManageAccount/channels/TelegramChannel.js +75 -0
  233. package/dist/esm/global-account/react/components/ManageAccount/channels/index.d.ts +4 -0
  234. package/dist/esm/global-account/react/components/ManageAccount/channels/index.js +4 -0
  235. package/dist/esm/global-account/react/components/ModalHeader/ModalHeader.d.ts +11 -0
  236. package/dist/esm/global-account/react/components/ModalHeader/ModalHeader.js +10 -0
  237. package/dist/esm/global-account/react/components/Send/Send.d.ts +5 -0
  238. package/dist/esm/global-account/react/components/Send/Send.js +189 -0
  239. package/dist/esm/global-account/react/components/SignInWithB3/SignIn.js +7 -6
  240. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +1 -1
  241. package/dist/esm/global-account/react/components/Toast/ToastComponents.d.ts +15 -0
  242. package/dist/esm/global-account/react/components/Toast/ToastComponents.js +50 -0
  243. package/dist/esm/global-account/react/components/Toast/ToastContext.d.ts +19 -0
  244. package/dist/esm/global-account/react/components/Toast/ToastContext.js +55 -0
  245. package/dist/esm/global-account/react/components/Toast/index.d.ts +4 -0
  246. package/dist/esm/global-account/react/components/Toast/index.js +3 -0
  247. package/dist/esm/global-account/react/components/Toast/toastApi.d.ts +21 -0
  248. package/dist/esm/global-account/react/components/Toast/toastApi.js +89 -0
  249. package/dist/esm/global-account/react/components/WalletImage/WalletImage.d.ts +4 -0
  250. package/dist/esm/global-account/react/components/WalletImage/WalletImage.js +11 -0
  251. package/dist/esm/global-account/react/components/icons/BellIcon.d.ts +3 -0
  252. package/dist/esm/global-account/react/components/icons/BellIcon.js +3 -0
  253. package/dist/esm/global-account/react/components/icons/ChevronDownIcon.d.ts +2 -0
  254. package/dist/esm/global-account/react/components/icons/ChevronDownIcon.js +4 -0
  255. package/dist/esm/global-account/react/components/icons/CopyIcon.d.ts +2 -0
  256. package/dist/esm/global-account/react/components/icons/CopyIcon.js +4 -0
  257. package/dist/esm/global-account/react/components/icons/LinkIcon.d.ts +3 -0
  258. package/dist/esm/global-account/react/components/icons/LinkIcon.js +3 -0
  259. package/dist/esm/global-account/react/components/icons/LockIcon.d.ts +3 -0
  260. package/dist/esm/global-account/react/components/icons/LockIcon.js +3 -0
  261. package/dist/esm/global-account/react/components/icons/WalletIcon.d.ts +2 -0
  262. package/dist/esm/global-account/react/components/icons/WalletIcon.js +4 -0
  263. package/dist/esm/global-account/react/components/index.d.ts +10 -4
  264. package/dist/esm/global-account/react/components/index.js +14 -5
  265. package/dist/esm/global-account/react/components/ui/Tabs.js +2 -2
  266. package/dist/esm/global-account/react/components/ui/dialog.js +2 -2
  267. package/dist/esm/global-account/react/components/ui/drawer.js +1 -1
  268. package/dist/esm/global-account/react/hooks/index.d.ts +3 -2
  269. package/dist/esm/global-account/react/hooks/index.js +3 -2
  270. package/dist/esm/global-account/react/hooks/useAccountWallet.d.ts +1 -0
  271. package/dist/esm/global-account/react/hooks/useAccountWallet.js +17 -0
  272. package/dist/esm/global-account/react/hooks/useB3BalanceFromAddresses.js +1 -0
  273. package/dist/esm/global-account/react/hooks/useChainSwitchWithAction.js +2 -2
  274. package/dist/esm/global-account/react/hooks/useNativeBalance.js +1 -1
  275. package/dist/esm/global-account/react/hooks/useNotifications.d.ts +48 -0
  276. package/dist/esm/global-account/react/hooks/useNotifications.js +186 -0
  277. package/dist/esm/global-account/react/hooks/useSimBalance.js +3 -3
  278. package/dist/esm/global-account/react/hooks/useTokenBalanceDirect.d.ts +1 -0
  279. package/dist/esm/global-account/react/hooks/useTokenBalanceDirect.js +1 -0
  280. package/dist/esm/global-account/react/hooks/useUnifiedChainSwitchAndExecute.js +2 -2
  281. package/dist/esm/global-account/react/stores/index.d.ts +1 -0
  282. package/dist/esm/global-account/react/stores/index.js +1 -0
  283. package/dist/esm/global-account/react/stores/useModalStore.d.ts +47 -6
  284. package/dist/esm/global-account/react/stores/useRecentAddressesStore.d.ts +25 -0
  285. package/dist/esm/global-account/react/stores/useRecentAddressesStore.js +33 -0
  286. package/dist/esm/global-account/react/utils/index.d.ts +4 -0
  287. package/dist/esm/global-account/react/utils/index.js +4 -0
  288. package/dist/esm/global-account/react/utils/notificationsAPI.d.ts +80 -0
  289. package/dist/esm/global-account/react/utils/notificationsAPI.js +254 -0
  290. package/dist/esm/global-account/react/utils/profileDisplay.d.ts +3 -0
  291. package/dist/esm/global-account/react/utils/profileDisplay.js +8 -4
  292. package/dist/esm/global-account/react/utils/toast.d.ts +6 -0
  293. package/dist/esm/global-account/react/utils/toast.js +5 -0
  294. package/dist/esm/shared/constants/chains/supported.d.ts +3 -2
  295. package/dist/esm/shared/constants/chains/supported.js +3 -0
  296. package/dist/esm/shared/utils/ipfs.js +10 -3
  297. package/dist/styles/index.css +1 -1
  298. package/dist/types/anyspend/react/components/AnySpendCustomExactIn.d.ts +1 -0
  299. package/dist/types/anyspend/react/components/AnyspendDepositHype.d.ts +2 -1
  300. package/dist/types/anyspend/react/components/common/CryptoPaymentMethod.d.ts +0 -6
  301. package/dist/types/anyspend/react/components/common/OrderHistory.d.ts +1 -1
  302. package/dist/types/anyspend/react/utils/toast.d.ts +6 -0
  303. package/dist/types/global-account/react/components/AvatarEditor/AvatarEditor.d.ts +1 -0
  304. package/dist/types/global-account/react/components/B3Provider/B3Provider.d.ts +1 -1
  305. package/dist/types/global-account/react/components/Deposit/Deposit.d.ts +1 -0
  306. package/dist/types/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +39 -0
  307. package/dist/types/global-account/react/components/LinkAccount/LinkAccount.d.ts +6 -4
  308. package/dist/types/global-account/react/components/LinkAccount/LinkNewAccount.d.ts +4 -0
  309. package/dist/types/global-account/react/components/LinkAccount/LinkedAccountItem.d.ts +16 -0
  310. package/dist/types/global-account/react/components/ManageAccount/BottomNavigation.d.ts +2 -0
  311. package/dist/types/global-account/react/components/ManageAccount/Header.d.ts +3 -0
  312. package/dist/types/global-account/react/components/ManageAccount/HomeActions.d.ts +5 -0
  313. package/dist/types/global-account/react/components/ManageAccount/HomeContent.d.ts +6 -0
  314. package/dist/types/global-account/react/components/ManageAccount/NFTContent.d.ts +2 -0
  315. package/dist/types/global-account/react/components/ManageAccount/NotificationChannel.d.ts +16 -0
  316. package/dist/types/global-account/react/components/ManageAccount/NotificationsContent.d.ts +8 -0
  317. package/dist/types/global-account/react/components/ManageAccount/ProfileSection.d.ts +2 -0
  318. package/dist/types/global-account/react/components/ManageAccount/SettingsContent.d.ts +7 -0
  319. package/dist/types/global-account/react/components/ManageAccount/SettingsMenuItem.d.ts +9 -0
  320. package/dist/types/global-account/react/components/ManageAccount/SettingsProfileCard.d.ts +2 -0
  321. package/dist/types/global-account/react/components/ManageAccount/TokenBalanceRow.d.ts +3 -3
  322. package/dist/types/global-account/react/components/ManageAccount/TokenContent.d.ts +2 -0
  323. package/dist/types/global-account/react/components/ManageAccount/channels/DiscordChannel.d.ts +11 -0
  324. package/dist/types/global-account/react/components/ManageAccount/channels/EmailChannel.d.ts +11 -0
  325. package/dist/types/global-account/react/components/ManageAccount/channels/PhoneChannel.d.ts +14 -0
  326. package/dist/types/global-account/react/components/ManageAccount/channels/TelegramChannel.d.ts +11 -0
  327. package/dist/types/global-account/react/components/ManageAccount/channels/index.d.ts +4 -0
  328. package/dist/types/global-account/react/components/ModalHeader/ModalHeader.d.ts +11 -0
  329. package/dist/types/global-account/react/components/Send/Send.d.ts +5 -0
  330. package/dist/types/global-account/react/components/Toast/ToastComponents.d.ts +15 -0
  331. package/dist/types/global-account/react/components/Toast/ToastContext.d.ts +19 -0
  332. package/dist/types/global-account/react/components/Toast/index.d.ts +4 -0
  333. package/dist/types/global-account/react/components/Toast/toastApi.d.ts +21 -0
  334. package/dist/types/global-account/react/components/WalletImage/WalletImage.d.ts +4 -0
  335. package/dist/types/global-account/react/components/icons/BellIcon.d.ts +3 -0
  336. package/dist/types/global-account/react/components/icons/ChevronDownIcon.d.ts +2 -0
  337. package/dist/types/global-account/react/components/icons/CopyIcon.d.ts +2 -0
  338. package/dist/types/global-account/react/components/icons/LinkIcon.d.ts +3 -0
  339. package/dist/types/global-account/react/components/icons/LockIcon.d.ts +3 -0
  340. package/dist/types/global-account/react/components/icons/WalletIcon.d.ts +2 -0
  341. package/dist/types/global-account/react/components/index.d.ts +10 -4
  342. package/dist/types/global-account/react/hooks/index.d.ts +3 -2
  343. package/dist/types/global-account/react/hooks/useAccountWallet.d.ts +1 -0
  344. package/dist/types/global-account/react/hooks/useNotifications.d.ts +48 -0
  345. package/dist/types/global-account/react/hooks/useTokenBalanceDirect.d.ts +1 -0
  346. package/dist/types/global-account/react/stores/index.d.ts +1 -0
  347. package/dist/types/global-account/react/stores/useModalStore.d.ts +47 -6
  348. package/dist/types/global-account/react/stores/useRecentAddressesStore.d.ts +25 -0
  349. package/dist/types/global-account/react/utils/index.d.ts +4 -0
  350. package/dist/types/global-account/react/utils/notificationsAPI.d.ts +80 -0
  351. package/dist/types/global-account/react/utils/profileDisplay.d.ts +3 -0
  352. package/dist/types/global-account/react/utils/toast.d.ts +6 -0
  353. package/dist/types/shared/constants/chains/supported.d.ts +3 -2
  354. package/package.json +2 -1
  355. package/src/anyspend/react/components/AnySpend.tsx +213 -173
  356. package/src/anyspend/react/components/AnySpendBuySpin.tsx +2 -1
  357. package/src/anyspend/react/components/AnySpendCustom.tsx +80 -77
  358. package/src/anyspend/react/components/AnySpendCustomExactIn.tsx +20 -4
  359. package/src/anyspend/react/components/AnySpendStakeB3.tsx +2 -1
  360. package/src/anyspend/react/components/AnySpendStakeB3ExactIn.tsx +2 -1
  361. package/src/anyspend/react/components/AnyspendDepositHype.tsx +3 -0
  362. package/src/anyspend/react/components/common/CryptoPaymentMethod.tsx +56 -22
  363. package/src/anyspend/react/components/common/FeeDetailPanel.tsx +1 -1
  364. package/src/anyspend/react/components/common/FiatPaymentMethod.tsx +2 -2
  365. package/src/anyspend/react/components/common/InsufficientDepositPayment.tsx +1 -1
  366. package/src/anyspend/react/components/common/OrderDetails.tsx +6 -2
  367. package/src/anyspend/react/components/common/OrderDetailsCollapsible.tsx +2 -2
  368. package/src/anyspend/react/components/common/OrderHistory.tsx +8 -13
  369. package/src/anyspend/react/components/common/OrderHistoryItem.tsx +69 -25
  370. package/src/anyspend/react/components/common/PanelOnramp.tsx +6 -4
  371. package/src/anyspend/react/components/common/PanelOnrampPayment.tsx +3 -3
  372. package/src/anyspend/react/components/common/PointsDetailPanel.tsx +1 -1
  373. package/src/anyspend/react/components/common/RecipientSelection.tsx +1 -1
  374. package/src/anyspend/react/components/common/TransferCryptoDetails.tsx +2 -2
  375. package/src/anyspend/react/components/webview/WebviewOnrampOrderStatus.tsx +3 -3
  376. package/src/anyspend/react/components/webview/WebviewOnrampPayment.tsx +2 -1
  377. package/src/anyspend/react/hooks/useAnyspendFlow.ts +2 -1
  378. package/src/anyspend/react/hooks/useConnectedWalletDisplay.ts +3 -2
  379. package/src/anyspend/react/hooks/usePhantomTransfer.ts +1 -1
  380. package/src/anyspend/react/utils/toast.ts +6 -0
  381. package/src/global-account/react/components/AccountAssets/AccountAssets.tsx +115 -25
  382. package/src/global-account/react/components/AvatarCreator/AvatarCreator.tsx +2 -2
  383. package/src/global-account/react/components/AvatarEditor/AvatarEditor.tsx +491 -130
  384. package/src/global-account/react/components/B3DynamicModal.tsx +76 -17
  385. package/src/global-account/react/components/B3Provider/B3Provider.tsx +40 -20
  386. package/src/global-account/react/components/Deposit/Deposit.tsx +208 -0
  387. package/src/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.tsx +84 -0
  388. package/src/global-account/react/components/LinkAccount/LinkAccount.tsx +269 -434
  389. package/src/global-account/react/components/LinkAccount/LinkNewAccount.tsx +480 -0
  390. package/src/global-account/react/components/LinkAccount/LinkedAccountItem.tsx +135 -0
  391. package/src/global-account/react/components/ManageAccount/BottomNavigation.tsx +83 -0
  392. package/src/global-account/react/components/ManageAccount/ContentTokens.tsx +2 -1
  393. package/src/global-account/react/components/ManageAccount/Header.tsx +230 -0
  394. package/src/global-account/react/components/ManageAccount/HomeActions.tsx +118 -0
  395. package/src/global-account/react/components/ManageAccount/HomeContent.tsx +42 -0
  396. package/src/global-account/react/components/ManageAccount/ManageAccount.tsx +74 -597
  397. package/src/global-account/react/components/ManageAccount/NFTContent.tsx +24 -0
  398. package/src/global-account/react/components/ManageAccount/NotificationChannel.tsx +94 -0
  399. package/src/global-account/react/components/ManageAccount/NotificationsContent.tsx +268 -0
  400. package/src/global-account/react/components/ManageAccount/ProfileSection.tsx +79 -0
  401. package/src/global-account/react/components/ManageAccount/SettingsContent.tsx +106 -0
  402. package/src/global-account/react/components/ManageAccount/SettingsMenuItem.tsx +31 -0
  403. package/src/global-account/react/components/ManageAccount/SettingsProfileCard.tsx +197 -0
  404. package/src/global-account/react/components/ManageAccount/TokenBalanceRow.tsx +20 -5
  405. package/src/global-account/react/components/ManageAccount/TokenContent.tsx +66 -0
  406. package/src/global-account/react/components/ManageAccount/channels/DiscordChannel.tsx +119 -0
  407. package/src/global-account/react/components/ManageAccount/channels/EmailChannel.tsx +168 -0
  408. package/src/global-account/react/components/ManageAccount/channels/PhoneChannel.tsx +227 -0
  409. package/src/global-account/react/components/ManageAccount/channels/TelegramChannel.tsx +150 -0
  410. package/src/global-account/react/components/ManageAccount/channels/index.ts +4 -0
  411. package/src/global-account/react/components/ModalHeader/ModalHeader.tsx +61 -0
  412. package/src/global-account/react/components/Send/Send.tsx +621 -0
  413. package/src/global-account/react/components/SignInWithB3/SignIn.tsx +13 -12
  414. package/src/global-account/react/components/SignInWithB3/SignInWithB3Flow.tsx +1 -1
  415. package/src/global-account/react/components/Toast/README.md +350 -0
  416. package/src/global-account/react/components/Toast/ToastComponents.tsx +159 -0
  417. package/src/global-account/react/components/Toast/ToastContext.tsx +86 -0
  418. package/src/global-account/react/components/Toast/index.ts +4 -0
  419. package/src/global-account/react/components/Toast/toastApi.ts +98 -0
  420. package/src/global-account/react/components/WalletImage/WalletImage.tsx +12 -0
  421. package/src/global-account/react/components/icons/BellIcon.tsx +15 -0
  422. package/src/global-account/react/components/icons/ChevronDownIcon.tsx +17 -0
  423. package/src/global-account/react/components/icons/CopyIcon.tsx +22 -0
  424. package/src/global-account/react/components/icons/LinkIcon.tsx +15 -0
  425. package/src/global-account/react/components/icons/LockIcon.tsx +15 -0
  426. package/src/global-account/react/components/icons/WalletIcon.tsx +21 -0
  427. package/src/global-account/react/components/index.ts +19 -5
  428. package/src/global-account/react/components/ui/Tabs.tsx +5 -13
  429. package/src/global-account/react/components/ui/dialog.tsx +23 -14
  430. package/src/global-account/react/components/ui/drawer.tsx +1 -1
  431. package/src/global-account/react/hooks/index.ts +5 -1
  432. package/src/global-account/react/hooks/useAccountWallet.tsx +26 -0
  433. package/src/global-account/react/hooks/useB3BalanceFromAddresses.ts +1 -0
  434. package/src/global-account/react/hooks/useChainSwitchWithAction.ts +3 -2
  435. package/src/global-account/react/hooks/useNativeBalance.tsx +2 -1
  436. package/src/global-account/react/hooks/useNotifications.ts +229 -0
  437. package/src/global-account/react/hooks/useSimBalance.ts +3 -3
  438. package/src/global-account/react/hooks/useTokenBalanceDirect.tsx +2 -0
  439. package/src/global-account/react/hooks/useUnifiedChainSwitchAndExecute.ts +3 -2
  440. package/src/global-account/react/stores/index.ts +1 -0
  441. package/src/global-account/react/stores/useModalStore.ts +53 -6
  442. package/src/global-account/react/stores/useRecentAddressesStore.ts +54 -0
  443. package/src/global-account/react/utils/index.ts +4 -0
  444. package/src/global-account/react/utils/notificationsAPI.ts +305 -0
  445. package/src/global-account/react/utils/profileDisplay.ts +12 -4
  446. package/src/global-account/react/utils/toast.ts +6 -0
  447. package/src/shared/constants/chains/supported.ts +4 -0
  448. package/src/shared/utils/ipfs.ts +10 -3
  449. package/src/styles/index.css +12 -1
  450. package/dist/cjs/global-account/react/components/ManageAccount/BalanceContent.d.ts +0 -7
  451. package/dist/cjs/global-account/react/components/ManageAccount/BalanceContent.js +0 -107
  452. package/dist/cjs/global-account/react/components/ProfileEditor/ProfileEditor.d.ts +0 -6
  453. package/dist/cjs/global-account/react/components/ProfileEditor/ProfileEditor.js +0 -151
  454. package/dist/esm/global-account/react/components/ManageAccount/BalanceContent.d.ts +0 -7
  455. package/dist/esm/global-account/react/components/ManageAccount/BalanceContent.js +0 -104
  456. package/dist/esm/global-account/react/components/ProfileEditor/ProfileEditor.d.ts +0 -6
  457. package/dist/esm/global-account/react/components/ProfileEditor/ProfileEditor.js +0 -145
  458. package/dist/types/global-account/react/components/ManageAccount/BalanceContent.d.ts +0 -7
  459. package/dist/types/global-account/react/components/ProfileEditor/ProfileEditor.d.ts +0 -6
  460. package/src/global-account/react/components/ManageAccount/BalanceContent.tsx +0 -258
  461. package/src/global-account/react/components/ProfileEditor/ProfileEditor.tsx +0 -279
@@ -0,0 +1,621 @@
1
+ import { ALL_CHAINS, getExplorerTxUrl } from "@b3dotfun/sdk/anyspend";
2
+ import { ChainTokenIcon } from "@b3dotfun/sdk/anyspend/react/components/common/ChainTokenIcon";
3
+ import {
4
+ toast,
5
+ useAccountWallet,
6
+ useAnalytics,
7
+ useModalStore,
8
+ useProfile,
9
+ useSimBalance,
10
+ useUnifiedChainSwitchAndExecute,
11
+ } from "@b3dotfun/sdk/global-account/react";
12
+ import { formatDisplayNumber, formatTokenAmount } from "@b3dotfun/sdk/shared/utils/number";
13
+ import invariant from "invariant";
14
+ import { CircleHelp, Clock, Loader2, Send as SendIcon, Wallet } from "lucide-react";
15
+ import { useState } from "react";
16
+ import { NumericFormat } from "react-number-format";
17
+
18
+ import { encodeFunctionData, erc20Abi, isAddress, parseUnits } from "viem";
19
+
20
+ import type { SimBalanceItem } from "../../hooks/useSimBalance";
21
+ import { useRecentAddressesStore } from "../../stores/useRecentAddressesStore";
22
+ import ModalHeader from "../ModalHeader/ModalHeader";
23
+ import { Button } from "../ui/button";
24
+
25
+ export interface SendModalProps {
26
+ recipientAddress?: string;
27
+ onSuccess?: (txHash?: string) => void;
28
+ }
29
+
30
+ type SendStep = "recipient" | "token" | "amount" | "confirm" | "success";
31
+
32
+ // Component for displaying a recent address with profile data
33
+ function RecentAddressItem({ address, onClick }: { address: string; onClick: () => void }) {
34
+ const { data: profileData } = useProfile({ address });
35
+
36
+ return (
37
+ <button
38
+ onClick={onClick}
39
+ className="flex items-center gap-2 rounded-xl px-3 py-2 transition-colors hover:bg-[#fafafa]"
40
+ >
41
+ {/* Avatar */}
42
+ {profileData?.avatar ? (
43
+ <img src={profileData.avatar} alt={profileData.name || address} className="h-10 w-10 rounded-full" />
44
+ ) : (
45
+ <div className="flex h-10 w-10 items-center justify-center rounded-full border border-[#e4e4e7] bg-[#f4f4f5]">
46
+ <Wallet className="h-5 w-5 text-[#a0a0ab]" />
47
+ </div>
48
+ )}
49
+ {/* Address and Name */}
50
+ <div className="flex flex-col items-start">
51
+ <span className="font-neue-montreal-medium text-base tracking-[-0.32px] text-[#70707b]">
52
+ {address.slice(0, 6)}...{address.slice(-4)}
53
+ {profileData?.name && ` (${profileData.name})`}
54
+ </span>
55
+ </div>
56
+ </button>
57
+ );
58
+ }
59
+
60
+ export function Send({ recipientAddress: initialRecipient, onSuccess }: SendModalProps) {
61
+ const { address } = useAccountWallet();
62
+ const navigateBack = useModalStore(state => state.navigateBack);
63
+ const setB3ModalOpen = useModalStore(state => state.setB3ModalOpen);
64
+
65
+ // Wizard state
66
+ const [step, setStep] = useState<SendStep>("recipient");
67
+ const [selectedToken, setSelectedToken] = useState<SimBalanceItem | null>(null);
68
+ const [recipientAddress, setRecipientAddress] = useState(initialRecipient || "");
69
+ const [sendAmount, setSendAmount] = useState("");
70
+ const [isSending, setIsSending] = useState(false);
71
+ const [addressError, setAddressError] = useState("");
72
+ const [showValidatedResult, setShowValidatedResult] = useState(false);
73
+
74
+ // Hooks
75
+ const { data: simBalance, refetch: refetchSimBalance, isLoading: isLoadingBalance } = useSimBalance(address);
76
+ const { switchChainAndExecute } = useUnifiedChainSwitchAndExecute();
77
+ const { sendAnalyticsEvent } = useAnalytics();
78
+
79
+ // Recent addresses store
80
+ const recentAddresses = useRecentAddressesStore(state => state.recentAddresses);
81
+ const addRecentAddress = useRecentAddressesStore(state => state.addRecentAddress);
82
+
83
+ // Fetch profile data for validated address
84
+ const { data: validatedProfileData } = useProfile({
85
+ address: showValidatedResult && recipientAddress && isAddress(recipientAddress) ? recipientAddress : undefined,
86
+ });
87
+
88
+ // Address validation
89
+ const handleRecipientAddressChange = (value: string) => {
90
+ setRecipientAddress(value);
91
+ setShowValidatedResult(false);
92
+ if (value && !isAddress(value)) {
93
+ setAddressError("Please enter a valid EVM address (0x...)");
94
+ } else {
95
+ setAddressError("");
96
+ if (value && isAddress(value)) {
97
+ setShowValidatedResult(true);
98
+ }
99
+ }
100
+ };
101
+
102
+ // Paste from clipboard
103
+ const handlePaste = async () => {
104
+ try {
105
+ const text = await navigator.clipboard.readText();
106
+ const trimmedText = text.trim();
107
+ setRecipientAddress(trimmedText);
108
+
109
+ if (trimmedText && isAddress(trimmedText)) {
110
+ setAddressError("");
111
+ setShowValidatedResult(true);
112
+ } else if (trimmedText) {
113
+ setAddressError("Please enter a valid EVM address (0x...)");
114
+ setShowValidatedResult(false);
115
+ }
116
+ } catch (error) {
117
+ toast.error("Failed to read clipboard");
118
+ }
119
+ };
120
+
121
+ // Handle clicking on the validated result to proceed
122
+ const handleSelectValidatedAddress = () => {
123
+ if (recipientAddress && isAddress(recipientAddress)) {
124
+ addRecentAddress(recipientAddress);
125
+ setStep("token");
126
+ }
127
+ };
128
+
129
+ // Go to previous step
130
+ const handleBack = () => {
131
+ if (step === "token") setStep("recipient");
132
+ else if (step === "amount") setStep("token");
133
+ else if (step === "confirm") setStep("amount");
134
+ else navigateBack();
135
+ };
136
+
137
+ // Get current selected token from fresh balance
138
+ const getCurrentSelectedToken = (): SimBalanceItem | null => {
139
+ if (!selectedToken || !simBalance?.balances) {
140
+ return null;
141
+ }
142
+ const found = simBalance.balances.find(
143
+ token => token.chain_id === selectedToken.chain_id && token.address === selectedToken.address,
144
+ );
145
+ return found || null;
146
+ };
147
+
148
+ // Percentage button handler
149
+ const handlePercentageClick = (percentage: number) => {
150
+ const currentToken = getCurrentSelectedToken();
151
+ if (currentToken) {
152
+ const tokenBalance = (BigInt(currentToken.amount) * BigInt(percentage)) / BigInt(100);
153
+ const amount = formatTokenAmount(tokenBalance, currentToken.decimals, 30, false);
154
+ setSendAmount(amount);
155
+ }
156
+ };
157
+
158
+ // Send transaction
159
+ const handleSend = async () => {
160
+ const sendAmountWithoutCommas = sendAmount.replace(/,/g, "");
161
+ const currentToken = getCurrentSelectedToken();
162
+
163
+ if (!currentToken || !recipientAddress || !sendAmount || parseFloat(sendAmountWithoutCommas) <= 0) {
164
+ return;
165
+ }
166
+
167
+ setIsSending(true);
168
+
169
+ const amountInWei = parseUnits(sendAmountWithoutCommas, currentToken.decimals);
170
+
171
+ const analyticsData = {
172
+ amount: sendAmount,
173
+ symbol: currentToken.symbol,
174
+ chain_id: currentToken.chain_id,
175
+ address: currentToken.address,
176
+ };
177
+
178
+ try {
179
+ invariant(isAddress(recipientAddress), "Recipient address is not a valid address");
180
+
181
+ const sendTokenData = encodeFunctionData({
182
+ abi: erc20Abi,
183
+ functionName: "transfer",
184
+ args: [recipientAddress, amountInWei],
185
+ });
186
+
187
+ const tx = await switchChainAndExecute(currentToken.chain_id, {
188
+ to: currentToken.address === "native" ? recipientAddress : currentToken.address,
189
+ data: sendTokenData,
190
+ value: currentToken.address === "native" ? amountInWei : BigInt(0),
191
+ });
192
+
193
+ if (tx) {
194
+ sendAnalyticsEvent("send_token_button_click", {
195
+ ...analyticsData,
196
+ success: true,
197
+ tx: getExplorerTxUrl(currentToken.chain_id, tx),
198
+ });
199
+
200
+ setStep("success");
201
+ toast.success(`Successfully sent ${sendAmount} ${currentToken.symbol}`);
202
+
203
+ if (onSuccess) {
204
+ onSuccess(tx);
205
+ }
206
+
207
+ setTimeout(async () => {
208
+ await refetchSimBalance();
209
+ }, 1000);
210
+ }
211
+ } catch (error: any) {
212
+ sendAnalyticsEvent("send_token_button_click", {
213
+ ...analyticsData,
214
+ success: false,
215
+ reason: error.message || "Unknown error",
216
+ });
217
+
218
+ toast.error(`Failed to send ${currentToken.symbol}: ${error.message || "Unknown error"}`);
219
+ } finally {
220
+ setIsSending(false);
221
+ }
222
+ };
223
+
224
+ // Get step title
225
+ const getStepTitle = () => {
226
+ switch (step) {
227
+ case "recipient":
228
+ return "Select Recipient";
229
+ case "token":
230
+ return "Select Token";
231
+ case "amount":
232
+ return "Enter Amount";
233
+ case "confirm":
234
+ return "Confirm";
235
+ case "success":
236
+ return "Sent!";
237
+ default:
238
+ return "Send";
239
+ }
240
+ };
241
+
242
+ return (
243
+ <div className="flex h-[600px] w-full flex-col bg-white">
244
+ <ModalHeader handleBack={handleBack} title={getStepTitle()} />
245
+
246
+ {/* Content - 20px padding */}
247
+ <div className="flex-1 overflow-y-auto">
248
+ {step === "recipient" && (
249
+ <div className="flex flex-col gap-6 p-5">
250
+ {/* Input field - 48px height */}
251
+ <div className="flex h-12 w-full items-stretch overflow-hidden rounded-lg border border-[#d1d1d6] bg-white">
252
+ {/* "To" addon - 48px width */}
253
+ <div className="flex w-12 items-center justify-center bg-transparent px-3 py-2">
254
+ <span className="font-neue-montreal-medium text-base text-[#3f3f46]">To</span>
255
+ </div>
256
+ {/* Input */}
257
+ <div className="flex flex-1 items-center border-l border-[#d1d1d6] px-3 py-2">
258
+ <input
259
+ type="text"
260
+ value={recipientAddress}
261
+ onChange={e => handleRecipientAddressChange(e.target.value)}
262
+ placeholder="ENS or Address"
263
+ className="font-neue-montreal-medium flex-1 text-base text-[#70707b] outline-none placeholder:text-[#70707b]"
264
+ />
265
+ {/* Paste badge */}
266
+ <button
267
+ onClick={handlePaste}
268
+ className="font-inter ml-2 rounded-md border border-[#e4e4e7] bg-[#fafafa] px-2.5 py-0.5 text-sm font-medium text-[#3f3f46] transition-colors hover:bg-[#f4f4f5]"
269
+ >
270
+ Paste
271
+ </button>
272
+ </div>
273
+ </div>
274
+
275
+ {addressError && <p className="font-neue-montreal-medium -mt-4 text-xs text-red-500">{addressError}</p>}
276
+
277
+ {/* Validated Result Section */}
278
+ {showValidatedResult && recipientAddress && isAddress(recipientAddress) && (
279
+ <div className="flex flex-col gap-2">
280
+ {/* Result Header */}
281
+ <div className="flex items-center gap-1">
282
+ <span className="font-sf-pro-text text-sm font-semibold leading-[1.3] tracking-[-0.41px] text-[#0b57c2]">
283
+ Result
284
+ </span>
285
+ </div>
286
+
287
+ {/* Validated Address Card */}
288
+ <button
289
+ onClick={handleSelectValidatedAddress}
290
+ className="flex items-center gap-2 rounded-xl bg-[#f4f4f5] px-3 py-2 transition-colors hover:bg-[#e4e4e7]"
291
+ >
292
+ {/* Avatar */}
293
+ {validatedProfileData?.avatar ? (
294
+ <img
295
+ src={validatedProfileData.avatar}
296
+ alt={validatedProfileData.name || recipientAddress}
297
+ className="h-10 w-10 rounded-full"
298
+ />
299
+ ) : (
300
+ <div className="flex h-10 w-10 items-center justify-center rounded-full border border-[#e4e4e7] bg-[#f4f4f5]">
301
+ <Wallet className="h-5 w-5 text-[#a0a0ab]" />
302
+ </div>
303
+ )}
304
+ {/* Address and Name */}
305
+ <span className="font-neue-montreal-medium text-base tracking-[-0.32px] text-[#70707b]">
306
+ {recipientAddress.slice(0, 6)}...{recipientAddress.slice(-4)}
307
+ {validatedProfileData?.name && ` (${validatedProfileData.name})`}
308
+ </span>
309
+ </button>
310
+ </div>
311
+ )}
312
+
313
+ {/* Recents Container */}
314
+ {recentAddresses.length > 0 && (
315
+ <div className="flex flex-col gap-2">
316
+ {/* Recents Header */}
317
+ <div className="flex items-center gap-1">
318
+ <Clock className="h-3.5 w-3.5 text-[#3f3f46]" />
319
+ <span className="font-sf-pro-text text-sm font-semibold leading-[1.3] tracking-[-0.41px] text-[#3f3f46]">
320
+ Recents
321
+ </span>
322
+ </div>
323
+
324
+ {/* Recent addresses list */}
325
+ <div className="flex flex-col">
326
+ {recentAddresses.map((recent, index) => (
327
+ <RecentAddressItem
328
+ key={index}
329
+ address={recent.address}
330
+ onClick={() => {
331
+ // Just fill the input and show validation - don't auto-proceed
332
+ handleRecipientAddressChange(recent.address);
333
+ }}
334
+ />
335
+ ))}
336
+ </div>
337
+ </div>
338
+ )}
339
+ </div>
340
+ )}
341
+
342
+ {step === "token" && (
343
+ <div className="flex flex-col p-5">
344
+ {isLoadingBalance ? (
345
+ <div className="space-y-4">
346
+ <div className="space-y-1">
347
+ {[...Array(3)].map((_, index) => (
348
+ <div key={index} className="flex items-center justify-between rounded-xl p-3">
349
+ <div className="flex items-center gap-3">
350
+ <div className="bg-b3-line h-10 w-10 animate-pulse rounded-full"></div>
351
+ <div>
352
+ <div className="bg-b3-line mb-1 h-4 w-16 animate-pulse rounded"></div>
353
+ <div className="bg-b3-line h-3 w-24 animate-pulse rounded"></div>
354
+ </div>
355
+ </div>
356
+ <div className="text-right">
357
+ <div className="bg-b3-line mb-1 h-4 w-20 animate-pulse rounded"></div>
358
+ <div className="bg-b3-line h-3 w-16 animate-pulse rounded"></div>
359
+ </div>
360
+ </div>
361
+ ))}
362
+ </div>
363
+ </div>
364
+ ) : simBalance?.balances && simBalance.balances.length > 0 ? (
365
+ <div className="space-y-4">
366
+ <div className="space-y-1">
367
+ {simBalance.balances.map(token => (
368
+ <div
369
+ key={token.chain_id + "_" + token.address}
370
+ className="hover:bg-b3-line/60 dark:hover:bg-b3-primary-wash/40 group flex cursor-pointer items-center justify-between rounded-xl p-3 transition-all duration-200"
371
+ onClick={() => {
372
+ setSelectedToken(token);
373
+ setStep("amount");
374
+ }}
375
+ >
376
+ <div className="flex items-center gap-3">
377
+ <div className="flex h-10 w-10 items-center justify-center rounded-full">
378
+ {ALL_CHAINS[token.chain_id]?.logoUrl ? (
379
+ <ChainTokenIcon
380
+ chainUrl={ALL_CHAINS[token.chain_id].logoUrl}
381
+ tokenUrl={token.token_metadata?.logo}
382
+ className="size-10"
383
+ />
384
+ ) : (
385
+ <CircleHelp className="text-b3-react-foreground size-10" />
386
+ )}
387
+ </div>
388
+ <div>
389
+ <div className="flex items-center gap-2">
390
+ <span className="text-b3-grey font-neue-montreal-semibold transition-colors duration-200 group-hover:font-bold group-hover:text-black">
391
+ {token.symbol}
392
+ </span>
393
+ </div>
394
+ <div className="text-b3-foreground-muted font-neue-montreal-medium text-sm transition-colors duration-200 group-hover:text-gray-700">
395
+ {token.name}
396
+ </div>
397
+ </div>
398
+ </div>
399
+ <div className="text-right">
400
+ <div className="text-b3-grey font-neue-montreal-semibold transition-colors duration-200 group-hover:font-bold group-hover:text-black">
401
+ {formatTokenAmount(BigInt(token.amount), token.decimals)}
402
+ </div>
403
+ <div className="text-b3-foreground-muted font-neue-montreal-medium text-sm transition-colors duration-200 group-hover:text-gray-700">
404
+ {formatDisplayNumber(token.value_usd, { style: "currency", fractionDigits: 2 })}
405
+ </div>
406
+ </div>
407
+ </div>
408
+ ))}
409
+ </div>
410
+ </div>
411
+ ) : (
412
+ <div className="flex flex-col items-center justify-center py-12 text-center">
413
+ <CircleHelp className="text-b3-foreground-muted mb-4 h-8 w-8" />
414
+ <p className="text-b3-foreground-muted font-neue-montreal-medium text-sm">No tokens available</p>
415
+ </div>
416
+ )}
417
+ </div>
418
+ )}
419
+
420
+ {step === "amount" && selectedToken && (
421
+ <div className="flex flex-col gap-6 p-5">
422
+ {/* Selected Token Display */}
423
+ <div className="flex items-center justify-between rounded-xl border border-[#d1d1d6] bg-[#fafafa] p-3">
424
+ <div className="flex items-center gap-3">
425
+ <div className="flex h-10 w-10 items-center justify-center">
426
+ {ALL_CHAINS[selectedToken.chain_id]?.logoUrl ? (
427
+ <ChainTokenIcon
428
+ chainUrl={ALL_CHAINS[selectedToken.chain_id].logoUrl}
429
+ tokenUrl={selectedToken.token_metadata?.logo}
430
+ className="size-10"
431
+ />
432
+ ) : (
433
+ <CircleHelp className="text-b3-react-foreground size-10" />
434
+ )}
435
+ </div>
436
+ <div>
437
+ <div className="font-neue-montreal-semibold text-base text-[#18181b]">{selectedToken.symbol}</div>
438
+ <div className="font-neue-montreal-medium text-sm text-[#70707b]">
439
+ {formatTokenAmount(BigInt(selectedToken.amount), selectedToken.decimals)}
440
+ </div>
441
+ </div>
442
+ </div>
443
+ <button
444
+ onClick={() => setStep("token")}
445
+ className="text-b3-primary-blue font-neue-montreal-semibold hover:text-b3-primary-blue/80 text-sm transition-colors"
446
+ >
447
+ Change
448
+ </button>
449
+ </div>
450
+
451
+ {/* Amount Input */}
452
+ <div className="space-y-3">
453
+ <NumericFormat
454
+ decimalSeparator="."
455
+ allowedDecimalSeparators={[","]}
456
+ thousandSeparator
457
+ inputMode="decimal"
458
+ autoComplete="off"
459
+ autoCorrect="off"
460
+ type="text"
461
+ placeholder="0.00"
462
+ minLength={1}
463
+ maxLength={30}
464
+ spellCheck="false"
465
+ className="font-neue-montreal-medium placeholder:text-b3-foreground-muted w-full rounded-lg border border-[#d1d1d6] bg-white px-3 py-2 text-base text-[#18181b] outline-none focus:border-[#0c68e9]"
466
+ pattern="^[0-9]*[.,]?[0-9]*$"
467
+ disabled={isSending}
468
+ value={sendAmount}
469
+ allowNegative={false}
470
+ onValueChange={values => setSendAmount(values.value)}
471
+ />
472
+
473
+ {/* Percentage buttons */}
474
+ <div className="grid grid-cols-4 gap-2">
475
+ {[25, 50, 75, 100].map(percentage => (
476
+ <Button
477
+ key={percentage}
478
+ variant="outline"
479
+ onClick={() => handlePercentageClick(percentage)}
480
+ className="font-neue-montreal-medium border-[#d1d1d6] text-sm text-[#18181b] hover:bg-[#fafafa]"
481
+ disabled={isSending}
482
+ >
483
+ {percentage}%
484
+ </Button>
485
+ ))}
486
+ </div>
487
+
488
+ {/* Available balance */}
489
+ <div className="font-neue-montreal-medium text-sm text-[#70707b]">
490
+ Available: {formatTokenAmount(BigInt(selectedToken.amount), selectedToken.decimals)}{" "}
491
+ {selectedToken.symbol}
492
+ </div>
493
+ </div>
494
+
495
+ {/* Continue Button */}
496
+ <Button
497
+ onClick={() => setStep("confirm")}
498
+ disabled={!sendAmount || parseFloat(sendAmount) <= 0}
499
+ className="bg-b3-primary-blue hover:bg-b3-primary-blue/90 font-neue-montreal-semibold disabled:bg-b3-line disabled:text-b3-foreground-muted h-12 w-full rounded-xl text-white"
500
+ >
501
+ Continue
502
+ </Button>
503
+ </div>
504
+ )}
505
+
506
+ {step === "confirm" && selectedToken && (
507
+ <div className="flex min-h-full flex-col">
508
+ {/* Top section with icon and amount */}
509
+ <div className="flex flex-col items-center gap-4 px-5 pb-0 pt-6">
510
+ {/* Send icon */}
511
+ <div className="flex h-14 w-14 items-center justify-center rounded-full bg-[#d5e5fd]">
512
+ <SendIcon className="h-7 w-7 text-[#0c68e9]" />
513
+ </div>
514
+
515
+ {/* Amount */}
516
+ <div className="flex items-center gap-1">
517
+ <span className="font-neue-montreal-semibold text-[30px] leading-[38px] text-[#18181b]">
518
+ {sendAmount}
519
+ </span>
520
+ <span className="font-neue-montreal-semibold text-[30px] leading-[38px] text-[#70707b]">
521
+ {selectedToken.symbol}
522
+ </span>
523
+ </div>
524
+ </div>
525
+
526
+ {/* Spacing */}
527
+ <div className="h-5" />
528
+
529
+ {/* Transaction details */}
530
+ <div className="flex flex-col gap-3 px-5">
531
+ <div className="rounded-xl border border-[#e4e4e7] bg-[#fafafa] p-4">
532
+ <div className="flex flex-col gap-3">
533
+ {/* To */}
534
+ <div className="flex items-center justify-between border-b border-[#e4e4e7] pb-3">
535
+ <span className="font-inter text-sm font-normal leading-5 text-[#51525c]">To</span>
536
+ <span className="font-inter text-sm font-normal leading-5 text-[#18181b]">
537
+ Wallet ({recipientAddress.slice(0, 6)}...{recipientAddress.slice(-4)})
538
+ </span>
539
+ </div>
540
+
541
+ {/* Network */}
542
+ <div className="flex items-center justify-between border-b border-[#e4e4e7] pb-3">
543
+ <span className="font-inter text-sm font-normal leading-5 text-[#51525c]">Network</span>
544
+ <div className="flex items-center gap-1.5">
545
+ <span className="font-inter text-sm font-normal leading-5 text-[#51525c]">
546
+ {ALL_CHAINS[selectedToken.chain_id]?.name || "Unknown"}
547
+ </span>
548
+ {ALL_CHAINS[selectedToken.chain_id]?.logoUrl && (
549
+ <img
550
+ src={ALL_CHAINS[selectedToken.chain_id].logoUrl}
551
+ alt={ALL_CHAINS[selectedToken.chain_id]?.name}
552
+ className="h-4 w-4 rounded-full"
553
+ />
554
+ )}
555
+ </div>
556
+ </div>
557
+
558
+ {/* Network fee */}
559
+ <div className="flex items-center justify-between">
560
+ <span className="font-inter text-sm font-normal leading-5 text-[#51525c]">Network fee</span>
561
+ <span className="font-inter text-sm font-normal leading-5 text-[#18181b]">$0.1</span>
562
+ </div>
563
+ </div>
564
+ </div>
565
+ </div>
566
+
567
+ {/* Spacer to push buttons to bottom */}
568
+ <div className="flex-1" />
569
+
570
+ {/* Bottom buttons */}
571
+ <div className="flex gap-4 border-t border-[#e4e4e7] bg-[#fafafa] p-4">
572
+ <Button
573
+ onClick={handleBack}
574
+ disabled={isSending}
575
+ variant="outline"
576
+ className="font-inter h-12 flex-1 rounded-xl border border-[#e4e4e7] bg-white text-base font-semibold text-[#3f3f46] shadow-[inset_0px_0px_0px_1px_rgba(10,13,18,0.18),inset_0px_-2px_0px_0px_rgba(10,13,18,0.05)] hover:bg-[#fafafa]"
577
+ >
578
+ Cancel
579
+ </Button>
580
+ <Button
581
+ onClick={handleSend}
582
+ disabled={isSending}
583
+ className="font-inter border-white/12 h-12 flex-1 rounded-xl border-2 bg-[#0c68e9] text-base font-semibold text-white shadow-[inset_0px_0px_0px_1px_rgba(10,13,18,0.18),inset_0px_-2px_0px_0px_rgba(10,13,18,0.05)] hover:bg-[#0b5fd4]"
584
+ >
585
+ {isSending ? (
586
+ <>
587
+ <Loader2 className="mr-2 h-4 w-4 animate-spin" />
588
+ Sending...
589
+ </>
590
+ ) : (
591
+ "Send"
592
+ )}
593
+ </Button>
594
+ </div>
595
+ </div>
596
+ )}
597
+
598
+ {step === "success" && selectedToken && (
599
+ <div className="flex h-full flex-col items-center justify-center gap-6 p-5 text-center">
600
+ <div className="flex h-14 w-14 items-center justify-center rounded-full bg-green-100">
601
+ <SendIcon className="h-7 w-7 text-green-600" />
602
+ </div>
603
+ <div>
604
+ <h3 className="font-neue-montreal-semibold mb-2 text-xl text-[#18181b]">Sent!</h3>
605
+ <p className="font-neue-montreal-medium text-sm text-[#70707b]">
606
+ {sendAmount} {selectedToken.symbol} was sent to {recipientAddress.slice(0, 6)}...
607
+ {recipientAddress.slice(-4)}
608
+ </p>
609
+ </div>
610
+ <Button
611
+ onClick={() => setB3ModalOpen(false)}
612
+ className="bg-b3-primary-blue hover:bg-b3-primary-blue/90 font-neue-montreal-semibold h-12 w-full rounded-xl text-white"
613
+ >
614
+ Done
615
+ </Button>
616
+ </div>
617
+ )}
618
+ </div>
619
+ </div>
620
+ );
621
+ }