@mezo-org/passport 0.4.0-dev.4 → 0.4.0-dev.42

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 (303) hide show
  1. package/README.md +18 -22
  2. package/dist/src/api/auth.d.ts +36 -59
  3. package/dist/src/api/auth.d.ts.map +1 -1
  4. package/dist/src/api/auth.js +21 -49
  5. package/dist/src/api/auth.js.map +1 -1
  6. package/dist/src/api/client.d.ts +24 -0
  7. package/dist/src/api/client.d.ts.map +1 -0
  8. package/dist/src/api/client.js +54 -0
  9. package/dist/src/api/client.js.map +1 -0
  10. package/dist/src/api/fetch-error.d.ts +5 -0
  11. package/dist/src/api/fetch-error.d.ts.map +1 -0
  12. package/dist/src/api/fetch-error.js +8 -0
  13. package/dist/src/api/fetch-error.js.map +1 -0
  14. package/dist/src/api/index.d.ts +3 -0
  15. package/dist/src/api/index.d.ts.map +1 -0
  16. package/dist/src/api/index.js +3 -0
  17. package/dist/src/api/index.js.map +1 -0
  18. package/dist/src/api/portal.d.ts +33 -0
  19. package/dist/src/api/portal.d.ts.map +1 -0
  20. package/dist/src/api/portal.js +23 -0
  21. package/dist/src/api/portal.js.map +1 -0
  22. package/dist/src/assets/DefaultAvatar.d.ts +5 -0
  23. package/dist/src/assets/DefaultAvatar.d.ts.map +1 -0
  24. package/dist/src/assets/DefaultAvatar.js +21 -0
  25. package/dist/src/assets/DefaultAvatar.js.map +1 -0
  26. package/dist/src/components/Dropdown/ConnectedTrigger.d.ts +8 -0
  27. package/dist/src/components/Dropdown/ConnectedTrigger.d.ts.map +1 -0
  28. package/dist/src/components/Dropdown/ConnectedTrigger.js +39 -0
  29. package/dist/src/components/Dropdown/ConnectedTrigger.js.map +1 -0
  30. package/dist/src/components/Dropdown/Content.d.ts +23 -0
  31. package/dist/src/components/Dropdown/Content.d.ts.map +1 -0
  32. package/dist/src/components/Dropdown/Content.js +27 -0
  33. package/dist/src/components/Dropdown/Content.js.map +1 -0
  34. package/dist/src/components/Dropdown/DisconnectedTrigger.d.ts +7 -0
  35. package/dist/src/components/Dropdown/DisconnectedTrigger.d.ts.map +1 -0
  36. package/dist/src/components/Dropdown/DisconnectedTrigger.js +13 -0
  37. package/dist/src/components/Dropdown/DisconnectedTrigger.js.map +1 -0
  38. package/dist/src/components/Dropdown/Dropdown.d.ts +27 -0
  39. package/dist/src/components/Dropdown/Dropdown.d.ts.map +1 -0
  40. package/dist/src/components/Dropdown/Dropdown.js +68 -0
  41. package/dist/src/components/Dropdown/Dropdown.js.map +1 -0
  42. package/dist/src/components/Dropdown/ListingItem.d.ts +13 -0
  43. package/dist/src/components/Dropdown/ListingItem.d.ts.map +1 -0
  44. package/dist/src/components/Dropdown/ListingItem.js +34 -0
  45. package/dist/src/components/Dropdown/ListingItem.js.map +1 -0
  46. package/dist/src/components/Dropdown/NestedViewLayout.d.ts +7 -0
  47. package/dist/src/components/Dropdown/NestedViewLayout.d.ts.map +1 -0
  48. package/dist/src/components/Dropdown/NestedViewLayout.js +34 -0
  49. package/dist/src/components/Dropdown/NestedViewLayout.js.map +1 -0
  50. package/dist/src/components/Dropdown/Receive/Receive.d.ts +7 -0
  51. package/dist/src/components/Dropdown/Receive/Receive.d.ts.map +1 -0
  52. package/dist/src/components/Dropdown/Receive/Receive.js +53 -0
  53. package/dist/src/components/Dropdown/Receive/Receive.js.map +1 -0
  54. package/dist/src/components/Dropdown/Root/AccountAddressActions.d.ts +7 -0
  55. package/dist/src/components/Dropdown/Root/AccountAddressActions.d.ts.map +1 -0
  56. package/dist/src/components/Dropdown/Root/AccountAddressActions.js +48 -0
  57. package/dist/src/components/Dropdown/Root/AccountAddressActions.js.map +1 -0
  58. package/dist/src/components/Dropdown/Root/AccountAssetItem.d.ts +11 -0
  59. package/dist/src/components/Dropdown/Root/AccountAssetItem.d.ts.map +1 -0
  60. package/dist/src/components/Dropdown/Root/AccountAssetItem.js +9 -0
  61. package/dist/src/components/Dropdown/Root/AccountAssetItem.js.map +1 -0
  62. package/dist/src/components/Dropdown/Root/AccountBalance.d.ts +8 -0
  63. package/dist/src/components/Dropdown/Root/AccountBalance.d.ts.map +1 -0
  64. package/dist/src/components/Dropdown/Root/AccountBalance.js +15 -0
  65. package/dist/src/components/Dropdown/Root/AccountBalance.js.map +1 -0
  66. package/dist/src/components/Dropdown/Root/AccountOtherAssets.d.ts +9 -0
  67. package/dist/src/components/Dropdown/Root/AccountOtherAssets.d.ts.map +1 -0
  68. package/dist/src/components/Dropdown/Root/AccountOtherAssets.js +48 -0
  69. package/dist/src/components/Dropdown/Root/AccountOtherAssets.js.map +1 -0
  70. package/dist/src/components/Dropdown/Root/Root.d.ts +23 -0
  71. package/dist/src/components/Dropdown/Root/Root.d.ts.map +1 -0
  72. package/dist/src/components/Dropdown/Root/Root.js +57 -0
  73. package/dist/src/components/Dropdown/Root/Root.js.map +1 -0
  74. package/dist/src/components/Dropdown/Root/WalletAddress.d.ts +8 -0
  75. package/dist/src/components/Dropdown/Root/WalletAddress.d.ts.map +1 -0
  76. package/dist/src/components/Dropdown/Root/WalletAddress.js +64 -0
  77. package/dist/src/components/Dropdown/Root/WalletAddress.js.map +1 -0
  78. package/dist/src/components/Dropdown/Root/WelcomeBlock.d.ts +8 -0
  79. package/dist/src/components/Dropdown/Root/WelcomeBlock.d.ts.map +1 -0
  80. package/dist/src/components/Dropdown/Root/WelcomeBlock.js +44 -0
  81. package/dist/src/components/Dropdown/Root/WelcomeBlock.js.map +1 -0
  82. package/dist/src/components/Dropdown/TestnetTopBanner.d.ts +3 -0
  83. package/dist/src/components/Dropdown/TestnetTopBanner.d.ts.map +1 -0
  84. package/dist/src/components/Dropdown/TestnetTopBanner.js +14 -0
  85. package/dist/src/components/Dropdown/TestnetTopBanner.js.map +1 -0
  86. package/dist/src/components/Dropdown/index.d.ts +3 -0
  87. package/dist/src/components/Dropdown/index.d.ts.map +1 -0
  88. package/dist/src/components/Dropdown/index.js +2 -0
  89. package/dist/src/components/Dropdown/index.js.map +1 -0
  90. package/dist/src/components/index.d.ts +2 -0
  91. package/dist/src/components/index.d.ts.map +1 -0
  92. package/dist/src/components/index.js +2 -0
  93. package/dist/src/components/index.js.map +1 -0
  94. package/dist/src/config.d.ts +41 -0
  95. package/dist/src/config.d.ts.map +1 -1
  96. package/dist/src/config.js +17 -5
  97. package/dist/src/config.js.map +1 -1
  98. package/dist/src/constants.d.ts +6 -2
  99. package/dist/src/constants.d.ts.map +1 -1
  100. package/dist/src/constants.js +8 -4
  101. package/dist/src/constants.js.map +1 -1
  102. package/dist/src/hooks/constants.d.ts +1 -0
  103. package/dist/src/hooks/constants.d.ts.map +1 -1
  104. package/dist/src/hooks/constants.js +1 -0
  105. package/dist/src/hooks/constants.js.map +1 -1
  106. package/dist/src/hooks/index.d.ts +4 -1
  107. package/dist/src/hooks/index.d.ts.map +1 -1
  108. package/dist/src/hooks/index.js +4 -1
  109. package/dist/src/hooks/index.js.map +1 -1
  110. package/dist/src/hooks/useAssetsConversionRates.d.ts +7 -0
  111. package/dist/src/hooks/useAssetsConversionRates.d.ts.map +1 -0
  112. package/dist/src/hooks/useAssetsConversionRates.js +24 -0
  113. package/dist/src/hooks/useAssetsConversionRates.js.map +1 -0
  114. package/dist/src/hooks/useAuthApiClient.d.ts +1 -1
  115. package/dist/src/hooks/useAuthApiClient.d.ts.map +1 -1
  116. package/dist/src/hooks/useAuthenticateWithWallet.d.ts +73 -0
  117. package/dist/src/hooks/useAuthenticateWithWallet.d.ts.map +1 -0
  118. package/dist/src/hooks/useAuthenticateWithWallet.js +69 -0
  119. package/dist/src/hooks/useAuthenticateWithWallet.js.map +1 -0
  120. package/dist/src/hooks/useBorrowData.d.ts +60 -0
  121. package/dist/src/hooks/useBorrowData.d.ts.map +1 -0
  122. package/dist/src/hooks/useBorrowData.js +122 -0
  123. package/dist/src/hooks/useBorrowData.js.map +1 -0
  124. package/dist/src/hooks/useCreateAccount.d.ts +23 -173
  125. package/dist/src/hooks/useCreateAccount.d.ts.map +1 -1
  126. package/dist/src/hooks/useCreateAccount.js +7 -4
  127. package/dist/src/hooks/useCreateAccount.js.map +1 -1
  128. package/dist/src/hooks/useCreateSession.d.ts +12 -101
  129. package/dist/src/hooks/useCreateSession.d.ts.map +1 -1
  130. package/dist/src/hooks/useCreateSession.js +10 -8
  131. package/dist/src/hooks/useCreateSession.js.map +1 -1
  132. package/dist/src/hooks/useDropdownData.d.ts +47 -0
  133. package/dist/src/hooks/useDropdownData.d.ts.map +1 -0
  134. package/dist/src/hooks/useDropdownData.js +95 -0
  135. package/dist/src/hooks/useDropdownData.js.map +1 -0
  136. package/dist/src/hooks/useEnsureNoSessionAndFetchNonce.d.ts.map +1 -1
  137. package/dist/src/hooks/useEnsureNoSessionAndFetchNonce.js +1 -0
  138. package/dist/src/hooks/useEnsureNoSessionAndFetchNonce.js.map +1 -1
  139. package/dist/src/hooks/useGetAccountByAddress.d.ts +2 -2
  140. package/dist/src/hooks/useGetAccountByAddress.d.ts.map +1 -1
  141. package/dist/src/hooks/useGetAccountByMezoId.d.ts +2 -2
  142. package/dist/src/hooks/useGetAccountByMezoId.d.ts.map +1 -1
  143. package/dist/src/hooks/useGetCurrentAccount.d.ts +16 -2
  144. package/dist/src/hooks/useGetCurrentAccount.d.ts.map +1 -1
  145. package/dist/src/hooks/useGetCurrentAccount.js +25 -3
  146. package/dist/src/hooks/useGetCurrentAccount.js.map +1 -1
  147. package/dist/src/hooks/useGetSession.d.ts +1 -1
  148. package/dist/src/hooks/useGetSession.d.ts.map +1 -1
  149. package/dist/src/hooks/useLinkAccount.d.ts +15 -175
  150. package/dist/src/hooks/useLinkAccount.d.ts.map +1 -1
  151. package/dist/src/hooks/useLinkAccount.js +7 -4
  152. package/dist/src/hooks/useLinkAccount.js.map +1 -1
  153. package/dist/src/hooks/usePortalApiClient.d.ts +2 -0
  154. package/dist/src/hooks/usePortalApiClient.d.ts.map +1 -0
  155. package/dist/src/hooks/usePortalApiClient.js +6 -0
  156. package/dist/src/hooks/usePortalApiClient.js.map +1 -0
  157. package/dist/src/hooks/useRefreshPassport.d.ts +19 -0
  158. package/dist/src/hooks/useRefreshPassport.d.ts.map +1 -0
  159. package/dist/src/hooks/useRefreshPassport.js +44 -0
  160. package/dist/src/hooks/useRefreshPassport.js.map +1 -0
  161. package/dist/src/hooks/useSignInWithDiscord.d.ts +12 -100
  162. package/dist/src/hooks/useSignInWithDiscord.d.ts.map +1 -1
  163. package/dist/src/hooks/useSignInWithDiscord.js +6 -3
  164. package/dist/src/hooks/useSignInWithDiscord.js.map +1 -1
  165. package/dist/src/hooks/useSignInWithWallet.d.ts +12 -100
  166. package/dist/src/hooks/useSignInWithWallet.d.ts.map +1 -1
  167. package/dist/src/hooks/useSignInWithWallet.js +6 -34
  168. package/dist/src/hooks/useSignInWithWallet.js.map +1 -1
  169. package/dist/src/hooks/useSignOut.d.ts +12 -28
  170. package/dist/src/hooks/useSignOut.d.ts.map +1 -1
  171. package/dist/src/hooks/useSignOut.js +7 -4
  172. package/dist/src/hooks/useSignOut.js.map +1 -1
  173. package/dist/src/hooks/useSignUpWithWallet.d.ts +73 -0
  174. package/dist/src/hooks/useSignUpWithWallet.d.ts.map +1 -0
  175. package/dist/src/hooks/useSignUpWithWallet.js +11 -0
  176. package/dist/src/hooks/useSignUpWithWallet.js.map +1 -0
  177. package/dist/src/hooks/useTokensBalances.d.ts +74 -0
  178. package/dist/src/hooks/useTokensBalances.d.ts.map +1 -0
  179. package/dist/src/hooks/useTokensBalances.js +140 -0
  180. package/dist/src/hooks/useTokensBalances.js.map +1 -0
  181. package/dist/src/hooks/useUpdateMezoId.d.ts +30 -136
  182. package/dist/src/hooks/useUpdateMezoId.d.ts.map +1 -1
  183. package/dist/src/hooks/useUpdateMezoId.js +7 -4
  184. package/dist/src/hooks/useUpdateMezoId.js.map +1 -1
  185. package/dist/src/hooks/useWalletAccount.d.ts +13 -0
  186. package/dist/src/hooks/useWalletAccount.d.ts.map +1 -0
  187. package/dist/src/hooks/useWalletAccount.js +29 -0
  188. package/dist/src/hooks/useWalletAccount.js.map +1 -0
  189. package/dist/src/hooks/useWatchTransferEvents.d.ts +5 -0
  190. package/dist/src/hooks/useWatchTransferEvents.d.ts.map +1 -0
  191. package/dist/src/hooks/useWatchTransferEvents.js +63 -0
  192. package/dist/src/hooks/useWatchTransferEvents.js.map +1 -0
  193. package/dist/src/index.d.ts +2 -1
  194. package/dist/src/index.d.ts.map +1 -1
  195. package/dist/src/index.js +2 -1
  196. package/dist/src/index.js.map +1 -1
  197. package/dist/src/lib/contracts/index.d.ts +13 -0
  198. package/dist/src/lib/contracts/index.d.ts.map +1 -0
  199. package/dist/src/lib/contracts/index.js +57 -0
  200. package/dist/src/lib/contracts/index.js.map +1 -0
  201. package/dist/src/provider.d.ts +10 -13
  202. package/dist/src/provider.d.ts.map +1 -1
  203. package/dist/src/provider.js +11 -20
  204. package/dist/src/provider.js.map +1 -1
  205. package/dist/src/stores/dropdownStore.d.ts +12 -0
  206. package/dist/src/stores/dropdownStore.d.ts.map +1 -0
  207. package/dist/src/stores/dropdownStore.js +13 -0
  208. package/dist/src/stores/dropdownStore.js.map +1 -0
  209. package/dist/src/utils/address.d.ts +15 -0
  210. package/dist/src/utils/address.d.ts.map +1 -0
  211. package/dist/src/utils/address.js +37 -0
  212. package/dist/src/utils/address.js.map +1 -0
  213. package/dist/src/utils/address.test.d.ts +2 -0
  214. package/dist/src/utils/address.test.d.ts.map +1 -0
  215. package/dist/src/utils/address.test.js +40 -0
  216. package/dist/src/utils/address.test.js.map +1 -0
  217. package/dist/src/utils/cryptoAssets.d.ts +44 -0
  218. package/dist/src/utils/cryptoAssets.d.ts.map +1 -0
  219. package/dist/src/utils/cryptoAssets.js +131 -0
  220. package/dist/src/utils/cryptoAssets.js.map +1 -0
  221. package/dist/src/utils/cryptoAssets.test.d.ts +2 -0
  222. package/dist/src/utils/cryptoAssets.test.d.ts.map +1 -0
  223. package/dist/src/utils/cryptoAssets.test.js +67 -0
  224. package/dist/src/utils/cryptoAssets.test.js.map +1 -0
  225. package/dist/src/utils/currency.d.ts +14 -0
  226. package/dist/src/utils/currency.d.ts.map +1 -0
  227. package/dist/src/utils/currency.js +27 -0
  228. package/dist/src/utils/currency.js.map +1 -0
  229. package/dist/src/utils/currency.test.d.ts +2 -0
  230. package/dist/src/utils/currency.test.d.ts.map +1 -0
  231. package/dist/src/utils/currency.test.js +34 -0
  232. package/dist/src/utils/currency.test.js.map +1 -0
  233. package/dist/src/utils/numbers.d.ts +58 -0
  234. package/dist/src/utils/numbers.d.ts.map +1 -0
  235. package/dist/src/utils/numbers.js +132 -0
  236. package/dist/src/utils/numbers.js.map +1 -0
  237. package/dist/src/utils/numbers.test.d.ts +2 -0
  238. package/dist/src/utils/numbers.test.d.ts.map +1 -0
  239. package/dist/src/utils/numbers.test.js +170 -0
  240. package/dist/src/utils/numbers.test.js.map +1 -0
  241. package/package.json +13 -5
  242. package/src/api/auth.ts +72 -129
  243. package/src/api/client.ts +78 -0
  244. package/src/api/fetch-error.ts +8 -0
  245. package/src/api/index.ts +2 -0
  246. package/src/api/portal.ts +57 -0
  247. package/src/assets/DefaultAvatar.tsx +74 -0
  248. package/src/components/Dropdown/ConnectedTrigger.tsx +76 -0
  249. package/src/components/Dropdown/Content.tsx +98 -0
  250. package/src/components/Dropdown/DisconnectedTrigger.tsx +36 -0
  251. package/src/components/Dropdown/Dropdown.tsx +148 -0
  252. package/src/components/Dropdown/ListingItem.tsx +80 -0
  253. package/src/components/Dropdown/NestedViewLayout.tsx +75 -0
  254. package/src/components/Dropdown/README.md +41 -0
  255. package/src/components/Dropdown/Receive/Receive.tsx +119 -0
  256. package/src/components/Dropdown/Root/AccountAddressActions.tsx +101 -0
  257. package/src/components/Dropdown/Root/AccountAssetItem.tsx +26 -0
  258. package/src/components/Dropdown/Root/AccountBalance.tsx +30 -0
  259. package/src/components/Dropdown/Root/AccountOtherAssets.tsx +68 -0
  260. package/src/components/Dropdown/Root/Root.tsx +147 -0
  261. package/src/components/Dropdown/Root/WalletAddress.tsx +128 -0
  262. package/src/components/Dropdown/Root/WelcomeBlock.tsx +91 -0
  263. package/src/components/Dropdown/TestnetTopBanner.tsx +32 -0
  264. package/src/components/Dropdown/index.ts +2 -0
  265. package/src/components/index.ts +1 -0
  266. package/src/config.ts +24 -6
  267. package/src/constants.ts +8 -4
  268. package/src/hooks/constants.ts +1 -0
  269. package/src/hooks/index.ts +7 -1
  270. package/src/hooks/useAssetsConversionRates.ts +32 -0
  271. package/src/hooks/useAuthenticateWithWallet.ts +102 -0
  272. package/src/hooks/useBorrowData.ts +143 -0
  273. package/src/hooks/useCreateAccount.ts +19 -5
  274. package/src/hooks/useCreateSession.ts +22 -9
  275. package/src/hooks/useDropdownData.ts +139 -0
  276. package/src/hooks/useEnsureNoSessionAndFetchNonce.ts +1 -0
  277. package/src/hooks/useGetAccountByAddress.ts +2 -2
  278. package/src/hooks/useGetAccountByMezoId.ts +2 -2
  279. package/src/hooks/useGetCurrentAccount.ts +46 -6
  280. package/src/hooks/useGetSession.ts +1 -1
  281. package/src/hooks/useLinkAccount.ts +18 -5
  282. package/src/hooks/usePortalApiClient.ts +6 -0
  283. package/src/hooks/useRefreshPassport.ts +56 -0
  284. package/src/hooks/useSignInWithDiscord.ts +14 -5
  285. package/src/hooks/useSignInWithWallet.ts +14 -42
  286. package/src/hooks/useSignOut.ts +18 -4
  287. package/src/hooks/useSignUpWithWallet.ts +21 -0
  288. package/src/hooks/useTokensBalances.ts +187 -0
  289. package/src/hooks/useUpdateMezoId.ts +19 -4
  290. package/src/hooks/useWalletAccount.ts +55 -0
  291. package/src/hooks/useWatchTransferEvents.ts +74 -0
  292. package/src/index.ts +9 -1
  293. package/src/lib/contracts/index.ts +88 -0
  294. package/src/provider.ts +30 -37
  295. package/src/stores/dropdownStore.ts +20 -0
  296. package/src/utils/address.test.ts +48 -0
  297. package/src/utils/address.ts +45 -0
  298. package/src/utils/cryptoAssets.test.ts +79 -0
  299. package/src/utils/cryptoAssets.ts +173 -0
  300. package/src/utils/currency.test.ts +38 -0
  301. package/src/utils/currency.ts +32 -0
  302. package/src/utils/numbers.test.ts +220 -0
  303. package/src/utils/numbers.ts +188 -0
@@ -0,0 +1,187 @@
1
+ import { useReadContracts } from "wagmi"
2
+ import { useCallback, useMemo } from "react"
3
+ import { Abi } from "viem"
4
+ import { useQueryClient } from "@tanstack/react-query"
5
+ import { usePassportContext } from "./usePassportContext"
6
+ import {
7
+ mainnetTokenContracts,
8
+ testnetTokenContracts,
9
+ MezoChainToken,
10
+ } from "../lib/contracts"
11
+ import useWalletAccount from "./useWalletAccount"
12
+ import { CHAIN_ID } from "../constants"
13
+
14
+ // Wagmi handles typesafety with ABI const assertions. TypeScript doesn't
15
+ // support importing JSON as const yet so types cannot be inferred from the
16
+ // imported contract. As a workaround there is minimal ABI definition that can
17
+ // be asserted types from.
18
+ // Ref: https://wagmi.sh/core/typescript#const-assert-abis-typed-data
19
+
20
+ const BALANCE_OF_ABI = [
21
+ {
22
+ inputs: [
23
+ {
24
+ internalType: "address",
25
+ name: "account",
26
+ type: "address",
27
+ },
28
+ ],
29
+ name: "balanceOf",
30
+ outputs: [
31
+ {
32
+ internalType: "uint256",
33
+ name: "",
34
+ type: "uint256",
35
+ },
36
+ ],
37
+ stateMutability: "view",
38
+ type: "function",
39
+ },
40
+ ] as const satisfies Abi
41
+
42
+ const BALANCE_TOKENS: MezoChainToken[] = [
43
+ "mcbBTC",
44
+ "mDAI",
45
+ "mFBTC",
46
+ "mSolvBTC",
47
+ "mswBTC",
48
+ "mT",
49
+ "mUSDC",
50
+ "mUSDe",
51
+ "mUSDT",
52
+ "mxSolvBTC",
53
+ "MUSD",
54
+ ]
55
+
56
+ type UseMezoChainTokensBalancesOptions<T> = {
57
+ tokens?: T
58
+ queryOptions?: object
59
+ }
60
+
61
+ /**
62
+ * Hook to get the balance of a list of tokens for the current account
63
+ * @param options.tokens The list of tokens to get the balance for. It will
64
+ * fallback to all tokens if not provided.
65
+ * @param options.queryOptions The query options to pass to the
66
+ * `useReadContracts`
67
+ * @returns Tanstack's `useQuery` returnings with balance of tokens for the
68
+ * current account in form of typesafe object with token names as keys
69
+ * and balances as values.
70
+ * @dev In case of error data fallbacks to `0n`. To determine if an error
71
+ * occurred, check the `isError` property.
72
+ * @example
73
+ * const mezoTokensBalance = useTokensBalances({
74
+ * tokens: ["mT", "mxSolvBTC"],
75
+ * })
76
+ * console.log(mezoTokensBalance?.data.mT) // Eg. 0n
77
+ * console.log(Object.keys(mezoTokensBalance?.data)) // ["mT", "mxSolvBTC"]
78
+ */
79
+ export function useTokensBalances<T extends MezoChainToken[]>(
80
+ options: UseMezoChainTokensBalancesOptions<T> = {},
81
+ ) {
82
+ const { environment = "mainnet" } = usePassportContext()
83
+
84
+ const { accountAddress } = useWalletAccount()
85
+
86
+ const contractsMap = useMemo(() => {
87
+ const contracts =
88
+ environment === "mainnet" ? mainnetTokenContracts : testnetTokenContracts
89
+
90
+ const tokenContracts = Object.fromEntries(
91
+ Object.entries(contracts).filter(([key]) =>
92
+ BALANCE_TOKENS.includes(key as MezoChainToken),
93
+ ),
94
+ ) as typeof contracts
95
+
96
+ return tokenContracts
97
+ }, [environment])
98
+
99
+ const { tokens = Object.keys(contractsMap) as T, queryOptions = {} } = options
100
+
101
+ const contracts = useMemo(() => {
102
+ if (!accountAddress) return []
103
+
104
+ return tokens.map((token) => {
105
+ const { address } = contractsMap[token]
106
+
107
+ return {
108
+ address,
109
+ abi: BALANCE_OF_ABI,
110
+ functionName: "balanceOf",
111
+ args: [accountAddress],
112
+ chainId: CHAIN_ID[environment],
113
+ }
114
+ })
115
+ }, [accountAddress, tokens, contractsMap, environment])
116
+
117
+ return useReadContracts({
118
+ contracts,
119
+ query: {
120
+ select: (data) =>
121
+ data.reduce(
122
+ (acc, item) => {
123
+ const token = tokens[data.indexOf(item)]
124
+
125
+ return {
126
+ ...acc,
127
+ [token]: item.result ?? 0n,
128
+ }
129
+ },
130
+ {} as Record<T[number], bigint>,
131
+ ),
132
+ ...queryOptions,
133
+ },
134
+ })
135
+ }
136
+
137
+ /**
138
+ * Hook for invalidating current user's token balances. Can be used to
139
+ * invalidate the balances manually, which forces the data to be re-fetched.
140
+ * @param tokens The list of tokens (as string arrays) for which we want to
141
+ * invalidate query for.
142
+ * @returns Function `invalidateTokenBalances` that invalidates token balances
143
+ * @example
144
+ * const { invalidateTokenBalances } = useInvalidateTokensBalances(["mT", "mUSD"])
145
+ * (...)
146
+ * await invalidateTokenBalances()
147
+ */
148
+ export function useInvalidateTokensBalances(tokens?: MezoChainToken[]) {
149
+ const queryClient = useQueryClient()
150
+
151
+ const { queryKey } = useTokensBalances({ tokens })
152
+
153
+ const invalidateTokensBalancesHandler = useCallback(
154
+ () => queryClient.invalidateQueries({ queryKey }),
155
+ [queryClient, queryKey],
156
+ )
157
+
158
+ return {
159
+ invalidateTokensBalances: invalidateTokensBalancesHandler,
160
+ }
161
+ }
162
+
163
+ /**
164
+ * Hook for resetting current user's token balances. Can be used to reset the
165
+ * balances manually, which forces the data to be re-fetched.
166
+ * @param tokens The list of tokens (as string arrays) for which we want to
167
+ * reset query for.
168
+ * @returns Function `resetTokenBalances` that invalidates token balances
169
+ * @example
170
+ * const { resetTokenBalances } = useResetTokensBalances(["mT", "mUSD"])
171
+ * (...)
172
+ * await resetTokenBalances()
173
+ */
174
+ export function useResetTokensBalances(tokens?: MezoChainToken[]) {
175
+ const queryClient = useQueryClient()
176
+
177
+ const { queryKey } = useTokensBalances({ tokens })
178
+
179
+ const resetTokenBalancesHandler = useCallback(
180
+ () => queryClient.resetQueries({ queryKey }),
181
+ [queryClient, queryKey],
182
+ )
183
+
184
+ return {
185
+ resetTokenBalances: resetTokenBalancesHandler,
186
+ }
187
+ }
@@ -1,17 +1,32 @@
1
- import { useQueryClient, useMutation } from "@tanstack/react-query"
1
+ import {
2
+ useQueryClient,
3
+ useMutation,
4
+ MutationOptions,
5
+ DefaultError,
6
+ } from "@tanstack/react-query"
2
7
  import { useAuthApiClient } from "./useAuthApiClient"
3
8
  import { QUERY_KEYS } from "./constants"
9
+ import type { UpdateMezoIdResponse } from "../api"
4
10
 
5
- export function useUpdateMezoId(useMutationOptions = {}) {
11
+ export function useUpdateMezoId(
12
+ mutationOptions: Omit<
13
+ MutationOptions<UpdateMezoIdResponse, DefaultError, string>,
14
+ "mutationFn" | "mutationKey"
15
+ > = {},
16
+ ) {
6
17
  const queryClient = useQueryClient()
7
18
  const authApiClient = useAuthApiClient()
8
19
 
20
+ const { onSuccess: customOnSuccess, ...restMutationOptions } = mutationOptions
21
+
9
22
  const { mutate, mutateAsync, ...rest } = useMutation({
10
23
  mutationFn: (newMezoId: string) => authApiClient.updateMezoId(newMezoId),
11
- onSuccess: () => {
24
+ onSuccess: (data, variables, context) => {
12
25
  queryClient.resetQueries({ queryKey: [QUERY_KEYS.ACCOUNT] })
26
+
27
+ if (customOnSuccess) customOnSuccess(data, variables, context)
13
28
  },
14
- ...useMutationOptions,
29
+ ...restMutationOptions,
15
30
  })
16
31
 
17
32
  return { updateMezoId: mutate, updateMezoIdAsync: mutateAsync, ...rest }
@@ -0,0 +1,55 @@
1
+ import { OrangeKitBitcoinProvider } from "@mezo-org/orangekit"
2
+ import { useQuery } from "@tanstack/react-query"
3
+ import { useMemo } from "react"
4
+ import { Address } from "viem"
5
+ import { Connector, useAccount } from "wagmi"
6
+
7
+ type UseWalletAccountReturn = {
8
+ accountAddress?: Address
9
+ walletAddress?: string
10
+ isConnected: boolean
11
+ networkFamily: "bitcoin" | "evm"
12
+ connector?: Connector
13
+ chainId?: number
14
+ }
15
+
16
+ type OrangeKitConnector = {
17
+ getBitcoinProvider: () => OrangeKitBitcoinProvider
18
+ }
19
+
20
+ export default function useWalletAccount(): UseWalletAccountReturn {
21
+ const { address: evmAddress, connector, chainId } = useAccount()
22
+
23
+ const networkFamily = useMemo(
24
+ () => (connector?.type !== "orangekit" ? "evm" : "bitcoin"),
25
+ [connector],
26
+ )
27
+
28
+ const { data: btcData } = useQuery({
29
+ queryKey: [connector?.id],
30
+ queryFn: async () => {
31
+ const bitcoinProvider = (
32
+ connector as unknown as OrangeKitConnector
33
+ ).getBitcoinProvider()
34
+
35
+ const address = await bitcoinProvider.getAddress()
36
+ const balance = await bitcoinProvider.getBalance()
37
+
38
+ return {
39
+ address,
40
+ balance,
41
+ }
42
+ },
43
+ })
44
+
45
+ const { address: btcAddress } = btcData || {}
46
+
47
+ return {
48
+ accountAddress: evmAddress,
49
+ walletAddress: btcAddress ?? evmAddress,
50
+ isConnected: networkFamily === "bitcoin" ? !!btcAddress : !!evmAddress,
51
+ networkFamily,
52
+ connector,
53
+ chainId,
54
+ } as const
55
+ }
@@ -0,0 +1,74 @@
1
+ import { useMemo } from "react"
2
+ import { useAccount, useWatchContractEvent } from "wagmi"
3
+ import {
4
+ mainnetTokenContracts,
5
+ MezoChainToken,
6
+ testnetTokenContracts,
7
+ } from "../lib/contracts"
8
+ import { usePassportContext } from "./usePassportContext"
9
+ import { CHAIN_ID } from "../constants"
10
+ import { useRefreshPassport } from "./useRefreshPassport"
11
+ import { simpleWssMezoConfig } from "../config"
12
+
13
+ function useWatchTransferEvents(token: MezoChainToken) {
14
+ const { address: userAddress } = useAccount()
15
+ const { environment = "mainnet" } = usePassportContext()
16
+ const { refreshTokensBalances, refreshBorrowData } = useRefreshPassport()
17
+
18
+ const contract = useMemo(() => {
19
+ const contracts =
20
+ environment === "mainnet" ? mainnetTokenContracts : testnetTokenContracts
21
+
22
+ return contracts[token]
23
+ }, [environment, token])
24
+
25
+ useWatchContractEvent({
26
+ address: contract.address,
27
+ abi: contract.abi,
28
+ eventName: "Transfer",
29
+ args: {
30
+ from: userAddress,
31
+ },
32
+ chainId: CHAIN_ID[environment],
33
+ enabled: !!userAddress,
34
+ config: simpleWssMezoConfig,
35
+ onLogs() {
36
+ console.log(`[${token}] Transfer from: ${userAddress}`)
37
+ refreshTokensBalances()
38
+ refreshBorrowData()
39
+ },
40
+ })
41
+
42
+ useWatchContractEvent({
43
+ address: contract.address,
44
+ abi: contract.abi,
45
+ eventName: "Transfer",
46
+ args: {
47
+ to: userAddress,
48
+ },
49
+ chainId: CHAIN_ID[environment],
50
+ enabled: !!userAddress,
51
+ config: simpleWssMezoConfig,
52
+ onLogs() {
53
+ console.log(`[${token}] Transfer to: ${userAddress}`)
54
+ refreshTokensBalances()
55
+ refreshBorrowData()
56
+ },
57
+ })
58
+ }
59
+
60
+ function useWatchTransferEventsForAllTokens() {
61
+ useWatchTransferEvents("mcbBTC")
62
+ useWatchTransferEvents("mDAI")
63
+ useWatchTransferEvents("mFBTC")
64
+ useWatchTransferEvents("mSolvBTC")
65
+ useWatchTransferEvents("mswBTC")
66
+ useWatchTransferEvents("mT")
67
+ useWatchTransferEvents("mUSDC")
68
+ useWatchTransferEvents("mUSDe")
69
+ useWatchTransferEvents("mUSDT")
70
+ useWatchTransferEvents("mxSolvBTC")
71
+ useWatchTransferEvents("MUSD")
72
+ }
73
+
74
+ export { useWatchTransferEvents, useWatchTransferEventsForAllTokens }
package/src/index.ts CHANGED
@@ -1,4 +1,12 @@
1
- export * from "./config"
1
+ export * from "./components"
2
+ export {
3
+ defaultConfig,
4
+ unisatWallet,
5
+ okxWallet,
6
+ xverseWallet,
7
+ getDefaultWallets,
8
+ getConfig,
9
+ } from "./config"
2
10
  export * from "./constants"
3
11
  export * from "./hooks"
4
12
  export * from "./provider"
@@ -0,0 +1,88 @@
1
+ import cbbtcMainnet from "@mezo-org/mezod-contracts/deployments/mainnet/mcbBTC.json"
2
+ import daiMainnet from "@mezo-org/mezod-contracts/deployments/mainnet/mDAI.json"
3
+ import fbtcMainnet from "@mezo-org/mezod-contracts/deployments/mainnet/mFBTC.json"
4
+ import solvbtcMainnet from "@mezo-org/mezod-contracts/deployments/mainnet/mSolvBTC.json"
5
+ import swbtcMainnet from "@mezo-org/mezod-contracts/deployments/mainnet/mswBTC.json"
6
+ import tMainnet from "@mezo-org/mezod-contracts/deployments/mainnet/mT.json"
7
+ import usdcMainnet from "@mezo-org/mezod-contracts/deployments/mainnet/mUSDC.json"
8
+ import usdeMainnet from "@mezo-org/mezod-contracts/deployments/mainnet/mUSDe.json"
9
+ import usdtMainnet from "@mezo-org/mezod-contracts/deployments/mainnet/mUSDT.json"
10
+ import xsolvbtcMainnet from "@mezo-org/mezod-contracts/deployments/mainnet/mxSolvBTC.json"
11
+ import musdMainnet from "@mezo-org/musd-contracts/deployments/mainnet/MUSD.json"
12
+
13
+ import troveManagerMainnet from "@mezo-org/musd-contracts/deployments/mainnet/TroveManager.json"
14
+
15
+ import cbbtcTestnet from "@mezo-org/mezod-contracts/deployments/testnet/mcbBTC.json"
16
+ import daiTestnet from "@mezo-org/mezod-contracts/deployments/testnet/mDAI.json"
17
+ import fbtcTestnet from "@mezo-org/mezod-contracts/deployments/testnet/mFBTC.json"
18
+ import solvbtcTestnet from "@mezo-org/mezod-contracts/deployments/testnet/mSolvBTC.json"
19
+ import swbtcTestnet from "@mezo-org/mezod-contracts/deployments/testnet/mswBTC.json"
20
+ import tTestnet from "@mezo-org/mezod-contracts/deployments/testnet/mT.json"
21
+ import usdcTestnet from "@mezo-org/mezod-contracts/deployments/testnet/mUSDC.json"
22
+ import usdeTestnet from "@mezo-org/mezod-contracts/deployments/testnet/mUSDe.json"
23
+ import usdtTestnet from "@mezo-org/mezod-contracts/deployments/testnet/mUSDT.json"
24
+ import xsolvbtcTestnet from "@mezo-org/mezod-contracts/deployments/testnet/mxSolvBTC.json"
25
+ import musdTestnet from "@mezo-org/musd-contracts/deployments/matsnet/MUSD.json"
26
+
27
+ import troveManagerTestnet from "@mezo-org/musd-contracts/deployments/matsnet/TroveManager.json"
28
+
29
+ import { Abi, Address } from "viem"
30
+
31
+ export type MezoChainToken =
32
+ | "mcbBTC"
33
+ | "mDAI"
34
+ | "mFBTC"
35
+ | "mSolvBTC"
36
+ | "mswBTC"
37
+ | "mT"
38
+ | "mUSDC"
39
+ | "mUSDe"
40
+ | "mUSDT"
41
+ | "mxSolvBTC"
42
+ | "MUSD"
43
+
44
+ export type MezoBorrowContract = "TroveManager"
45
+
46
+ type ContractsMap<K extends string> = Record<
47
+ K,
48
+ {
49
+ address: Address
50
+ abi: Abi
51
+ }
52
+ >
53
+
54
+ export const testnetTokenContracts = {
55
+ mcbBTC: cbbtcTestnet,
56
+ mDAI: daiTestnet,
57
+ mFBTC: fbtcTestnet,
58
+ mSolvBTC: solvbtcTestnet,
59
+ mswBTC: swbtcTestnet,
60
+ mT: tTestnet,
61
+ mUSDC: usdcTestnet,
62
+ mUSDe: usdeTestnet,
63
+ mUSDT: usdtTestnet,
64
+ mxSolvBTC: xsolvbtcTestnet,
65
+ MUSD: musdTestnet,
66
+ } as unknown as ContractsMap<MezoChainToken>
67
+
68
+ export const mainnetTokenContracts = {
69
+ mcbBTC: cbbtcMainnet,
70
+ mDAI: daiMainnet,
71
+ mFBTC: fbtcMainnet,
72
+ mSolvBTC: solvbtcMainnet,
73
+ mswBTC: swbtcMainnet,
74
+ mT: tMainnet,
75
+ mUSDC: usdcMainnet,
76
+ mUSDe: usdeMainnet,
77
+ mUSDT: usdtMainnet,
78
+ mxSolvBTC: xsolvbtcMainnet,
79
+ MUSD: musdMainnet,
80
+ } as unknown as ContractsMap<MezoChainToken>
81
+
82
+ export const mainnetBorrowContracts = {
83
+ TroveManager: troveManagerMainnet,
84
+ } as unknown as ContractsMap<MezoBorrowContract>
85
+
86
+ export const testnetBorrowContracts = {
87
+ TroveManager: troveManagerTestnet,
88
+ } as unknown as ContractsMap<MezoBorrowContract>
package/src/provider.ts CHANGED
@@ -1,56 +1,49 @@
1
- import { createContext, createElement, useMemo } from "react"
2
- import { API_ENDPOINTS_BY_ENV, AuthApiClient } from "./api/auth"
1
+ import { createContext, createElement } from "react"
2
+ import { AuthApiClient, PortalApiClient } from "./api"
3
3
 
4
4
  export interface PassportContextValue {
5
5
  authApiClient: AuthApiClient
6
+ portalApiClient: PortalApiClient
7
+ environment?: Environment
6
8
  }
7
9
 
8
10
  export const PassportContext = createContext<PassportContextValue | undefined>(
9
11
  undefined,
10
12
  )
11
13
 
12
- interface PassportProviderProps {
13
- // eslint-disable-next-line react/require-default-props
14
- options: {
15
- environment?: keyof typeof API_ENDPOINTS_BY_ENV
16
- apiUrl?: string
17
- } & (
18
- | {
19
- environment: keyof typeof API_ENDPOINTS_BY_ENV
20
- }
21
- | {
22
- apiUrl: string
23
- }
24
- )
14
+ type Environment = "mainnet" | "testnet"
15
+
16
+ type PassportProviderProps = {
25
17
  children: React.ReactNode
18
+ // eslint-disable-next-line react/require-default-props
19
+ environment?: Environment
20
+ // eslint-disable-next-line react/require-default-props
21
+ authApiUrl?: string
22
+ // eslint-disable-next-line react/require-default-props
23
+ portalApiUrl?: string
26
24
  }
27
25
 
28
- export function PassportProvider({ options, children }: PassportProviderProps) {
29
- const { environment, apiUrl } = options
30
-
31
- const finalApiUrl = useMemo(() => {
32
- if (!environment && !apiUrl) {
33
- throw new Error(
34
- "Neither apiUrl or environment are specified in Passport Provider",
35
- )
36
- }
37
- if (apiUrl) return apiUrl
38
-
39
- if (!(environment! in API_ENDPOINTS_BY_ENV)) {
40
- throw new Error("Wrong environment passed to PassportProvider.")
41
- }
42
-
43
- return API_ENDPOINTS_BY_ENV[environment!]
44
- }, [environment, apiUrl])
26
+ export function PassportProvider({
27
+ environment,
28
+ authApiUrl,
29
+ portalApiUrl,
30
+ children,
31
+ }: PassportProviderProps) {
32
+ if (environment && !["mainnet", "testnet"].includes(environment)) {
33
+ throw new Error("Wrong environment passed to PassportProvider.")
34
+ }
45
35
 
46
36
  return createElement(
47
37
  PassportContext.Provider,
48
38
  {
49
- value: finalApiUrl
50
- ? {
51
- authApiClient: new AuthApiClient(finalApiUrl),
52
- }
53
- : undefined,
39
+ value: {
40
+ authApiClient: new AuthApiClient(environment ?? "mainnet", authApiUrl),
41
+ portalApiClient: new PortalApiClient(
42
+ environment ?? "mainnet",
43
+ portalApiUrl,
44
+ ),
45
+ environment,
46
+ },
54
47
  },
55
48
  children,
56
49
  )
@@ -0,0 +1,20 @@
1
+ import { create } from "zustand"
2
+
3
+ export enum DropdownView {
4
+ ROOT = "ROOT",
5
+ RECEIVE = "RECEIVE",
6
+ }
7
+
8
+ interface DropdownStore {
9
+ view: DropdownView
10
+ setView: (view: DropdownView) => void
11
+ isNestedView: () => boolean
12
+ }
13
+
14
+ const useDropdownStore = create<DropdownStore>((set, get) => ({
15
+ view: DropdownView.ROOT,
16
+ setView: (view: DropdownView) => set({ view }),
17
+ isNestedView: () => get().view !== DropdownView.ROOT,
18
+ }))
19
+
20
+ export default useDropdownStore
@@ -0,0 +1,48 @@
1
+ import { getAddressExplorerUrl, trimAddress } from "./address"
2
+
3
+ describe("trimAddress", () => {
4
+ it("returns full address if length is less than 11", () => {
5
+ expect(trimAddress("0x12345")).toBe("0x12345")
6
+ })
7
+
8
+ it("returns trimmed address if length is 11 or more", () => {
9
+ const input = "0x123456789abcdef"
10
+ const expected = "0x123...bcdef"
11
+ expect(trimAddress(input)).toBe(expected)
12
+ })
13
+ })
14
+
15
+ describe("getAddressExplorerUrl", () => {
16
+ const btcAddress = "bc1qxyz123"
17
+ const evmAddress = "0x1234567890abcdef"
18
+
19
+ it("returns correct mainnet Bitcoin explorer URL", () => {
20
+ const url = getAddressExplorerUrl(btcAddress, "bitcoin", false)
21
+ expect(url).toBe(`https://mempool.space/address/${btcAddress}`)
22
+ })
23
+
24
+ it("returns correct testnet Bitcoin explorer URL", () => {
25
+ const url = getAddressExplorerUrl(btcAddress, "bitcoin", true)
26
+ expect(url).toBe(`https://mempool.space/testnet/address/${btcAddress}`)
27
+ })
28
+
29
+ it("returns correct mainnet EVM explorer URL", () => {
30
+ const url = getAddressExplorerUrl(evmAddress, "evm", false)
31
+ expect(url).toBe(`https://etherscan.io/address/${evmAddress}`)
32
+ })
33
+
34
+ it("returns correct testnet EVM explorer URL", () => {
35
+ const url = getAddressExplorerUrl(evmAddress, "evm", true)
36
+ expect(url).toBe(`https://sepolia.etherscan.io/address/${evmAddress}`)
37
+ })
38
+
39
+ it("returns correct mainnet Mezo explorer URL", () => {
40
+ const url = getAddressExplorerUrl(evmAddress, "mezo", false)
41
+ expect(url).toBe(`https://explorer.mezo.org/address/${evmAddress}`)
42
+ })
43
+
44
+ it("returns correct testnet Mezo explorer URL", () => {
45
+ const url = getAddressExplorerUrl(evmAddress, "mezo", true)
46
+ expect(url).toBe(`https://explorer.test.mezo.org/address/${evmAddress}`)
47
+ })
48
+ })
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Trims the address to the first 5 and last 5 characters.
3
+ * @param address The address to trim.
4
+ * @returns The trimmed address.
5
+ */
6
+ export function trimAddress(address: string): string {
7
+ if (address.length < 11) return address
8
+
9
+ const trimmedAddress = `${address.slice(0, 5)}...${address.slice(-5)}`
10
+
11
+ return trimmedAddress
12
+ }
13
+
14
+ const MAINNET_EXPLORER_URLS: Record<"bitcoin" | "evm" | "mezo", string> = {
15
+ bitcoin: "https://mempool.space",
16
+ evm: "https://etherscan.io",
17
+ mezo: "https://explorer.mezo.org",
18
+ }
19
+
20
+ const TESTNET_EXPLORER_URLS: Record<"bitcoin" | "evm" | "mezo", string> = {
21
+ bitcoin: "https://mempool.space/testnet",
22
+ evm: "https://sepolia.etherscan.io",
23
+ mezo: "https://explorer.test.mezo.org",
24
+ }
25
+
26
+ /**
27
+ * Get the URL of the block explorer page for an address.
28
+ * @param address - The address to link to.
29
+ * @param chainType - The chain type of the address.
30
+ * @param isTestnet - Whether the address is on testnet.
31
+ * @returns The URL of the block explorer page for the address.
32
+ */
33
+ export function getAddressExplorerUrl(
34
+ address: string,
35
+ chainType: "bitcoin" | "evm" | "mezo",
36
+ isTestnet: boolean,
37
+ ) {
38
+ const EXPLORER_URLS = isTestnet
39
+ ? TESTNET_EXPLORER_URLS
40
+ : MAINNET_EXPLORER_URLS
41
+ const baseUrl = EXPLORER_URLS[chainType]
42
+ const endpoint = `address/${address}`
43
+
44
+ return `${baseUrl}/${endpoint}`
45
+ }