@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
@@ -0,0 +1,212 @@
1
+ "use client";
2
+
3
+ import { getChainName, getPaymentUrl, ZERO_ADDRESS } from "@b3dotfun/sdk/anyspend";
4
+ import type { components } from "@b3dotfun/sdk/anyspend/types/api";
5
+ import { CopyToClipboard } from "@b3dotfun/sdk/global-account/react";
6
+ import { cn } from "@b3dotfun/sdk/shared/utils/cn";
7
+ import { ChevronLeft, Loader2, X } from "lucide-react";
8
+ import { QRCodeSVG } from "qrcode.react";
9
+ import { useCallback, useEffect, useMemo, useState } from "react";
10
+ import type { TransferResult } from "../../hooks/useWatchTransfer";
11
+ import { useWatchTransfer } from "../../hooks/useWatchTransfer";
12
+ import { ChainWarningText, WarningText } from "./WarningText";
13
+ import { TransferResultScreen } from "./TransferResultScreen";
14
+
15
+ export interface PureTransferViewProps {
16
+ mode?: "modal" | "page";
17
+ /** The recipient address where funds will land (the user's own wallet) */
18
+ recipientAddress: string;
19
+ /** Chain ID to watch on */
20
+ chainId: number;
21
+ /** Token the user sends — drives the QR code and balance watcher */
22
+ token: components["schemas"]["Token"];
23
+ /** Human-readable amount to display (display-only; skip row if empty or "0") */
24
+ displayAmount?: string;
25
+ /** Whether this panel is the currently active panel; gates the balance watcher */
26
+ isActive?: boolean;
27
+ /** Callback when back chevron is clicked */
28
+ onBack?: () => void;
29
+ /** Callback when X close button is clicked */
30
+ onClose?: () => void;
31
+ /** Callback when an incoming transfer is detected */
32
+ onTransferDetected?: (result: TransferResult) => void;
33
+ }
34
+
35
+ /**
36
+ * A self-contained view that shows the recipient address as a QR code + copy button and
37
+ * watches for an incoming same-chain/same-token transfer via `useWatchTransfer`. When a
38
+ * transfer is detected it renders `TransferResultScreen`.
39
+ *
40
+ * This is the "TRANSFER_CRYPTO" path for same-token AnySpend deposits — no relayer order,
41
+ * no fee; the user simply sends the token directly to their own address.
42
+ */
43
+ export function PureTransferView({
44
+ mode = "modal",
45
+ recipientAddress,
46
+ chainId,
47
+ token,
48
+ displayAmount,
49
+ isActive,
50
+ onBack,
51
+ onClose,
52
+ onTransferDetected,
53
+ }: PureTransferViewProps) {
54
+ const [transferResult, setTransferResult] = useState<TransferResult | null>(null);
55
+
56
+ // Fix 4: reset transferResult when the panel becomes active again
57
+ useEffect(() => {
58
+ if (isActive) setTransferResult(null);
59
+ }, [isActive]);
60
+
61
+ // Fix 3: stabilize the callback so it doesn't re-run the watcher effect every render
62
+ const handleTransferDetected = useCallback(
63
+ (result: TransferResult) => {
64
+ setTransferResult(result);
65
+ onTransferDetected?.(result);
66
+ },
67
+ [onTransferDetected],
68
+ );
69
+
70
+ const { isWatching } = useWatchTransfer({
71
+ address: recipientAddress,
72
+ chainId,
73
+ tokenAddress: token.address,
74
+ tokenDecimals: token.decimals,
75
+ // Fix 1: also require a non-empty recipient before enabling the watcher
76
+ enabled: !!recipientAddress && !transferResult && isActive,
77
+ onTransferDetected: handleTransferDetected,
78
+ });
79
+
80
+ // Fix 2: guard qrValue when recipientAddress is empty
81
+ const qrValue = useMemo(
82
+ () =>
83
+ recipientAddress
84
+ ? getPaymentUrl(
85
+ recipientAddress,
86
+ undefined,
87
+ token.address === ZERO_ADDRESS ? "ETH" : token.address,
88
+ chainId,
89
+ token.decimals,
90
+ )
91
+ : "",
92
+ [recipientAddress, token.address, token.decimals, chainId],
93
+ );
94
+
95
+ const chainName = useMemo(() => {
96
+ try {
97
+ return getChainName(chainId);
98
+ } catch {
99
+ return "the specified chain";
100
+ }
101
+ }, [chainId]);
102
+
103
+ // Guard: if no address yet, render nothing
104
+ if (!recipientAddress) return null;
105
+
106
+ // Once a transfer is detected, hand off to the shared success screen
107
+ if (transferResult) {
108
+ return (
109
+ <TransferResultScreen
110
+ mode={mode}
111
+ transferResult={transferResult}
112
+ token={token}
113
+ chainId={chainId}
114
+ recipientAddress={recipientAddress}
115
+ onBack={onBack}
116
+ onClose={onClose}
117
+ />
118
+ );
119
+ }
120
+
121
+ return (
122
+ <div
123
+ className={cn(
124
+ "anyspend-container anyspend-pure-transfer font-inter bg-as-surface-primary mx-auto w-full max-w-[460px] p-6",
125
+ )}
126
+ >
127
+ <div className="anyspend-pure-transfer-content flex flex-col gap-4">
128
+ {/* Header */}
129
+ <div className="anyspend-pure-transfer-header flex items-center justify-between">
130
+ {onBack ? (
131
+ <button
132
+ onClick={onBack}
133
+ className="anyspend-pure-transfer-back text-as-secondary hover:text-as-primary"
134
+ aria-label="Go back"
135
+ >
136
+ <ChevronLeft className="h-5 w-5" />
137
+ </button>
138
+ ) : (
139
+ <div className="w-5" />
140
+ )}
141
+ <h2 className="anyspend-pure-transfer-title text-as-primary text-base font-semibold">Send {token.symbol}</h2>
142
+ {onClose ? (
143
+ <button
144
+ onClick={onClose}
145
+ className="anyspend-pure-transfer-close text-as-secondary hover:text-as-primary"
146
+ aria-label="Close"
147
+ >
148
+ <X className="h-5 w-5" />
149
+ </button>
150
+ ) : (
151
+ <div className="w-5" />
152
+ )}
153
+ </div>
154
+
155
+ {/* Optional amount badge */}
156
+ {displayAmount && (
157
+ <div className="anyspend-pure-transfer-amount-badge border-as-border-secondary bg-as-surface-secondary flex items-center justify-center rounded-xl border px-4 py-2">
158
+ <span className="text-as-primary text-sm font-medium">{displayAmount}</span>
159
+ </div>
160
+ )}
161
+
162
+ {/* QR Code and address block — mirrors QRDeposit ~lines 413-453 */}
163
+ <div className="anyspend-pure-transfer-qr-content border-as-stroke flex items-start gap-4 rounded-xl border p-4">
164
+ {/* QR Code */}
165
+ <div className="anyspend-pure-transfer-qr-code-container flex flex-col items-center gap-2">
166
+ <div className="anyspend-pure-transfer-qr-code rounded-lg bg-white p-2">
167
+ <QRCodeSVG value={qrValue} size={120} level="M" marginSize={0} />
168
+ </div>
169
+ <span className="anyspend-pure-transfer-qr-scan-hint text-as-secondary text-xs">
170
+ SCAN WITH <span className="inline-block">🦊</span>
171
+ </span>
172
+ </div>
173
+
174
+ {/* Address info */}
175
+ <div className="anyspend-pure-transfer-address-container flex flex-1 flex-col gap-1">
176
+ <span className="anyspend-pure-transfer-address-label text-as-secondary text-sm">Deposit address:</span>
177
+ <div className="anyspend-pure-transfer-address-row flex items-start gap-1">
178
+ <span className="anyspend-pure-transfer-address text-as-primary break-all font-mono text-sm leading-relaxed">
179
+ {recipientAddress}
180
+ </span>
181
+ <CopyToClipboard
182
+ text={recipientAddress}
183
+ className="anyspend-pure-transfer-copy-icon text-as-secondary hover:text-as-primary mt-0.5 shrink-0"
184
+ />
185
+ </div>
186
+ </div>
187
+ </div>
188
+
189
+ {/* Warnings — mirrors QRDeposit ~lines 456-460 */}
190
+ <ChainWarningText chainId={chainId} />
191
+ <WarningText>
192
+ Only send {token.symbol} on {chainName}. Other tokens will not be converted.
193
+ </WarningText>
194
+
195
+ {/* Watching indicator — mirrors QRDeposit ~lines 462-473 */}
196
+ {isWatching && (
197
+ <div className="anyspend-pure-transfer-watching bg-as-brand/10 flex items-center justify-center gap-2 rounded-lg p-3">
198
+ <Loader2 className="text-as-brand h-4 w-4 animate-spin" />
199
+ <span className="text-as-brand text-sm">Watching for incoming transfer...</span>
200
+ </div>
201
+ )}
202
+
203
+ {/* Full-width copy button — mirrors QRDeposit ~lines 476-484 */}
204
+ <CopyToClipboard text={recipientAddress}>
205
+ <button className="anyspend-pure-transfer-copy-button bg-as-brand hover:bg-as-brand/90 flex w-full items-center justify-center gap-2 rounded-xl py-3.5 font-medium text-white transition-all">
206
+ Copy deposit address
207
+ </button>
208
+ </CopyToClipboard>
209
+ </div>
210
+ </div>
211
+ );
212
+ }
@@ -1,7 +1,7 @@
1
1
  import { components } from "@b3dotfun/sdk/anyspend/types/api";
2
- import { getNativeRequired } from "@b3dotfun/sdk/anyspend/utils/chain";
2
+ import { getNativeRequired, toRegistryChainId } from "@b3dotfun/sdk/anyspend/utils/chain";
3
3
  import { isNativeToken } from "@b3dotfun/sdk/anyspend/utils/token";
4
- import { useSimTokenBalance } from "@b3dotfun/sdk/global-account/react";
4
+ import { usePortfolioTokenBalance } from "@b3dotfun/sdk/global-account/react";
5
5
  import { formatTokenAmount } from "@b3dotfun/sdk/shared/utils/number";
6
6
  import { useMemo } from "react";
7
7
  import { formatUnits } from "viem";
@@ -15,11 +15,14 @@ export function TokenBalance({
15
15
  walletAddress: string | undefined;
16
16
  onChangeInput: (value: string) => void;
17
17
  }) {
18
- const tokenAddress = isNativeToken(token.address) ? "native" : token.address;
19
- const { data, isLoading } = useSimTokenBalance(walletAddress, tokenAddress, token.chainId);
18
+ // `token.chainId` is Relay-numbered; balance rows are keyed by the chain registry's id.
19
+ const {
20
+ data: balance,
21
+ isLoading,
22
+ isError,
23
+ } = usePortfolioTokenBalance(walletAddress, token.address, toRegistryChainId(token.chainId));
20
24
 
21
25
  const { rawBalance, formattedBalance } = useMemo(() => {
22
- const balance = data?.balances?.[0];
23
26
  if (!balance?.amount) {
24
27
  return { rawBalance: null, formattedBalance: "0" };
25
28
  }
@@ -28,7 +31,7 @@ export function TokenBalance({
28
31
  rawBalance: raw,
29
32
  formattedBalance: formatTokenAmount(raw, balance.decimals),
30
33
  };
31
- }, [data]);
34
+ }, [balance]);
32
35
 
33
36
  const handlePercentageClick = (percentage: number) => {
34
37
  if (!rawBalance) return;
@@ -59,7 +62,7 @@ export function TokenBalance({
59
62
  {!isLoading && (
60
63
  <>
61
64
  <div className="text-as-primary/50 inline-flex rounded-lg text-sm">
62
- {rawBalance ? `Balance: ${formattedBalance}` : `Balance: 0`}
65
+ {isError ? "Balance: —" : rawBalance ? `Balance: ${formattedBalance}` : `Balance: 0`}
63
66
  </div>
64
67
 
65
68
  {!!rawBalance && (
@@ -26,20 +26,20 @@ export function useAnyspendQuote(req: GetQuoteRequest): UseAnyspendQuoteResult {
26
26
  },
27
27
  enabled: Boolean(
28
28
  req.srcChain &&
29
- req.dstChain &&
30
- req.srcTokenAddress &&
31
- req.dstTokenAddress &&
32
- BigInt(
33
- req.type === "swap" || req.type === "hype_duel" || req.type === "x402_swap" || req.type === "custom_exact_in"
34
- ? req.amount
35
- : req.type === "mint_nft"
29
+ req.dstChain &&
30
+ req.srcTokenAddress &&
31
+ req.dstTokenAddress &&
32
+ BigInt(
33
+ req.type === "swap" || req.type === "hype_duel" || req.type === "x402_swap" || req.type === "custom_exact_in"
34
+ ? req.amount
35
+ : req.type === "mint_nft"
36
+ ? req.price
37
+ : req.type === "join_tournament"
36
38
  ? req.price
37
- : req.type === "join_tournament"
38
- ? req.price
39
- : req.type === "fund_tournament"
40
- ? req.fundAmount
41
- : req.payload.amount,
42
- ) !== BigInt(0),
39
+ : req.type === "fund_tournament"
40
+ ? req.fundAmount
41
+ : req.payload.amount,
42
+ ) !== BigInt(0),
43
43
  ),
44
44
  refetchInterval: 10000,
45
45
  retry: false,
@@ -1,13 +1,13 @@
1
1
  import { anyspendService } from "@b3dotfun/sdk/anyspend/services/anyspend";
2
- import { components } from "@b3dotfun/sdk/anyspend/types/api";
3
- import { CreateOrderResponse } from "@b3dotfun/sdk/anyspend/types/api_req_res";
4
- import { VisitorData } from "@b3dotfun/sdk/anyspend/types/fingerprint";
2
+ import type { components } from "@b3dotfun/sdk/anyspend/types/api";
3
+ import type { CreateOrderResponse } from "@b3dotfun/sdk/anyspend/types/api_req_res";
4
+ import type { VisitorData } from "@b3dotfun/sdk/anyspend/types/fingerprint";
5
5
  import { normalizeAddress } from "@b3dotfun/sdk/anyspend/utils";
6
6
  import { useB3Config } from "@b3dotfun/sdk/global-account/react";
7
7
  import { useVisitorData } from "@fingerprintjs/fingerprintjs-pro-react";
8
8
  import { useMutation } from "@tanstack/react-query";
9
9
  import { useMemo } from "react";
10
- import { DepositContractConfig } from "../components/AnySpendDeposit";
10
+ import type { DepositContractConfig } from "../components/AnySpendDeposit";
11
11
 
12
12
  export type CreateDepositFirstOrderParams = {
13
13
  recipientAddress: string;
@@ -1,31 +1,108 @@
1
- import { describe, it, expect } from "vitest";
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import type { GasOracleResponse } from "../types/gas";
2
3
  import { gasService, isGasOracleSupported } from "./gas";
3
4
 
5
+ const RESPONSES: Readonly<Record<number, GasOracleResponse>> = {
6
+ 1: {
7
+ chainId: 1,
8
+ chainName: "Ethereum",
9
+ timestamp: "2026-01-01T00:00:00.000Z",
10
+ source: "blocknative",
11
+ gasPrice: { low: "7", standard: "8", fast: "9" },
12
+ eip1559: {
13
+ baseFee: "6",
14
+ maxPriorityFee: { low: "1", standard: "2", fast: "3" },
15
+ maxFee: { low: "8", standard: "10", fast: "12" },
16
+ },
17
+ analysis: {
18
+ level: "elevated",
19
+ percentile: 80,
20
+ vs1h: 1.5,
21
+ vs4h: 1.4,
22
+ vs24h: 1.3,
23
+ recommendation: "Wait if possible.",
24
+ },
25
+ cached: false,
26
+ },
27
+ 8453: {
28
+ chainId: 8453,
29
+ chainName: "Base",
30
+ timestamp: "2026-01-01T00:00:00.000Z",
31
+ source: "rpc",
32
+ gasPrice: { low: "0.004", standard: "0.005", fast: "0.006" },
33
+ eip1559: {
34
+ baseFee: "0.003",
35
+ maxPriorityFee: { low: "0.001", standard: "0.002", fast: "0.003" },
36
+ maxFee: { low: "0.005", standard: "0.007", fast: "0.009" },
37
+ },
38
+ analysis: {
39
+ level: "low",
40
+ percentile: 20,
41
+ vs1h: 0.8,
42
+ vs4h: 0.9,
43
+ vs24h: 0.7,
44
+ recommendation: "Good time to transact.",
45
+ },
46
+ cached: true,
47
+ cacheAge: 10,
48
+ },
49
+ };
50
+
4
51
  describe("gasService", () => {
5
- it("should check supported chains", () => {
6
- expect(isGasOracleSupported(8453)).toBe(true); // Base
7
- expect(isGasOracleSupported(1)).toBe(true); // Ethereum
8
- expect(isGasOracleSupported(999999)).toBe(false); // Unknown
52
+ beforeEach(() => {
53
+ vi.stubGlobal(
54
+ "fetch",
55
+ vi.fn(async (input: string | URL | Request) => {
56
+ const url = new URL(input instanceof Request ? input.url : String(input));
57
+ const chainId = Number(url.pathname.split("/").at(-1));
58
+ const response = RESPONSES[chainId];
59
+
60
+ return response ? Response.json(response) : new Response(null, { status: 404 });
61
+ }),
62
+ );
9
63
  });
10
64
 
11
- it("should fetch gas price for Base", async () => {
12
- const gas = await gasService.fetch(8453);
65
+ afterEach(() => {
66
+ vi.unstubAllGlobals();
67
+ });
13
68
 
14
- console.log("Gas data:", gas);
69
+ it("checks supported chains", () => {
70
+ expect(isGasOracleSupported(8453)).toBe(true);
71
+ expect(isGasOracleSupported(1)).toBe(true);
72
+ expect(isGasOracleSupported(999999)).toBe(false);
73
+ });
74
+
75
+ it("fetches and transforms Base gas data", async () => {
76
+ const gas = await gasService.fetch(8453);
15
77
 
16
- expect(gas.chainId).toBe(8453);
17
- expect(gas.chainName).toBe("Base");
18
- expect(gas.level).toMatch(/low|normal|elevated|high|spike/);
19
- expect(typeof gas.gasPriceGwei).toBe("string");
20
- expect(typeof gas.isSpike).toBe("boolean");
78
+ expect(gas).toEqual({
79
+ chainId: 8453,
80
+ chainName: "Base",
81
+ gasPriceGwei: "0.005",
82
+ baseFeeGwei: "0.003",
83
+ level: "low",
84
+ isSpike: false,
85
+ recommendation: "Good time to transact.",
86
+ vsMedian: 0.8,
87
+ source: "rpc",
88
+ timestamp: "2026-01-01T00:00:00.000Z",
89
+ });
21
90
  });
22
91
 
23
- it("should fetch gas price for Ethereum", async () => {
92
+ it("fetches and transforms Ethereum gas data", async () => {
24
93
  const gas = await gasService.fetch(1);
25
94
 
26
- console.log("ETH Gas:", gas);
27
-
28
- expect(gas.chainId).toBe(1);
29
- expect(gas.source).toBe("blocknative"); // ETH uses Blocknative
95
+ expect(gas).toEqual({
96
+ chainId: 1,
97
+ chainName: "Ethereum",
98
+ gasPriceGwei: "8",
99
+ baseFeeGwei: "6",
100
+ level: "elevated",
101
+ isSpike: true,
102
+ recommendation: "Wait if possible.",
103
+ vsMedian: 1.5,
104
+ source: "blocknative",
105
+ timestamp: "2026-01-01T00:00:00.000Z",
106
+ });
30
107
  });
31
108
  });
@@ -1,12 +1,17 @@
1
1
  import { paths } from "./api";
2
2
 
3
- export type GetOrderAndTxsResponse = paths["/orders/{orderId}"]["get"]["responses"]["200"]["content"]["application/json"];
3
+ export type GetOrderAndTxsResponse =
4
+ paths["/orders/{orderId}"]["get"]["responses"]["200"]["content"]["application/json"];
4
5
  export type GetQuoteRequest = paths["/orders/quote"]["post"]["requestBody"]["content"]["application/json"];
5
6
  export type GetQuoteResponse = paths["/orders/quote"]["post"]["responses"]["200"]["content"]["application/json"];
6
7
 
7
- export type GetCoinbaseOnrampOptionsResponse = paths["/onramp/coinbase/options"]["get"]["responses"]["200"]["content"]["application/json"];
8
+ export type GetCoinbaseOnrampOptionsResponse =
9
+ paths["/onramp/coinbase/options"]["get"]["responses"]["200"]["content"]["application/json"];
8
10
  export type GetOrderHistoryResponse = paths["/orders"]["get"]["responses"]["200"]["content"]["application/json"];
9
- export type GetTokenListResponse = paths["/chains/{chainId}/tokens"]["get"]["responses"]["200"]["content"]["application/json"];
11
+ export type GetTokenListResponse =
12
+ paths["/chains/{chainId}/tokens"]["get"]["responses"]["200"]["content"]["application/json"];
10
13
  export type CreateOrderResponse = paths["/orders"]["post"]["responses"]["200"]["content"]["application/json"];
11
- export type GetStripeSupportedResponse = paths["/onramp/stripe/supported"]["get"]["responses"]["200"]["content"]["application/json"];
12
- export type GetStripeClientSecret = paths["/stripe/clientSecret"]["get"]["responses"]["200"]["content"]["application/json"];
14
+ export type GetStripeSupportedResponse =
15
+ paths["/onramp/stripe/supported"]["get"]["responses"]["200"]["content"]["application/json"];
16
+ export type GetStripeClientSecret =
17
+ paths["/stripe/clientSecret"]["get"]["responses"]["200"]["content"]["application/json"];
@@ -0,0 +1,39 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { RELAY_SOLANA_MAINNET_CHAIN_ID } from "../../constants";
3
+ import { HYPERLIQUID_CHAIN_ID } from "../token";
4
+ import { isSameChainAndToken } from "../address";
5
+
6
+ const SOLANA_CHAIN_ID = 7565164;
7
+ const WRAPPED_SOL = "So11111111111111111111111111111111111111112";
8
+
9
+ describe("isSameChainAndToken", () => {
10
+ it("compares Solana mint addresses byte-for-byte", () => {
11
+ const caseMutatedMint = `s${WRAPPED_SOL.slice(1)}`;
12
+
13
+ expect(isSameChainAndToken(SOLANA_CHAIN_ID, WRAPPED_SOL, SOLANA_CHAIN_ID, caseMutatedMint)).toBe(false);
14
+ const invalidBase58Mutation = `SO${WRAPPED_SOL.slice(2)}`;
15
+ expect(
16
+ isSameChainAndToken(
17
+ RELAY_SOLANA_MAINNET_CHAIN_ID,
18
+ invalidBase58Mutation,
19
+ RELAY_SOLANA_MAINNET_CHAIN_ID,
20
+ invalidBase58Mutation.toLowerCase(),
21
+ ),
22
+ ).toBe(false);
23
+ });
24
+
25
+ it("compares EVM contract addresses case-insensitively on the same chain", () => {
26
+ const checksumAddress = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
27
+
28
+ expect(isSameChainAndToken(1, checksumAddress, 1, checksumAddress.toLowerCase())).toBe(true);
29
+ expect(isSameChainAndToken(1, checksumAddress, 8453, checksumAddress)).toBe(false);
30
+ });
31
+
32
+ it("preserves case-insensitive token matching on Hyperliquid", () => {
33
+ const mixedCaseAddress = "0xAbCdEf0123456789AbCdEf0123456789";
34
+
35
+ expect(
36
+ isSameChainAndToken(HYPERLIQUID_CHAIN_ID, mixedCaseAddress, HYPERLIQUID_CHAIN_ID, mixedCaseAddress.toLowerCase()),
37
+ ).toBe(true);
38
+ });
39
+ });
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Deprecated chains must disappear from the chain picker but stay in ALL_CHAINS.
3
+ *
4
+ * Those are two different questions. ALL_CHAINS answers "what is this chain" and is needed to
5
+ * render every order that ever existed — anyspend has ~1,400 historical orders on B3 and Plume, and
6
+ * getChainName throws on an unknown id. getAvailableChainIds answers "can a new order use this",
7
+ * which is what the deprecation actually changes.
8
+ */
9
+ import { describe, expect, it } from "vitest";
10
+
11
+ import { ALL_CHAINS, DEPRECATED_CHAIN_IDS, getAvailableChainIds, isDeprecatedChain } from "../chain";
12
+
13
+ describe("deprecated chains", () => {
14
+ it("covers B3 and Plume", () => {
15
+ expect(DEPRECATED_CHAIN_IDS).toContain(8333);
16
+ expect(DEPRECATED_CHAIN_IDS).toContain(98866);
17
+ expect(isDeprecatedChain(8333)).toBe(true);
18
+ expect(isDeprecatedChain(98866)).toBe(true);
19
+ expect(isDeprecatedChain(8453)).toBe(false);
20
+ expect(isDeprecatedChain(undefined)).toBe(false);
21
+ });
22
+
23
+ // Offering a chain the API rejects lets a user pick something that then fails at order creation.
24
+ it("are absent from the picker in both directions", () => {
25
+ for (const context of ["from", "to"] as const) {
26
+ const available = getAvailableChainIds(context);
27
+ for (const chainId of DEPRECATED_CHAIN_IDS) {
28
+ expect(available).not.toContain(chainId);
29
+ }
30
+ }
31
+ });
32
+
33
+ it("still leaves the picker with the chains that do work", () => {
34
+ expect(getAvailableChainIds("to")).toContain(8453);
35
+ expect(getAvailableChainIds("from")).toContain(1);
36
+ });
37
+
38
+ // Removing the entry would make getChainName and friends throw while rendering old orders.
39
+ it("remain in ALL_CHAINS so historical orders still render", () => {
40
+ for (const chainId of DEPRECATED_CHAIN_IDS) {
41
+ expect(ALL_CHAINS[chainId]).toBeDefined();
42
+ }
43
+ });
44
+ });
@@ -0,0 +1,17 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { RELAY_SOLANA_MAINNET_CHAIN_ID } from "@b3dotfun/sdk/anyspend/constants";
3
+ import { toRegistryChainId } from "../chain";
4
+ import { SOLANA_CHAIN_ID } from "@b3dotfun/sdk/shared/utils/zerionPositions";
5
+
6
+ describe("toRegistryChainId", () => {
7
+ it("translates Relay's Solana id to the registry's", () => {
8
+ expect(RELAY_SOLANA_MAINNET_CHAIN_ID).not.toBe(SOLANA_CHAIN_ID);
9
+ expect(toRegistryChainId(RELAY_SOLANA_MAINNET_CHAIN_ID)).toBe(SOLANA_CHAIN_ID);
10
+ });
11
+
12
+ it("leaves EVM chain ids alone — those are universal", () => {
13
+ for (const chainId of [1, 8453, 42161, 137, 999]) {
14
+ expect(toRegistryChainId(chainId)).toBe(chainId);
15
+ }
16
+ });
17
+ });
@@ -1,11 +1,9 @@
1
+ import { chainTypeForIdentifier, isSolanaAddress } from "@b3/chain-registry/runtime";
1
2
  import { isAddress } from "viem";
3
+ import { RELAY_SOLANA_MAINNET_CHAIN_ID } from "../constants";
2
4
  import { HYPERLIQUID_CHAIN_ID } from "./token";
3
5
 
4
- export function isSolanaAddress(address: string): boolean {
5
- // Solana addresses are 32-byte base58 strings (usually 32-44 characters)
6
- const solanaAddressRegex = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;
7
- return solanaAddressRegex.test(address);
8
- }
6
+ export { isSolanaAddress };
9
7
 
10
8
  export function isEvmOrSolanaAddress(address: string): boolean {
11
9
  return isAddress(address) || isSolanaAddress(address);
@@ -49,5 +47,9 @@ export function isSameChainAndToken(
49
47
  destinationChainId: number,
50
48
  destinationTokenAddress: string,
51
49
  ): boolean {
52
- return sourceChainId === destinationChainId && eqci(sourceTokenAddress, destinationTokenAddress);
50
+ if (sourceChainId !== destinationChainId) return false;
51
+ if (chainTypeForIdentifier(String(sourceChainId)) === "solana" || sourceChainId === RELAY_SOLANA_MAINNET_CHAIN_ID) {
52
+ return sourceTokenAddress === destinationTokenAddress;
53
+ }
54
+ return sourceTokenAddress.toLowerCase() === destinationTokenAddress.toLowerCase();
53
55
  }