@b3dotfun/sdk 0.1.70-alpha.2 → 0.1.70-alpha.21

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 (355) hide show
  1. package/README.md +3 -3
  2. package/constants/chains/b3Chain.js +3 -1
  3. package/dist/cjs/anyspend/constants/rpc.d.ts +3 -1
  4. package/dist/cjs/anyspend/constants/rpc.js +6 -2
  5. package/dist/cjs/anyspend/react/components/AnySpend.d.ts +9 -1
  6. package/dist/cjs/anyspend/react/components/AnySpend.js +123 -46
  7. package/dist/cjs/anyspend/react/components/AnySpendCustomExactIn.js +8 -10
  8. package/dist/cjs/anyspend/react/components/AnySpendDeposit.d.ts +15 -3
  9. package/dist/cjs/anyspend/react/components/AnySpendDeposit.js +78 -25
  10. package/dist/cjs/anyspend/react/components/AnySpendStakeB3.js +32 -13
  11. package/dist/cjs/anyspend/react/components/AnySpendStakeB3ExactIn.js +32 -10
  12. package/dist/cjs/anyspend/react/components/QRDeposit.d.ts +22 -3
  13. package/dist/cjs/anyspend/react/components/QRDeposit.js +25 -16
  14. package/dist/cjs/anyspend/react/components/checkout/CryptoPayPanel.js +18 -11
  15. package/dist/cjs/anyspend/react/components/common/PureTransferView.d.ts +30 -0
  16. package/dist/cjs/anyspend/react/components/common/PureTransferView.js +64 -0
  17. package/dist/cjs/anyspend/react/components/common/TokenBalance.js +4 -5
  18. package/dist/cjs/anyspend/react/hooks/useCreateDepositFirstOrder.d.ts +3 -3
  19. package/dist/cjs/anyspend/react/hooks/useSigMint.d.ts +1 -1
  20. package/dist/cjs/anyspend/utils/address.d.ts +2 -1
  21. package/dist/cjs/anyspend/utils/address.js +12 -9
  22. package/dist/cjs/anyspend/utils/chain.d.ts +84 -1
  23. package/dist/cjs/anyspend/utils/chain.js +73 -3
  24. package/dist/cjs/anyspend/utils/token.d.ts +2 -0
  25. package/dist/cjs/anyspend/utils/token.js +15 -1
  26. package/dist/cjs/app.shared.d.ts +9 -1
  27. package/dist/cjs/app.shared.js +19 -0
  28. package/dist/cjs/global-account/app.native.d.ts +1 -1
  29. package/dist/cjs/global-account/better-auth-client.d.ts +3314 -36
  30. package/dist/cjs/global-account/better-auth-client.js +28 -3
  31. package/dist/cjs/global-account/bsmnt.d.ts +2 -2
  32. package/dist/cjs/global-account/bsmnt.native.d.ts +1 -1
  33. package/dist/cjs/global-account/client-manager.d.ts +7 -5
  34. package/dist/cjs/global-account/client-manager.js +51 -4
  35. package/dist/cjs/global-account/react/components/AvatarEditor/AvatarEditor.js +6 -11
  36. package/dist/cjs/global-account/react/components/B3Provider/B3ConfigProvider.d.ts +11 -0
  37. package/dist/cjs/global-account/react/components/B3Provider/B3ConfigProvider.js +12 -0
  38. package/dist/cjs/global-account/react/components/B3Provider/B3Provider.d.ts +12 -2
  39. package/dist/cjs/global-account/react/components/B3Provider/B3Provider.js +25 -3
  40. package/dist/cjs/global-account/react/components/B3Provider/BetterAuthProvider.js +45 -4
  41. package/dist/cjs/global-account/react/components/B3Provider/RelayKitProviderWrapper.d.ts +1 -2
  42. package/dist/cjs/global-account/react/components/B3Provider/RelayKitProviderWrapper.js +11 -5
  43. package/dist/cjs/global-account/react/components/ManageAccount/ContentTokens.js +23 -15
  44. package/dist/cjs/global-account/react/components/ManageAccount/NFTContent.js +2 -2
  45. package/dist/cjs/global-account/react/components/ManageAccount/ProfileSection.js +8 -6
  46. package/dist/cjs/global-account/react/components/ManageAccount/SettingsProfileCard.js +1 -1
  47. package/dist/cjs/global-account/react/components/ManageAccount/TokenContent.js +17 -8
  48. package/dist/cjs/global-account/react/components/Send/Send.js +15 -11
  49. package/dist/cjs/global-account/react/components/SignInWithB3/BetterAuthSignIn.js +3 -1
  50. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +1 -5
  51. package/dist/cjs/global-account/react/components/SignInWithB3/components/AuthButton.js +2 -1
  52. package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.js +1 -0
  53. package/dist/cjs/global-account/react/components/SignInWithB3/utils/signInUtils.d.ts +3 -2
  54. package/dist/cjs/global-account/react/components/SignInWithB3/utils/signInUtils.js +3 -3
  55. package/dist/cjs/global-account/react/components/index.d.ts +1 -1
  56. package/dist/cjs/global-account/react/components/index.js +3 -3
  57. package/dist/cjs/global-account/react/hooks/index.d.ts +2 -3
  58. package/dist/cjs/global-account/react/hooks/index.js +7 -10
  59. package/dist/cjs/global-account/react/hooks/useAuth.d.ts +5 -4
  60. package/dist/cjs/global-account/react/hooks/useAuth.js +1 -0
  61. package/dist/cjs/global-account/react/hooks/useAuthentication.d.ts +3 -2
  62. package/dist/cjs/global-account/react/hooks/useAuthentication.js +2 -1
  63. package/dist/cjs/global-account/react/hooks/useBetterAuth.d.ts +1657 -22
  64. package/dist/cjs/global-account/react/hooks/useBetterAuth.js +7 -7
  65. package/dist/cjs/global-account/react/hooks/useClient.d.ts +3 -3
  66. package/dist/cjs/global-account/react/hooks/useFirstEOA.d.ts +4 -7666
  67. package/dist/cjs/global-account/react/hooks/useFirstEOA.js +1 -0
  68. package/dist/cjs/global-account/react/hooks/useNativeBalance.js +2 -2
  69. package/dist/cjs/global-account/react/hooks/usePortfolioBalance.d.ts +15 -0
  70. package/dist/cjs/global-account/react/hooks/usePortfolioBalance.js +76 -0
  71. package/dist/cjs/global-account/react/hooks/usePortfolioCollectibles.d.ts +12 -0
  72. package/dist/cjs/global-account/react/hooks/usePortfolioCollectibles.js +178 -0
  73. package/dist/cjs/global-account/react/hooks/useSiwe.d.ts +1 -1
  74. package/dist/cjs/global-account/react/hooks/useSiwe.native.d.ts +1 -1
  75. package/dist/cjs/global-account/react/hooks/useTWAuth.d.ts +1 -1
  76. package/dist/cjs/global-account/react/hooks/useUnifiedChainSwitchAndExecute.d.ts +1 -0
  77. package/dist/cjs/global-account/react/hooks/useUnifiedChainSwitchAndExecute.js +37 -27
  78. package/dist/cjs/global-account/react/stores/useModalStore.d.ts +14 -2
  79. package/dist/cjs/global-account/types/b3-api.types.d.ts +5 -0
  80. package/dist/cjs/global-account/types/feature-flags.d.ts +5 -5
  81. package/dist/cjs/notifications/services/api.js +1 -0
  82. package/dist/cjs/shared/constants/chains/b3Chain.d.ts +30 -54
  83. package/dist/cjs/shared/constants/chains/b3Chain.js +5 -41
  84. package/dist/cjs/shared/constants/chains/supported.d.ts +1 -49
  85. package/dist/cjs/shared/constants/chains/supported.js +8 -36
  86. package/dist/cjs/shared/constants/index.d.ts +4 -0
  87. package/dist/cjs/shared/utils/chain-transformers.d.ts +4 -4
  88. package/dist/cjs/shared/utils/chain-transformers.js +38 -37
  89. package/dist/cjs/shared/utils/thirdweb-insights.js +2 -2
  90. package/dist/cjs/shared/utils/upload.d.ts +9 -0
  91. package/dist/cjs/shared/utils/upload.js +34 -0
  92. package/dist/cjs/shared/utils/zerionPositions.d.ts +96 -0
  93. package/dist/cjs/shared/utils/zerionPositions.js +188 -0
  94. package/dist/esm/anyspend/constants/rpc.d.ts +3 -1
  95. package/dist/esm/anyspend/constants/rpc.js +5 -1
  96. package/dist/esm/anyspend/react/components/AnySpend.d.ts +9 -1
  97. package/dist/esm/anyspend/react/components/AnySpend.js +124 -47
  98. package/dist/esm/anyspend/react/components/AnySpendCustomExactIn.js +9 -11
  99. package/dist/esm/anyspend/react/components/AnySpendDeposit.d.ts +15 -3
  100. package/dist/esm/anyspend/react/components/AnySpendDeposit.js +80 -27
  101. package/dist/esm/anyspend/react/components/AnySpendStakeB3.js +33 -14
  102. package/dist/esm/anyspend/react/components/AnySpendStakeB3ExactIn.js +33 -11
  103. package/dist/esm/anyspend/react/components/QRDeposit.d.ts +22 -3
  104. package/dist/esm/anyspend/react/components/QRDeposit.js +27 -18
  105. package/dist/esm/anyspend/react/components/checkout/CryptoPayPanel.js +21 -14
  106. package/dist/esm/anyspend/react/components/common/PureTransferView.d.ts +30 -0
  107. package/dist/esm/anyspend/react/components/common/PureTransferView.js +61 -0
  108. package/dist/esm/anyspend/react/components/common/TokenBalance.js +6 -7
  109. package/dist/esm/anyspend/react/hooks/useCreateDepositFirstOrder.d.ts +3 -3
  110. package/dist/esm/anyspend/react/hooks/useSigMint.d.ts +1 -1
  111. package/dist/esm/anyspend/utils/address.d.ts +2 -1
  112. package/dist/esm/anyspend/utils/address.js +9 -6
  113. package/dist/esm/anyspend/utils/chain.d.ts +84 -1
  114. package/dist/esm/anyspend/utils/chain.js +73 -5
  115. package/dist/esm/anyspend/utils/token.d.ts +2 -0
  116. package/dist/esm/anyspend/utils/token.js +13 -0
  117. package/dist/esm/app.shared.d.ts +9 -1
  118. package/dist/esm/app.shared.js +17 -0
  119. package/dist/esm/global-account/app.native.d.ts +1 -1
  120. package/dist/esm/global-account/better-auth-client.d.ts +3314 -36
  121. package/dist/esm/global-account/better-auth-client.js +27 -4
  122. package/dist/esm/global-account/bsmnt.d.ts +2 -2
  123. package/dist/esm/global-account/bsmnt.native.d.ts +1 -1
  124. package/dist/esm/global-account/client-manager.d.ts +7 -5
  125. package/dist/esm/global-account/client-manager.js +51 -5
  126. package/dist/esm/global-account/react/components/AvatarEditor/AvatarEditor.js +6 -11
  127. package/dist/esm/global-account/react/components/B3Provider/B3ConfigProvider.d.ts +11 -0
  128. package/dist/esm/global-account/react/components/B3Provider/B3ConfigProvider.js +11 -0
  129. package/dist/esm/global-account/react/components/B3Provider/B3Provider.d.ts +12 -2
  130. package/dist/esm/global-account/react/components/B3Provider/B3Provider.js +26 -4
  131. package/dist/esm/global-account/react/components/B3Provider/BetterAuthProvider.js +46 -5
  132. package/dist/esm/global-account/react/components/B3Provider/RelayKitProviderWrapper.d.ts +1 -2
  133. package/dist/esm/global-account/react/components/B3Provider/RelayKitProviderWrapper.js +11 -5
  134. package/dist/esm/global-account/react/components/ManageAccount/ContentTokens.js +24 -16
  135. package/dist/esm/global-account/react/components/ManageAccount/NFTContent.js +3 -3
  136. package/dist/esm/global-account/react/components/ManageAccount/ProfileSection.js +9 -7
  137. package/dist/esm/global-account/react/components/ManageAccount/SettingsProfileCard.js +1 -1
  138. package/dist/esm/global-account/react/components/ManageAccount/TokenContent.js +18 -9
  139. package/dist/esm/global-account/react/components/Send/Send.js +16 -12
  140. package/dist/esm/global-account/react/components/SignInWithB3/BetterAuthSignIn.js +3 -1
  141. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +1 -5
  142. package/dist/esm/global-account/react/components/SignInWithB3/components/AuthButton.js +2 -1
  143. package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.js +1 -0
  144. package/dist/esm/global-account/react/components/SignInWithB3/utils/signInUtils.d.ts +3 -2
  145. package/dist/esm/global-account/react/components/SignInWithB3/utils/signInUtils.js +3 -3
  146. package/dist/esm/global-account/react/components/index.d.ts +1 -1
  147. package/dist/esm/global-account/react/components/index.js +1 -1
  148. package/dist/esm/global-account/react/hooks/index.d.ts +2 -3
  149. package/dist/esm/global-account/react/hooks/index.js +2 -3
  150. package/dist/esm/global-account/react/hooks/useAuth.d.ts +5 -4
  151. package/dist/esm/global-account/react/hooks/useAuth.js +1 -0
  152. package/dist/esm/global-account/react/hooks/useAuthentication.d.ts +3 -2
  153. package/dist/esm/global-account/react/hooks/useAuthentication.js +2 -1
  154. package/dist/esm/global-account/react/hooks/useBetterAuth.d.ts +1657 -22
  155. package/dist/esm/global-account/react/hooks/useBetterAuth.js +8 -8
  156. package/dist/esm/global-account/react/hooks/useClient.d.ts +3 -3
  157. package/dist/esm/global-account/react/hooks/useFirstEOA.d.ts +4 -7666
  158. package/dist/esm/global-account/react/hooks/useFirstEOA.js +1 -0
  159. package/dist/esm/global-account/react/hooks/useNativeBalance.js +1 -1
  160. package/dist/esm/global-account/react/hooks/usePortfolioBalance.d.ts +15 -0
  161. package/dist/esm/global-account/react/hooks/usePortfolioBalance.js +72 -0
  162. package/dist/esm/global-account/react/hooks/usePortfolioCollectibles.d.ts +12 -0
  163. package/dist/esm/global-account/react/hooks/usePortfolioCollectibles.js +175 -0
  164. package/dist/esm/global-account/react/hooks/useSiwe.d.ts +1 -1
  165. package/dist/esm/global-account/react/hooks/useSiwe.native.d.ts +1 -1
  166. package/dist/esm/global-account/react/hooks/useTWAuth.d.ts +1 -1
  167. package/dist/esm/global-account/react/hooks/useUnifiedChainSwitchAndExecute.d.ts +1 -0
  168. package/dist/esm/global-account/react/hooks/useUnifiedChainSwitchAndExecute.js +37 -27
  169. package/dist/esm/global-account/react/stores/useModalStore.d.ts +14 -2
  170. package/dist/esm/global-account/types/b3-api.types.d.ts +5 -0
  171. package/dist/esm/global-account/types/feature-flags.d.ts +5 -5
  172. package/dist/esm/notifications/services/api.js +1 -0
  173. package/dist/esm/shared/constants/chains/b3Chain.d.ts +30 -54
  174. package/dist/esm/shared/constants/chains/b3Chain.js +4 -38
  175. package/dist/esm/shared/constants/chains/supported.d.ts +1 -49
  176. package/dist/esm/shared/constants/chains/supported.js +7 -35
  177. package/dist/esm/shared/constants/index.d.ts +4 -0
  178. package/dist/esm/shared/utils/chain-transformers.d.ts +4 -4
  179. package/dist/esm/shared/utils/chain-transformers.js +38 -37
  180. package/dist/esm/shared/utils/thirdweb-insights.js +2 -2
  181. package/dist/esm/shared/utils/upload.d.ts +9 -0
  182. package/dist/esm/shared/utils/upload.js +31 -0
  183. package/dist/esm/shared/utils/zerionPositions.d.ts +96 -0
  184. package/dist/esm/shared/utils/zerionPositions.js +180 -0
  185. package/dist/styles/index.css +1 -1
  186. package/dist/types/anyspend/constants/rpc.d.ts +3 -1
  187. package/dist/types/anyspend/react/components/AnySpend.d.ts +9 -1
  188. package/dist/types/anyspend/react/components/AnySpendDeposit.d.ts +15 -3
  189. package/dist/types/anyspend/react/components/QRDeposit.d.ts +22 -3
  190. package/dist/types/anyspend/react/components/common/PureTransferView.d.ts +30 -0
  191. package/dist/types/anyspend/react/hooks/useCreateDepositFirstOrder.d.ts +3 -3
  192. package/dist/types/anyspend/react/hooks/useSigMint.d.ts +1 -1
  193. package/dist/types/anyspend/utils/address.d.ts +2 -1
  194. package/dist/types/anyspend/utils/chain.d.ts +84 -1
  195. package/dist/types/anyspend/utils/token.d.ts +2 -0
  196. package/dist/types/app.shared.d.ts +9 -1
  197. package/dist/types/global-account/app.native.d.ts +1 -1
  198. package/dist/types/global-account/better-auth-client.d.ts +3314 -36
  199. package/dist/types/global-account/bsmnt.d.ts +2 -2
  200. package/dist/types/global-account/bsmnt.native.d.ts +1 -1
  201. package/dist/types/global-account/client-manager.d.ts +7 -5
  202. package/dist/types/global-account/react/components/B3Provider/B3ConfigProvider.d.ts +11 -0
  203. package/dist/types/global-account/react/components/B3Provider/B3Provider.d.ts +12 -2
  204. package/dist/types/global-account/react/components/B3Provider/RelayKitProviderWrapper.d.ts +1 -2
  205. package/dist/types/global-account/react/components/SignInWithB3/utils/signInUtils.d.ts +3 -2
  206. package/dist/types/global-account/react/components/index.d.ts +1 -1
  207. package/dist/types/global-account/react/hooks/index.d.ts +2 -3
  208. package/dist/types/global-account/react/hooks/useAuth.d.ts +5 -4
  209. package/dist/types/global-account/react/hooks/useAuthentication.d.ts +3 -2
  210. package/dist/types/global-account/react/hooks/useBetterAuth.d.ts +1657 -22
  211. package/dist/types/global-account/react/hooks/useClient.d.ts +3 -3
  212. package/dist/types/global-account/react/hooks/useFirstEOA.d.ts +4 -7666
  213. package/dist/types/global-account/react/hooks/usePortfolioBalance.d.ts +15 -0
  214. package/dist/types/global-account/react/hooks/usePortfolioCollectibles.d.ts +12 -0
  215. package/dist/types/global-account/react/hooks/useSiwe.d.ts +1 -1
  216. package/dist/types/global-account/react/hooks/useSiwe.native.d.ts +1 -1
  217. package/dist/types/global-account/react/hooks/useTWAuth.d.ts +1 -1
  218. package/dist/types/global-account/react/hooks/useUnifiedChainSwitchAndExecute.d.ts +1 -0
  219. package/dist/types/global-account/react/stores/useModalStore.d.ts +14 -2
  220. package/dist/types/global-account/types/b3-api.types.d.ts +5 -0
  221. package/dist/types/global-account/types/feature-flags.d.ts +5 -5
  222. package/dist/types/shared/constants/chains/b3Chain.d.ts +30 -54
  223. package/dist/types/shared/constants/chains/supported.d.ts +1 -49
  224. package/dist/types/shared/constants/index.d.ts +4 -0
  225. package/dist/types/shared/utils/chain-transformers.d.ts +4 -4
  226. package/dist/types/shared/utils/upload.d.ts +9 -0
  227. package/dist/types/shared/utils/zerionPositions.d.ts +96 -0
  228. package/node_modules/@b3/chain-registry/chains.json +1225 -0
  229. package/node_modules/@b3/chain-registry/dist/chains.json +1225 -0
  230. package/node_modules/@b3/chain-registry/dist/index.cjs +1676 -0
  231. package/node_modules/@b3/chain-registry/dist/index.d.cts +195 -0
  232. package/node_modules/@b3/chain-registry/dist/index.d.ts +195 -0
  233. package/node_modules/@b3/chain-registry/dist/index.mjs +1604 -0
  234. package/node_modules/@b3/chain-registry/dist/src/index.d.ts +193 -0
  235. package/node_modules/@b3/chain-registry/dist/src/index.js +408 -0
  236. package/node_modules/@b3/chain-registry/package.json +66 -0
  237. package/node_modules/@b3/chain-registry/src/index.test.ts +432 -0
  238. package/node_modules/@b3/chain-registry/src/index.ts +672 -0
  239. package/package.json +81 -30
  240. package/src/anyspend/README.md +2 -2
  241. package/src/anyspend/constants/rpc.ts +5 -2
  242. package/src/anyspend/docs/components.md +6 -6
  243. package/src/anyspend/docs/contributing.md +1 -1
  244. package/src/anyspend/docs/hooks.md +3 -3
  245. package/src/anyspend/docs/installation.md +2 -2
  246. package/src/anyspend/react/components/AnySpend.tsx +163 -47
  247. package/src/anyspend/react/components/AnySpendCustomExactIn.tsx +10 -11
  248. package/src/anyspend/react/components/AnySpendDeposit.tsx +130 -31
  249. package/src/anyspend/react/components/AnySpendStakeB3.tsx +55 -14
  250. package/src/anyspend/react/components/AnySpendStakeB3ExactIn.tsx +55 -11
  251. package/src/anyspend/react/components/QRDeposit.tsx +101 -22
  252. package/src/anyspend/react/components/__tests__/QRDeposit.test.tsx +331 -0
  253. package/src/anyspend/react/components/checkout/CryptoPayPanel.tsx +38 -16
  254. package/src/anyspend/react/components/common/PureTransferView.tsx +212 -0
  255. package/src/anyspend/react/components/common/TokenBalance.tsx +10 -7
  256. package/src/anyspend/react/hooks/useAnyspendQuote.ts +13 -13
  257. package/src/anyspend/react/hooks/useCreateDepositFirstOrder.ts +4 -4
  258. package/src/anyspend/services/gas.test.ts +95 -18
  259. package/src/anyspend/types/api_req_res.ts +10 -5
  260. package/src/anyspend/utils/__tests__/address.test.ts +39 -0
  261. package/src/anyspend/utils/__tests__/deprecatedChains.test.ts +44 -0
  262. package/src/anyspend/utils/__tests__/toRegistryChainId.test.ts +17 -0
  263. package/src/anyspend/utils/address.ts +8 -6
  264. package/src/anyspend/utils/chain.ts +79 -3
  265. package/src/anyspend/utils/token.ts +14 -0
  266. package/src/app.shared.ts +21 -1
  267. package/src/global-account/app.native.ts +5 -1
  268. package/src/global-account/better-auth-client.ts +30 -4
  269. package/src/global-account/bsmnt.native.ts +5 -1
  270. package/src/global-account/bsmnt.ts +9 -2
  271. package/src/global-account/client-manager.ts +74 -9
  272. package/src/global-account/react/components/AvatarEditor/AvatarEditor.tsx +6 -11
  273. package/src/global-account/react/components/B3Provider/B3ConfigProvider.tsx +12 -0
  274. package/src/global-account/react/components/B3Provider/B3Provider.tsx +40 -4
  275. package/src/global-account/react/components/B3Provider/BetterAuthProvider.tsx +51 -5
  276. package/src/global-account/react/components/B3Provider/RelayKitProviderWrapper.tsx +11 -11
  277. package/src/global-account/react/components/ManageAccount/ContentTokens.tsx +50 -21
  278. package/src/global-account/react/components/ManageAccount/NFTContent.tsx +5 -3
  279. package/src/global-account/react/components/ManageAccount/ProfileSection.tsx +10 -6
  280. package/src/global-account/react/components/ManageAccount/SettingsProfileCard.tsx +1 -1
  281. package/src/global-account/react/components/ManageAccount/TokenContent.tsx +22 -9
  282. package/src/global-account/react/components/Send/Send.tsx +39 -15
  283. package/src/global-account/react/components/SignInWithB3/BetterAuthSignIn.tsx +12 -1
  284. package/src/global-account/react/components/SignInWithB3/SignInWithB3Flow.tsx +1 -4
  285. package/src/global-account/react/components/SignInWithB3/components/AuthButton.tsx +9 -1
  286. package/src/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.tsx +1 -0
  287. package/src/global-account/react/components/SignInWithB3/utils/signInUtils.ts +4 -4
  288. package/src/global-account/react/components/index.ts +1 -1
  289. package/src/global-account/react/components/ui/button.tsx +1 -2
  290. package/src/global-account/react/hooks/__tests__/useUnifiedChainSwitchAndExecute.test.tsx +156 -0
  291. package/src/global-account/react/hooks/index.ts +2 -3
  292. package/src/global-account/react/hooks/useAuth.ts +5 -4
  293. package/src/global-account/react/hooks/useAuthentication.ts +5 -4
  294. package/src/global-account/react/hooks/useBetterAuth.ts +10 -10
  295. package/src/global-account/react/hooks/useClient.ts +11 -2
  296. package/src/global-account/react/hooks/useFirstEOA.tsx +9 -2
  297. package/src/global-account/react/hooks/useNativeBalance.tsx +1 -1
  298. package/src/global-account/react/hooks/usePortfolioBalance.ts +89 -0
  299. package/src/global-account/react/hooks/usePortfolioCollectibles.ts +212 -0
  300. package/src/global-account/react/hooks/useSiwe.native.tsx +1 -1
  301. package/src/global-account/react/hooks/useSiwe.tsx +1 -1
  302. package/src/global-account/react/hooks/useTWAuth.tsx +1 -1
  303. package/src/global-account/react/hooks/useUnifiedChainSwitchAndExecute.ts +47 -31
  304. package/src/global-account/react/stores/useModalStore.ts +14 -2
  305. package/src/global-account/types/b3-api.types.ts +5 -1
  306. package/src/notifications/services/api.ts +1 -0
  307. package/src/shared/constants/chains/b3Chain.ts +4 -43
  308. package/src/shared/constants/chains/supported.ts +9 -48
  309. package/src/shared/constants/index.ts +8 -0
  310. package/src/shared/react/hooks/__tests__/useCurrencyConversion.test.ts +54 -43
  311. package/src/shared/utils/__tests__/zerionPositions.test.ts +248 -0
  312. package/src/shared/utils/chain-transformers.ts +41 -39
  313. package/src/shared/utils/thirdweb-insights.ts +2 -2
  314. package/src/shared/utils/upload.ts +48 -0
  315. package/src/shared/utils/zerionPositions.ts +247 -0
  316. package/src/styles/index.css +27 -0
  317. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Privy.d.ts +0 -10
  318. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Privy.js +0 -46
  319. package/dist/cjs/global-account/react/hooks/useHandleConnectWithPrivy.d.ts +0 -11
  320. package/dist/cjs/global-account/react/hooks/useHandleConnectWithPrivy.js +0 -70
  321. package/dist/cjs/global-account/react/hooks/useSimBalance.d.ts +0 -59
  322. package/dist/cjs/global-account/react/hooks/useSimBalance.js +0 -98
  323. package/dist/cjs/global-account/react/hooks/useSimCollectibles.d.ts +0 -45
  324. package/dist/cjs/global-account/react/hooks/useSimCollectibles.js +0 -190
  325. package/dist/cjs/global-account/react/utils/simdune.d.ts +0 -7
  326. package/dist/cjs/global-account/react/utils/simdune.js +0 -21
  327. package/dist/cjs/global-account/types/chain-networks.d.ts +0 -44
  328. package/dist/cjs/global-account/types/chain-networks.js +0 -48
  329. package/dist/cjs/shared/generated/chain-networks.json +0 -684
  330. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Privy.d.ts +0 -10
  331. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Privy.js +0 -43
  332. package/dist/esm/global-account/react/hooks/useHandleConnectWithPrivy.d.ts +0 -11
  333. package/dist/esm/global-account/react/hooks/useHandleConnectWithPrivy.js +0 -67
  334. package/dist/esm/global-account/react/hooks/useSimBalance.d.ts +0 -59
  335. package/dist/esm/global-account/react/hooks/useSimBalance.js +0 -93
  336. package/dist/esm/global-account/react/hooks/useSimCollectibles.d.ts +0 -45
  337. package/dist/esm/global-account/react/hooks/useSimCollectibles.js +0 -187
  338. package/dist/esm/global-account/react/utils/simdune.d.ts +0 -7
  339. package/dist/esm/global-account/react/utils/simdune.js +0 -17
  340. package/dist/esm/global-account/types/chain-networks.d.ts +0 -44
  341. package/dist/esm/global-account/types/chain-networks.js +0 -45
  342. package/dist/esm/shared/generated/chain-networks.json +0 -684
  343. package/dist/types/global-account/react/components/SignInWithB3/SignInWithB3Privy.d.ts +0 -10
  344. package/dist/types/global-account/react/hooks/useHandleConnectWithPrivy.d.ts +0 -11
  345. package/dist/types/global-account/react/hooks/useSimBalance.d.ts +0 -59
  346. package/dist/types/global-account/react/hooks/useSimCollectibles.d.ts +0 -45
  347. package/dist/types/global-account/react/utils/simdune.d.ts +0 -7
  348. package/dist/types/global-account/types/chain-networks.d.ts +0 -44
  349. package/src/global-account/react/components/SignInWithB3/SignInWithB3Privy.tsx +0 -63
  350. package/src/global-account/react/hooks/useHandleConnectWithPrivy.tsx +0 -79
  351. package/src/global-account/react/hooks/useSimBalance.ts +0 -164
  352. package/src/global-account/react/hooks/useSimCollectibles.ts +0 -238
  353. package/src/global-account/react/utils/simdune.ts +0 -20
  354. package/src/global-account/types/chain-networks.ts +0 -54
  355. package/src/shared/generated/chain-networks.json +0 -684
@@ -6,6 +6,7 @@ import {
6
6
  getDefaultToken,
7
7
  getExplorerTxUrl,
8
8
  getHyperliquidUSDCToken,
9
+ isSameChainAndToken,
9
10
  HYPERLIQUID_CHAIN_ID,
10
11
  HYPERLIQUID_USDC_ADDRESS,
11
12
  USDC_BASE,
@@ -71,6 +72,7 @@ import { LoginStep } from "@b3dotfun/sdk/global-account/react/components/SignInW
71
72
  import { PanelOnramp } from "./common/PanelOnramp";
72
73
  import { PanelOnrampPayment } from "./common/PanelOnrampPayment";
73
74
  import { PointsDetailPanel } from "./common/PointsDetailPanel";
75
+ import { PureTransferView } from "./common/PureTransferView";
74
76
  import { RecipientSelection } from "./common/RecipientSelection";
75
77
  import { TabSection } from "./common/TabSection";
76
78
  import { AnySpendCustomizationProvider, useAnySpendCustomization } from "./context/AnySpendCustomizationContext";
@@ -100,6 +102,7 @@ export enum PanelView {
100
102
  DIRECT_TRANSFER_SUCCESS,
101
103
  FIAT_KYC,
102
104
  FIAT_AUTH,
105
+ PURE_TRANSFER_ADDRESS,
103
106
  }
104
107
 
105
108
  const ANYSPEND_RECIPIENTS_KEY = "anyspend_recipients";
@@ -110,6 +113,13 @@ export function AnySpend(props: {
110
113
  sourceChainId?: number;
111
114
  destinationTokenAddress?: string;
112
115
  destinationTokenChainId?: number;
116
+ /**
117
+ * When false, the destination token is user-selectable even if a default destination token is
118
+ * provided (the provided destination is used only as the initial/default value). Used by the
119
+ * wallet-funding deposit flow so the user can change the receive token away from the default
120
+ * (Base USDC). Defaults to true (locked buy-mode display, current behavior).
121
+ */
122
+ lockDestinationToken?: boolean;
113
123
  recipientAddress?: string;
114
124
  loadOrder?: string;
115
125
  hideTransactionHistoryButton?: boolean;
@@ -166,6 +176,7 @@ function AnySpendInner({
166
176
  sourceChainId,
167
177
  destinationTokenAddress,
168
178
  destinationTokenChainId,
179
+ lockDestinationToken = true,
169
180
  mode = "modal",
170
181
  defaultActiveTab = "crypto",
171
182
  loadOrder,
@@ -191,6 +202,7 @@ function AnySpendInner({
191
202
  sourceChainId?: number;
192
203
  destinationTokenAddress?: string;
193
204
  destinationTokenChainId?: number;
205
+ lockDestinationToken?: boolean;
194
206
  mode?: "page" | "modal";
195
207
  defaultActiveTab?: "crypto" | "fiat";
196
208
  loadOrder?: string;
@@ -230,8 +242,10 @@ function AnySpendInner({
230
242
  // in the same frame that onStatusResolved sets it (setState is async).
231
243
  // When kycEnabled is false (default), pre-approve so the KYC gate is skipped.
232
244
  const kycApprovedRef = useRef(!kycEnabled);
233
- // Determine if we're in "buy mode" based on whether destination token props are provided
234
- const isBuyMode = !!(destinationTokenAddress && destinationTokenChainId);
245
+ // Determine if we're in "buy mode" based on whether destination token props are provided.
246
+ // When lockDestinationToken is false, the provided destination is only a default and the user
247
+ // can change the receive token, so we stay out of buy mode (selectable swap mode).
248
+ const isBuyMode = !!(destinationTokenAddress && destinationTokenChainId) && lockDestinationToken;
235
249
 
236
250
  // Add refs to track URL state
237
251
  const initialUrlProcessed = useRef(false);
@@ -323,10 +337,16 @@ function AnySpendInner({
323
337
  sessionStorage.setItem("anyspend_fiat_method", selectedFiatPaymentMethod);
324
338
  }, [selectedFiatPaymentMethod]);
325
339
 
340
+ // Whether a default destination token was provided. When lockDestinationToken is false this is
341
+ // used only as the INITIAL/default value (the user can still change the receive token), so the
342
+ // wallet-funding deposit flow defaults to Base USDC but stays selectable.
343
+ const hasProvidedDestination = !!(destinationTokenAddress && destinationTokenChainId);
344
+
326
345
  // Get initial chain IDs from URL or defaults
327
346
  const initialSrcChainId = sourceChainId || parseInt(searchParams.get("fromChainId") || "0") || mainnet.id;
328
347
  const initialDstChainId =
329
- parseInt(searchParams.get("toChainId") || "0") || (isBuyMode ? destinationTokenChainId : base.id);
348
+ parseInt(searchParams.get("toChainId") || "0") ||
349
+ (isBuyMode ? destinationTokenChainId : hasProvidedDestination ? destinationTokenChainId : base.id);
330
350
 
331
351
  // State for source chain/token selection
332
352
  const [selectedSrcChainId, setSelectedSrcChainId] = useState<number>(initialSrcChainId);
@@ -368,19 +388,28 @@ function AnySpendInner({
368
388
  const isHyperliquidUSDCAddress = (address?: string) =>
369
389
  eqci(address, HYPERLIQUID_USDC_ADDRESS) || eqci(address, ZERO_ADDRESS);
370
390
 
371
- const defaultDstToken = isBuyMode
372
- ? // Special case: Hyperliquid uses zero address for USDC
373
- destinationTokenChainId === HYPERLIQUID_CHAIN_ID && isHyperliquidUSDCAddress(destinationTokenAddress)
374
- ? getHyperliquidUSDCToken()
375
- : {
376
- symbol: "",
377
- chainId: destinationTokenChainId,
378
- address: destinationTokenAddress,
379
- name: "",
380
- decimals: 18,
381
- metadata: {},
382
- }
383
- : getDefaultToken(selectedDstChainId);
391
+ // Build a token object from the provided destination props (handles the Hyperliquid USDC special case).
392
+ // The inline truthiness check lets TypeScript narrow both props to non-null, so it is `undefined`
393
+ // unless both props are provided — i.e. only meaningful when hasProvidedDestination/isBuyMode is true.
394
+ const providedDstToken: components["schemas"]["Token"] | undefined =
395
+ destinationTokenChainId && destinationTokenAddress
396
+ ? destinationTokenChainId === HYPERLIQUID_CHAIN_ID && isHyperliquidUSDCAddress(destinationTokenAddress)
397
+ ? getHyperliquidUSDCToken()
398
+ : {
399
+ symbol: "",
400
+ chainId: destinationTokenChainId,
401
+ address: destinationTokenAddress,
402
+ name: "",
403
+ decimals: 18,
404
+ metadata: {},
405
+ }
406
+ : undefined;
407
+
408
+ // In buy mode the provided destination is locked. Otherwise, if a default destination was provided
409
+ // (selectable deposit flow) seed it as the default; falling back to the chain's default token only
410
+ // when no destination prop is given (standard swap mode).
411
+ const defaultDstToken =
412
+ (isBuyMode || hasProvidedDestination) && providedDstToken ? providedDstToken : getDefaultToken(selectedDstChainId);
384
413
  const dstTokenFromUrl = useTokenFromUrl({
385
414
  defaultToken: defaultDstToken,
386
415
  prefix: "to",
@@ -661,7 +690,10 @@ function AnySpendInner({
661
690
  globalAddress,
662
691
  });
663
692
 
664
- const recipientProfile = useProfile({ address: effectiveRecipientAddress, fresh: true });
693
+ const recipientProfile = useProfile({
694
+ address: effectiveRecipientAddress,
695
+ fresh: true,
696
+ });
665
697
  const recipientName = recipientProfile.data?.name;
666
698
 
667
699
  // Check token balance for crypto payments
@@ -781,12 +813,15 @@ function AnySpendInner({
781
813
  anyspendQuote.data.currencyOut?.currency?.decimals
782
814
  ) {
783
815
  if (isSrcInputDirty) {
784
- // Don't override dstAmount if we have a fixed destinationTokenAmount
785
- if (!destinationTokenAmount) {
786
- const amount = anyspendQuote.data.currencyOut.amount;
787
- const decimals = anyspendQuote.data.currencyOut.currency.decimals;
788
- setDstAmount(formatTokenAmount(BigInt(amount), decimals, 6, false));
789
- }
816
+ // The user is driving the SOURCE (exact-in): reflect the quote's OUTPUT even
817
+ // when a fixed destinationTokenAmount pre-filled the receive. That lock only
818
+ // governs the INITIAL exact-out state (untouched source → compute the pay for
819
+ // the fixed receive). Once the user edits the pay, keeping the receive pinned
820
+ // shows a value that doesn't match the quote — the URL amount "overrides" the
821
+ // real output, an invalid mismatched swap.
822
+ const amount = anyspendQuote.data.currencyOut.amount;
823
+ const decimals = anyspendQuote.data.currencyOut.currency.decimals;
824
+ setDstAmount(formatTokenAmount(BigInt(amount), decimals, 6, false));
790
825
  } else {
791
826
  const amount = anyspendQuote.data.currencyIn.amount;
792
827
  const decimals = anyspendQuote.data.currencyIn.currency.decimals;
@@ -794,15 +829,12 @@ function AnySpendInner({
794
829
  }
795
830
  } else {
796
831
  if (isSrcInputDirty) {
797
- // Don't reset dstAmount if we have a fixed destinationTokenAmount
798
- if (!destinationTokenAmount) {
799
- setDstAmount("");
800
- }
832
+ setDstAmount("");
801
833
  } else {
802
834
  setSrcAmount("");
803
835
  }
804
836
  }
805
- }, [anyspendQuote, isSrcInputDirty, destinationTokenAmount]);
837
+ }, [anyspendQuote, isSrcInputDirty]);
806
838
 
807
839
  // Call onSuccess when order is executed
808
840
  useOnOrderSuccess({ orderData: oat, orderId, onSuccess });
@@ -871,8 +903,7 @@ function AnySpendInner({
871
903
  const isSameChainSameToken = useMemo(() => {
872
904
  return (
873
905
  activeTab === "crypto" &&
874
- selectedSrcChainId === selectedDstChainId &&
875
- selectedSrcToken.address.toLowerCase() === selectedDstToken.address.toLowerCase()
906
+ isSameChainAndToken(selectedSrcChainId, selectedSrcToken.address, selectedDstChainId, selectedDstToken.address)
876
907
  );
877
908
  }, [activeTab, selectedSrcChainId, selectedDstChainId, selectedSrcToken.address, selectedDstToken.address]);
878
909
 
@@ -880,15 +911,36 @@ function AnySpendInner({
880
911
  const isDirectTransfer = isSameChainSameToken && allowDirectTransfer;
881
912
 
882
913
  // Determine button state and text
883
- const btnInfo: { text: string; disable: boolean; error: boolean; loading: boolean } = useMemo(() => {
914
+ const btnInfo: {
915
+ text: string;
916
+ disable: boolean;
917
+ error: boolean;
918
+ loading: boolean;
919
+ } = useMemo(() => {
884
920
  // For fiat tab, check srcAmountOnRamp; for crypto tab, check activeInputAmountInWei
885
921
  const hasAmount =
886
922
  activeTab === "fiat" ? srcAmountOnRamp && parseFloat(srcAmountOnRamp) > 0 : activeInputAmountInWei !== "0";
887
- if (!hasAmount) return { text: "Enter an amount", disable: true, error: false, loading: false };
923
+ if (!hasAmount)
924
+ return {
925
+ text: "Enter an amount",
926
+ disable: true,
927
+ error: false,
928
+ loading: false,
929
+ };
888
930
  if (isSameChainSameToken && !allowDirectTransfer)
889
- return { text: "Select a different token or chain", disable: true, error: false, loading: false };
931
+ return {
932
+ text: "Select a different token or chain",
933
+ disable: true,
934
+ error: false,
935
+ loading: false,
936
+ };
890
937
  if (isLoadingAnyspendQuote && !isSameChainSameToken)
891
- return { text: "Loading quote...", disable: true, error: false, loading: true };
938
+ return {
939
+ text: "Loading quote...",
940
+ disable: true,
941
+ error: false,
942
+ loading: true,
943
+ };
892
944
  if (isCreatingOrder || isCreatingOnrampOrder || isSwitchingOrExecuting)
893
945
  return {
894
946
  text: isSwitchingOrExecuting ? "Transferring..." : "Creating order...",
@@ -897,15 +949,31 @@ function AnySpendInner({
897
949
  loading: true,
898
950
  };
899
951
  if ((!anyspendQuote || !anyspendQuote.success) && !(isSameChainSameToken && allowDirectTransfer))
900
- return { text: "No quote found", disable: true, error: false, loading: false };
952
+ return {
953
+ text: "No quote found",
954
+ disable: true,
955
+ error: false,
956
+ loading: false,
957
+ };
901
958
 
902
959
  if (activeTab === "fiat") {
903
960
  // For fiat: check recipient first, then payment method
904
- if (!effectiveRecipientAddress) return { text: "Select recipient", disable: false, error: false, loading: false };
961
+ if (!effectiveRecipientAddress)
962
+ return {
963
+ text: "Select recipient",
964
+ disable: false,
965
+ error: false,
966
+ loading: false,
967
+ };
905
968
 
906
969
  // If no fiat payment method selected, show "Select payment method"
907
970
  if (selectedFiatPaymentMethod === FiatPaymentMethod.NONE) {
908
- return { text: "Select payment method", disable: false, error: false, loading: false };
971
+ return {
972
+ text: "Select payment method",
973
+ disable: false,
974
+ error: false,
975
+ loading: false,
976
+ };
909
977
  }
910
978
  // If payment method is selected, show "Continue"
911
979
  return { text: "Continue", disable: false, error: false, loading: false };
@@ -916,11 +984,22 @@ function AnySpendInner({
916
984
 
917
985
  // If no payment method selected, show "Choose payment method"
918
986
  if (effectiveCryptoPaymentMethod === CryptoPaymentMethodType.NONE) {
919
- return { text: "Choose payment method", disable: false, error: false, loading: false };
987
+ return {
988
+ text: "Choose payment method",
989
+ disable: false,
990
+ error: false,
991
+ loading: false,
992
+ };
920
993
  }
921
994
 
922
995
  // Check recipient after payment method
923
- if (!effectiveRecipientAddress) return { text: "Select recipient", disable: false, error: false, loading: false };
996
+ if (!effectiveRecipientAddress)
997
+ return {
998
+ text: "Select recipient",
999
+ disable: false,
1000
+ error: false,
1001
+ loading: false,
1002
+ };
924
1003
 
925
1004
  // If payment method selected, show appropriate action
926
1005
  if (
@@ -928,10 +1007,22 @@ function AnySpendInner({
928
1007
  effectiveCryptoPaymentMethod === CryptoPaymentMethodType.GLOBAL_WALLET
929
1008
  ) {
930
1009
  const buttonText = isSameChainSameToken && allowDirectTransfer ? "Transfer" : "Swap";
931
- return { text: buttonText, disable: false, error: false, loading: false };
1010
+ return {
1011
+ text: buttonText,
1012
+ disable: false,
1013
+ error: false,
1014
+ loading: false,
1015
+ };
932
1016
  }
933
1017
  if (effectiveCryptoPaymentMethod === CryptoPaymentMethodType.TRANSFER_CRYPTO) {
934
- return { text: "Continue to payment", disable: false, error: false, loading: false };
1018
+ const transferText =
1019
+ isSameChainSameToken && allowDirectTransfer ? "Show deposit address" : "Continue to payment";
1020
+ return {
1021
+ text: transferText,
1022
+ disable: false,
1023
+ error: false,
1024
+ loading: false,
1025
+ };
935
1026
  }
936
1027
  }
937
1028
 
@@ -1037,10 +1128,18 @@ function AnySpendInner({
1037
1128
  // Handle crypto swap creation
1038
1129
  const handleCryptoSwap = async (method: CryptoPaymentMethodType) => {
1039
1130
  try {
1040
- const isDirectTransfer = isSameChainSameToken && allowDirectTransfer;
1131
+ // TRANSFER_CRYPTO is the manual deposit-address flow — no connected wallet to send from.
1132
+ const isDirectTransfer =
1133
+ isSameChainSameToken && allowDirectTransfer && method !== CryptoPaymentMethodType.TRANSFER_CRYPTO;
1041
1134
 
1042
1135
  invariant(effectiveRecipientAddress, "Recipient address is not found");
1043
1136
 
1137
+ // Same-token manual deposit → show recipient address + watch, no relayer order, no fee
1138
+ if (isSameChainSameToken && allowDirectTransfer && method === CryptoPaymentMethodType.TRANSFER_CRYPTO) {
1139
+ navigateToPanel(PanelView.PURE_TRANSFER_ADDRESS, "forward");
1140
+ return;
1141
+ }
1142
+
1044
1143
  const srcAmountBigInt = parseUnits(srcAmount.replace(/,/g, ""), selectedSrcToken.decimals);
1045
1144
 
1046
1145
  // Handle direct transfer (same chain/token) - bypass backend, transfer directly
@@ -1063,10 +1162,6 @@ function AnySpendInner({
1063
1162
  // Regular swap flow - use backend
1064
1163
  invariant(anyspendQuote, "Relay price is not found");
1065
1164
 
1066
- // Debug: Check payment method values
1067
- console.log("handleCryptoSwap - method parameter:", method);
1068
- console.log("handleCryptoSwap - selectedCryptoPaymentMethod state:", selectedCryptoPaymentMethod);
1069
-
1070
1165
  createOrder({
1071
1166
  recipientAddress: effectiveRecipientAddress,
1072
1167
  orderType: "swap",
@@ -1074,7 +1169,11 @@ function AnySpendInner({
1074
1169
  dstChain: isBuyMode ? destinationTokenChainId : selectedDstChainId,
1075
1170
  srcToken: selectedSrcToken,
1076
1171
  dstToken: isBuyMode
1077
- ? { ...selectedDstToken, chainId: destinationTokenChainId, address: destinationTokenAddress }
1172
+ ? {
1173
+ ...selectedDstToken,
1174
+ chainId: destinationTokenChainId,
1175
+ address: destinationTokenAddress,
1176
+ }
1078
1177
  : selectedDstToken,
1079
1178
  srcAmount: srcAmountBigInt.toString(),
1080
1179
  expectedDstAmount: anyspendQuote?.data?.currencyOut?.amount || "0",
@@ -1733,6 +1832,20 @@ function AnySpendInner({
1733
1832
  </div>
1734
1833
  );
1735
1834
 
1835
+ const pureTransferAddressView = (
1836
+ <PureTransferView
1837
+ mode={mode}
1838
+ recipientAddress={effectiveRecipientAddress ?? ""}
1839
+ chainId={selectedSrcChainId}
1840
+ token={selectedSrcToken}
1841
+ displayAmount={srcAmount && srcAmount !== "0" ? `${srcAmount} ${selectedSrcToken.symbol}` : undefined}
1842
+ isActive={activePanel === PanelView.PURE_TRANSFER_ADDRESS}
1843
+ onBack={navigateBack}
1844
+ onClose={() => setB3ModalOpen(false)}
1845
+ onTransferDetected={() => onSuccess?.()}
1846
+ />
1847
+ );
1848
+
1736
1849
  // Add tabs to the main component when no order is loaded
1737
1850
  return (
1738
1851
  <StyleRoot>
@@ -1813,6 +1926,9 @@ function AnySpendInner({
1813
1926
  <div key="fiat-auth-view" className={cn(mode === "page" && "p-6")}>
1814
1927
  {authView}
1815
1928
  </div>,
1929
+ <div key="pure-transfer-address-view" className={cn(mode === "page" && "p-6")}>
1930
+ {pureTransferAddressView}
1931
+ </div>,
1816
1932
  ]}
1817
1933
  </TransitionPanel>
1818
1934
  </div>
@@ -2,7 +2,7 @@ import { getChainName, getExplorerTxUrl } from "@b3dotfun/sdk/anyspend";
2
2
  import { useGasPrice } from "@b3dotfun/sdk/anyspend/react";
3
3
  import { components } from "@b3dotfun/sdk/anyspend/types/api";
4
4
  import { GetQuoteResponse } from "@b3dotfun/sdk/anyspend/types/api_req_res";
5
- import { normalizeAddress } from "@b3dotfun/sdk/anyspend/utils";
5
+ import { isSameChainAndToken, normalizeAddress } from "@b3dotfun/sdk/anyspend/utils";
6
6
  import {
7
7
  Button,
8
8
  ShinyButton,
@@ -218,16 +218,11 @@ function AnySpendCustomExactInInner({
218
218
  const isSameChainSameToken = useMemo(() => {
219
219
  return (
220
220
  effectivePaymentType === "crypto" &&
221
- selectedSrcChainId === selectedDstChainId &&
222
- selectedSrcToken?.address?.toLowerCase() === selectedDstToken?.address?.toLowerCase()
221
+ selectedSrcToken != null &&
222
+ selectedDstToken != null &&
223
+ isSameChainAndToken(selectedSrcChainId, selectedSrcToken.address, selectedDstChainId, selectedDstToken.address)
223
224
  );
224
- }, [
225
- effectivePaymentType,
226
- selectedSrcChainId,
227
- selectedDstChainId,
228
- selectedSrcToken?.address,
229
- selectedDstToken?.address,
230
- ]);
225
+ }, [effectivePaymentType, selectedSrcChainId, selectedDstChainId, selectedSrcToken, selectedDstToken]);
231
226
 
232
227
  // Check if this is a direct transfer
233
228
  const isDirectTransfer = isSameChainSameToken && allowDirectTransfer;
@@ -574,7 +569,11 @@ function AnySpendCustomExactInInner({
574
569
 
575
570
  const handleCryptoOrder = async () => {
576
571
  try {
577
- const isDirectTransfer = isSameChainSameToken && allowDirectTransfer;
572
+ // TRANSFER_CRYPTO is the manual deposit-address flow — no connected wallet to send from.
573
+ const isDirectTransfer =
574
+ isSameChainSameToken &&
575
+ allowDirectTransfer &&
576
+ effectiveCryptoPaymentMethod !== CryptoPaymentMethodType.TRANSFER_CRYPTO;
578
577
 
579
578
  if (!isDirectTransfer) {
580
579
  invariant(anyspendQuote, "Relay price is not found");