@mezo-org/passport 0.4.0-dev.6 → 0.4.0-dev.60

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 (248) hide show
  1. package/README.md +18 -22
  2. package/dist/src/api/auth.d.ts.map +1 -1
  3. package/dist/src/api/auth.js +3 -1
  4. package/dist/src/api/auth.js.map +1 -1
  5. package/dist/src/api/client.d.ts +4 -1
  6. package/dist/src/api/client.d.ts.map +1 -1
  7. package/dist/src/api/client.js +9 -2
  8. package/dist/src/api/client.js.map +1 -1
  9. package/dist/src/api/portal.d.ts +3 -9
  10. package/dist/src/api/portal.d.ts.map +1 -1
  11. package/dist/src/api/portal.js +8 -5
  12. package/dist/src/api/portal.js.map +1 -1
  13. package/dist/src/components/Dropdown/ConnectedTrigger.d.ts +2 -1
  14. package/dist/src/components/Dropdown/ConnectedTrigger.d.ts.map +1 -1
  15. package/dist/src/components/Dropdown/ConnectedTrigger.js +29 -20
  16. package/dist/src/components/Dropdown/ConnectedTrigger.js.map +1 -1
  17. package/dist/src/components/Dropdown/Content.d.ts +20 -5
  18. package/dist/src/components/Dropdown/Content.d.ts.map +1 -1
  19. package/dist/src/components/Dropdown/Content.js +19 -57
  20. package/dist/src/components/Dropdown/Content.js.map +1 -1
  21. package/dist/src/components/Dropdown/DisconnectedTrigger.d.ts.map +1 -1
  22. package/dist/src/components/Dropdown/DisconnectedTrigger.js +2 -2
  23. package/dist/src/components/Dropdown/DisconnectedTrigger.js.map +1 -1
  24. package/dist/src/components/Dropdown/Dropdown.d.ts +17 -8
  25. package/dist/src/components/Dropdown/Dropdown.d.ts.map +1 -1
  26. package/dist/src/components/Dropdown/Dropdown.js +35 -9
  27. package/dist/src/components/Dropdown/Dropdown.js.map +1 -1
  28. package/dist/src/components/Dropdown/ListingItem.d.ts +13 -0
  29. package/dist/src/components/Dropdown/ListingItem.d.ts.map +1 -0
  30. package/dist/src/components/Dropdown/ListingItem.js +34 -0
  31. package/dist/src/components/Dropdown/ListingItem.js.map +1 -0
  32. package/dist/src/components/Dropdown/NestedViewLayout.d.ts +7 -0
  33. package/dist/src/components/Dropdown/NestedViewLayout.d.ts.map +1 -0
  34. package/dist/src/components/Dropdown/NestedViewLayout.js +34 -0
  35. package/dist/src/components/Dropdown/NestedViewLayout.js.map +1 -0
  36. package/dist/src/components/Dropdown/Receive/Receive.d.ts +7 -0
  37. package/dist/src/components/Dropdown/Receive/Receive.d.ts.map +1 -0
  38. package/dist/src/components/Dropdown/Receive/Receive.js +53 -0
  39. package/dist/src/components/Dropdown/Receive/Receive.js.map +1 -0
  40. package/dist/src/components/Dropdown/Root/AccountAddressActions.d.ts +7 -0
  41. package/dist/src/components/Dropdown/Root/AccountAddressActions.d.ts.map +1 -0
  42. package/dist/src/components/Dropdown/Root/AccountAddressActions.js +48 -0
  43. package/dist/src/components/Dropdown/Root/AccountAddressActions.js.map +1 -0
  44. package/dist/src/components/Dropdown/Root/AccountAssetItem.d.ts +11 -0
  45. package/dist/src/components/Dropdown/Root/AccountAssetItem.d.ts.map +1 -0
  46. package/dist/src/components/Dropdown/Root/AccountAssetItem.js +9 -0
  47. package/dist/src/components/Dropdown/Root/AccountAssetItem.js.map +1 -0
  48. package/dist/src/components/Dropdown/{AccountBalance.d.ts → Root/AccountBalance.d.ts} +2 -1
  49. package/dist/src/components/Dropdown/Root/AccountBalance.d.ts.map +1 -0
  50. package/dist/src/components/Dropdown/Root/AccountBalance.js +15 -0
  51. package/dist/src/components/Dropdown/Root/AccountBalance.js.map +1 -0
  52. package/dist/src/components/Dropdown/Root/AccountBtcListing.d.ts +3 -0
  53. package/dist/src/components/Dropdown/Root/AccountBtcListing.d.ts.map +1 -0
  54. package/dist/src/components/Dropdown/Root/AccountBtcListing.js +22 -0
  55. package/dist/src/components/Dropdown/Root/AccountBtcListing.js.map +1 -0
  56. package/dist/src/components/Dropdown/Root/AccountMusdListing.d.ts +3 -0
  57. package/dist/src/components/Dropdown/Root/AccountMusdListing.d.ts.map +1 -0
  58. package/dist/src/components/Dropdown/Root/AccountMusdListing.js +22 -0
  59. package/dist/src/components/Dropdown/Root/AccountMusdListing.js.map +1 -0
  60. package/dist/src/components/Dropdown/Root/AccountOtherAssets.d.ts +9 -0
  61. package/dist/src/components/Dropdown/Root/AccountOtherAssets.d.ts.map +1 -0
  62. package/dist/src/components/Dropdown/Root/AccountOtherAssets.js +48 -0
  63. package/dist/src/components/Dropdown/Root/AccountOtherAssets.js.map +1 -0
  64. package/dist/src/components/Dropdown/Root/Root.d.ts +23 -0
  65. package/dist/src/components/Dropdown/Root/Root.d.ts.map +1 -0
  66. package/dist/src/components/Dropdown/Root/Root.js +57 -0
  67. package/dist/src/components/Dropdown/Root/Root.js.map +1 -0
  68. package/dist/src/components/Dropdown/Root/WalletAddress.d.ts +8 -0
  69. package/dist/src/components/Dropdown/Root/WalletAddress.d.ts.map +1 -0
  70. package/dist/src/components/Dropdown/{AccountAddress.js → Root/WalletAddress.js} +21 -15
  71. package/dist/src/components/Dropdown/Root/WalletAddress.js.map +1 -0
  72. package/dist/src/components/Dropdown/{WelcomeBlock.d.ts → Root/WelcomeBlock.d.ts} +1 -1
  73. package/dist/src/components/Dropdown/Root/WelcomeBlock.d.ts.map +1 -0
  74. package/dist/src/components/Dropdown/{WelcomeBlock.js → Root/WelcomeBlock.js} +5 -5
  75. package/dist/src/components/Dropdown/Root/WelcomeBlock.js.map +1 -0
  76. package/dist/src/components/Dropdown/TestnetTopBanner.d.ts +3 -0
  77. package/dist/src/components/Dropdown/TestnetTopBanner.d.ts.map +1 -0
  78. package/dist/src/components/Dropdown/TestnetTopBanner.js +14 -0
  79. package/dist/src/components/Dropdown/TestnetTopBanner.js.map +1 -0
  80. package/dist/src/config.d.ts +17 -5
  81. package/dist/src/config.d.ts.map +1 -1
  82. package/dist/src/config.js +51 -14
  83. package/dist/src/config.js.map +1 -1
  84. package/dist/src/constants.d.ts +11 -3
  85. package/dist/src/constants.d.ts.map +1 -1
  86. package/dist/src/constants.js +12 -4
  87. package/dist/src/constants.js.map +1 -1
  88. package/dist/src/hooks/index.d.ts +3 -0
  89. package/dist/src/hooks/index.d.ts.map +1 -1
  90. package/dist/src/hooks/index.js +3 -0
  91. package/dist/src/hooks/index.js.map +1 -1
  92. package/dist/src/hooks/useAssetsConversionRates.d.ts +23 -0
  93. package/dist/src/hooks/useAssetsConversionRates.d.ts.map +1 -0
  94. package/dist/src/hooks/useAssetsConversionRates.js +90 -0
  95. package/dist/src/hooks/useAssetsConversionRates.js.map +1 -0
  96. package/dist/src/hooks/useAuthenticateWithWallet.d.ts.map +1 -1
  97. package/dist/src/hooks/useAuthenticateWithWallet.js +7 -8
  98. package/dist/src/hooks/useAuthenticateWithWallet.js.map +1 -1
  99. package/dist/src/hooks/useAutoConnect.d.ts +10 -0
  100. package/dist/src/hooks/useAutoConnect.d.ts.map +1 -0
  101. package/dist/src/hooks/useAutoConnect.js +41 -0
  102. package/dist/src/hooks/useAutoConnect.js.map +1 -0
  103. package/dist/src/hooks/useBorrowData.d.ts +82 -0
  104. package/dist/src/hooks/useBorrowData.d.ts.map +1 -0
  105. package/dist/src/hooks/useBorrowData.js +157 -0
  106. package/dist/src/hooks/useBorrowData.js.map +1 -0
  107. package/dist/src/hooks/useDropdownData.d.ts +37 -34
  108. package/dist/src/hooks/useDropdownData.d.ts.map +1 -1
  109. package/dist/src/hooks/useDropdownData.js +85 -61
  110. package/dist/src/hooks/useDropdownData.js.map +1 -1
  111. package/dist/src/hooks/useRefreshPassport.d.ts +19 -0
  112. package/dist/src/hooks/useRefreshPassport.d.ts.map +1 -0
  113. package/dist/src/hooks/useRefreshPassport.js +44 -0
  114. package/dist/src/hooks/useRefreshPassport.js.map +1 -0
  115. package/dist/src/hooks/useTokensBalances.d.ts +74 -0
  116. package/dist/src/hooks/useTokensBalances.d.ts.map +1 -0
  117. package/dist/src/hooks/useTokensBalances.js +140 -0
  118. package/dist/src/hooks/useTokensBalances.js.map +1 -0
  119. package/dist/src/hooks/useWalletAccount.d.ts +2 -1
  120. package/dist/src/hooks/useWalletAccount.d.ts.map +1 -1
  121. package/dist/src/hooks/useWalletAccount.js +19 -15
  122. package/dist/src/hooks/useWalletAccount.js.map +1 -1
  123. package/dist/src/hooks/useWatchTransferEvents.d.ts +5 -0
  124. package/dist/src/hooks/useWatchTransferEvents.d.ts.map +1 -0
  125. package/dist/src/hooks/useWatchTransferEvents.js +63 -0
  126. package/dist/src/hooks/useWatchTransferEvents.js.map +1 -0
  127. package/dist/src/index.d.ts +1 -1
  128. package/dist/src/index.d.ts.map +1 -1
  129. package/dist/src/index.js +1 -1
  130. package/dist/src/index.js.map +1 -1
  131. package/dist/src/lib/contracts/index.d.ts +13 -0
  132. package/dist/src/lib/contracts/index.d.ts.map +1 -0
  133. package/dist/src/lib/contracts/index.js +62 -0
  134. package/dist/src/lib/contracts/index.js.map +1 -0
  135. package/dist/src/lib/contracts/priceOracle.d.ts +43 -0
  136. package/dist/src/lib/contracts/priceOracle.d.ts.map +1 -0
  137. package/dist/src/lib/contracts/priceOracle.js +52 -0
  138. package/dist/src/lib/contracts/priceOracle.js.map +1 -0
  139. package/dist/src/provider.js +1 -1
  140. package/dist/src/provider.js.map +1 -1
  141. package/dist/src/stores/connectorStore.d.ts +12 -0
  142. package/dist/src/stores/connectorStore.d.ts.map +1 -0
  143. package/dist/src/stores/connectorStore.js +13 -0
  144. package/dist/src/stores/connectorStore.js.map +1 -0
  145. package/dist/src/stores/dropdownStore copy.d.ts +12 -0
  146. package/dist/src/stores/dropdownStore copy.d.ts.map +1 -0
  147. package/dist/src/stores/dropdownStore copy.js +13 -0
  148. package/dist/src/stores/dropdownStore copy.js.map +1 -0
  149. package/dist/src/stores/dropdownStore.d.ts +12 -0
  150. package/dist/src/stores/dropdownStore.d.ts.map +1 -0
  151. package/dist/src/stores/dropdownStore.js +13 -0
  152. package/dist/src/stores/dropdownStore.js.map +1 -0
  153. package/dist/src/utils/address.d.ts +1 -1
  154. package/dist/src/utils/address.d.ts.map +1 -1
  155. package/dist/src/utils/address.js +2 -0
  156. package/dist/src/utils/address.js.map +1 -1
  157. package/dist/src/utils/address.test.js +8 -5
  158. package/dist/src/utils/address.test.js.map +1 -1
  159. package/dist/src/utils/assets.d.ts +145 -0
  160. package/dist/src/utils/assets.d.ts.map +1 -0
  161. package/dist/src/utils/assets.js +100 -0
  162. package/dist/src/utils/assets.js.map +1 -0
  163. package/dist/src/utils/assets.test.d.ts +2 -0
  164. package/dist/src/utils/assets.test.d.ts.map +1 -0
  165. package/dist/src/utils/assets.test.js +46 -0
  166. package/dist/src/utils/assets.test.js.map +1 -0
  167. package/dist/src/utils/cryptoAssets.d.ts +17 -1
  168. package/dist/src/utils/cryptoAssets.d.ts.map +1 -1
  169. package/dist/src/utils/cryptoAssets.js +87 -31
  170. package/dist/src/utils/cryptoAssets.js.map +1 -1
  171. package/dist/src/utils/cryptoAssets.test.js +51 -33
  172. package/dist/src/utils/cryptoAssets.test.js.map +1 -1
  173. package/dist/src/utils/currency.d.ts +8 -0
  174. package/dist/src/utils/currency.d.ts.map +1 -1
  175. package/dist/src/utils/currency.js +11 -0
  176. package/dist/src/utils/currency.js.map +1 -1
  177. package/dist/src/utils/currency.test.js +1 -0
  178. package/dist/src/utils/currency.test.js.map +1 -1
  179. package/dist/src/utils/numbers.d.ts +32 -17
  180. package/dist/src/utils/numbers.d.ts.map +1 -1
  181. package/dist/src/utils/numbers.js +84 -33
  182. package/dist/src/utils/numbers.js.map +1 -1
  183. package/dist/src/utils/numbers.test.js +124 -22
  184. package/dist/src/utils/numbers.test.js.map +1 -1
  185. package/package.json +11 -9
  186. package/src/api/auth.ts +3 -1
  187. package/src/api/client.ts +11 -2
  188. package/src/api/portal.ts +11 -14
  189. package/src/components/Dropdown/ConnectedTrigger.tsx +52 -32
  190. package/src/components/Dropdown/Content.tsx +69 -113
  191. package/src/components/Dropdown/DisconnectedTrigger.tsx +2 -1
  192. package/src/components/Dropdown/Dropdown.tsx +86 -19
  193. package/src/components/Dropdown/ListingItem.tsx +80 -0
  194. package/src/components/Dropdown/NestedViewLayout.tsx +75 -0
  195. package/src/components/Dropdown/README.md +13 -18
  196. package/src/components/Dropdown/Receive/Receive.tsx +119 -0
  197. package/src/components/Dropdown/Root/AccountAddressActions.tsx +101 -0
  198. package/src/components/Dropdown/Root/AccountAssetItem.tsx +26 -0
  199. package/src/components/Dropdown/Root/AccountBalance.tsx +30 -0
  200. package/src/components/Dropdown/Root/AccountOtherAssets.tsx +68 -0
  201. package/src/components/Dropdown/Root/Root.tsx +147 -0
  202. package/src/components/Dropdown/Root/WalletAddress.tsx +128 -0
  203. package/src/components/Dropdown/{WelcomeBlock.tsx → Root/WelcomeBlock.tsx} +5 -6
  204. package/src/components/Dropdown/TestnetTopBanner.tsx +32 -0
  205. package/src/config.ts +77 -20
  206. package/src/constants.ts +12 -4
  207. package/src/hooks/index.ts +6 -0
  208. package/src/hooks/useAssetsConversionRates.ts +97 -0
  209. package/src/hooks/useAuthenticateWithWallet.ts +8 -11
  210. package/src/hooks/useBorrowData.ts +181 -0
  211. package/src/hooks/useDropdownData.ts +119 -97
  212. package/src/hooks/useRefreshPassport.ts +56 -0
  213. package/src/hooks/useTokensBalances.ts +187 -0
  214. package/src/hooks/useWalletAccount.ts +33 -19
  215. package/src/hooks/useWatchTransferEvents.ts +74 -0
  216. package/src/index.ts +11 -1
  217. package/src/lib/contracts/index.ts +92 -0
  218. package/src/lib/contracts/priceOracle.ts +53 -0
  219. package/src/provider.ts +1 -1
  220. package/src/stores/dropdownStore.ts +20 -0
  221. package/src/utils/address.test.ts +10 -6
  222. package/src/utils/address.ts +5 -3
  223. package/src/utils/cryptoAssets.test.ts +57 -37
  224. package/src/utils/cryptoAssets.ts +113 -35
  225. package/src/utils/currency.test.ts +2 -0
  226. package/src/utils/currency.ts +21 -0
  227. package/src/utils/numbers.test.ts +154 -23
  228. package/src/utils/numbers.ts +112 -34
  229. package/dist/src/components/Dropdown/AccountAddress.d.ts +0 -8
  230. package/dist/src/components/Dropdown/AccountAddress.d.ts.map +0 -1
  231. package/dist/src/components/Dropdown/AccountAddress.js.map +0 -1
  232. package/dist/src/components/Dropdown/AccountAssets.d.ts +0 -14
  233. package/dist/src/components/Dropdown/AccountAssets.d.ts.map +0 -1
  234. package/dist/src/components/Dropdown/AccountAssets.js +0 -44
  235. package/dist/src/components/Dropdown/AccountAssets.js.map +0 -1
  236. package/dist/src/components/Dropdown/AccountBalance.d.ts.map +0 -1
  237. package/dist/src/components/Dropdown/AccountBalance.js +0 -18
  238. package/dist/src/components/Dropdown/AccountBalance.js.map +0 -1
  239. package/dist/src/components/Dropdown/WelcomeBlock.d.ts.map +0 -1
  240. package/dist/src/components/Dropdown/WelcomeBlock.js.map +0 -1
  241. package/dist/src/hooks/useAssetsUSDConversion.d.ts +0 -8
  242. package/dist/src/hooks/useAssetsUSDConversion.d.ts.map +0 -1
  243. package/dist/src/hooks/useAssetsUSDConversion.js +0 -21
  244. package/dist/src/hooks/useAssetsUSDConversion.js.map +0 -1
  245. package/src/components/Dropdown/AccountAddress.tsx +0 -111
  246. package/src/components/Dropdown/AccountAssets.tsx +0 -110
  247. package/src/components/Dropdown/AccountBalance.tsx +0 -38
  248. package/src/hooks/useAssetsUSDConversion.ts +0 -31
@@ -1,130 +1,152 @@
1
- import { useBitcoinAccount } from "@mezo-org/orangekit"
1
+ import { useBalance } from "wagmi"
2
2
  import { useGetCurrentAccount } from "."
3
3
  import {
4
4
  CryptoAssetKey,
5
5
  getCryptoAsset,
6
6
  isBitcoinLikeCryptoAsset,
7
- isUsdLikeCryptoAsset,
7
+ mapCryptoAssetToDetails,
8
8
  } from "../utils/cryptoAssets"
9
9
  import { fromFixedPoint } from "../utils/numbers"
10
- import { useAssetsUsdConversion } from "./useAssetsUSDConversion"
10
+ import { useAssetsConversionRates } from "./useAssetsConversionRates"
11
11
  import useWalletAccount from "./useWalletAccount"
12
-
13
- /**
14
- * Formats crypto asset to balance details (balance in USD and decimals)
15
- * @param type The type of crypto asset
16
- * @param balance The balance of crypto asset
17
- * @param btcUsdConversionRate The USD conversion rate
18
- * @returns The balance details
19
- */
20
- export function formatCryptoAsset(
21
- type: CryptoAssetKey,
22
- balance: bigint,
23
- btcUsdConversionRate: number,
24
- ) {
25
- const { decimals } = getCryptoAsset(type)
26
-
27
- const nativeBalance = fromFixedPoint(balance, decimals, 4)
28
- let balanceInUsd = 0
29
- if (isBitcoinLikeCryptoAsset(type)) {
30
- balanceInUsd = nativeBalance * btcUsdConversionRate
31
- }
32
- if (isUsdLikeCryptoAsset(type)) {
33
- balanceInUsd = nativeBalance
34
- }
35
-
36
- return {
37
- type,
38
- balance: nativeBalance,
39
- balanceInUsd,
40
- decimals,
41
- }
42
- }
12
+ import { useTokensBalances } from "./useTokensBalances"
13
+ import { useBorrowData } from "./useBorrowData"
14
+ import { CHAIN_ID } from "../constants"
15
+ import { usePassportContext } from "./usePassportContext"
16
+ import { useWatchTransferEventsForAllTokens } from "./useWatchTransferEvents"
17
+ import { convertToUsd } from "../utils/currency"
43
18
 
44
19
  export type DropdownCryptoAsset<T = CryptoAssetKey> = {
45
20
  type: T
46
21
  balance: bigint
47
22
  }
48
23
 
49
- type DropdownDetailedCryptoAsset = ReturnType<typeof formatCryptoAsset>
50
-
51
- export type DropdownData = {
52
- mezoId: string
53
- address: string
54
- walletType: "bitcoin" | "evm"
55
- totalBalanceInUsd: number
56
- formattedNativeAssets: DropdownDetailedCryptoAsset[]
57
- matsnet: {
58
- mats: number
59
- formattedAssets: DropdownDetailedCryptoAsset[]
60
- }
61
- }
62
-
63
- type UseDropdownDataOptions = {
64
- // This is workaround. It should be read from contracts or fetched from API.
65
- evmNativeAssets?: DropdownCryptoAsset[]
66
- matsnetAssets?: DropdownCryptoAsset[]
24
+ const DEFAULT_ASSET_DATA = {
25
+ rawBalance: 0n,
26
+ formattedBalance: "0.0000",
27
+ usdBalance: 0,
28
+ formattedUsdBalance: "$0.00",
67
29
  }
68
30
 
69
31
  /**
70
32
  * Aggregates dropdown data for Dropdown component.
71
- * @param options - Options for the dropdown data.
72
- * @param options.evmNativeAssets - Native assets for EVM wallet.
73
- * @param options.matsnetAssets - Matsnet tokens. Rendered as separate section.
33
+ * @param {accountDataRefetchInterval: number, nativeBalanceRefetchInterval: number }
34
+ * Object containing refetch intervals time (in milliseconds) for account data
35
+ * (like mats or mezo id) and for native balance. After that time the specific
36
+ * value should be marked as stale and re-fetched. Default value for both is
37
+ * 90000 (90 secs).
74
38
  * @returns Dropdown data.
39
+ * @dev This hook is for internal use only.
75
40
  */
76
- export default function useDropdownData(
77
- options?: UseDropdownDataOptions,
78
- ): DropdownData | null {
79
- const { evmNativeAssets = [], matsnetAssets = [] } = options || {}
80
-
81
- const { btcBalance } = useBitcoinAccount()
82
- const { address, networkFamily, isConnected } = useWalletAccount()
83
- const { data: passportAccount } = useGetCurrentAccount()
84
- const { data: assetsUsdConversion } = useAssetsUsdConversion()
85
-
86
- if (!address || !isConnected || !passportAccount) {
87
- return null
88
- }
89
-
90
- const mezoId = passportAccount.mezoId!
91
-
92
- const nativeAssets: DropdownCryptoAsset[] =
93
- networkFamily === "bitcoin"
94
- ? [
95
- {
96
- type: "btc",
97
- balance: BigInt(btcBalance?.total ?? 0),
98
- },
99
- ]
100
- : evmNativeAssets
41
+ export default function useDropdownData({
42
+ accountDataRefetchInterval = 90000,
43
+ nativeBalanceRefetchInterval = 90000,
44
+ }) {
45
+ const {
46
+ walletAddress,
47
+ accountAddress,
48
+ networkFamily: walletType,
49
+ } = useWalletAccount()
50
+ const { environment = "mainnet" } = usePassportContext()
51
+ const { data: btcBalance } = useBalance({
52
+ address: accountAddress,
53
+ chainId: CHAIN_ID[environment],
54
+ query: {
55
+ staleTime: nativeBalanceRefetchInterval,
56
+ refetchInterval: nativeBalanceRefetchInterval,
57
+ },
58
+ })
59
+ const { data: passportAccount } = useGetCurrentAccount({
60
+ staleTime: accountDataRefetchInterval,
61
+ refetchInterval: accountDataRefetchInterval,
62
+ enabled: !!accountAddress,
63
+ })
64
+ const { data: assetsConversionRates } = useAssetsConversionRates()
65
+ const { data: tokensBalances } = useTokensBalances()
66
+ const { data: debt } = useBorrowData()
67
+
68
+ useWatchTransferEventsForAllTokens()
69
+
70
+ const mezoId = passportAccount?.mezoId
71
+
72
+ const detailedAssets = [
73
+ ["BTC", btcBalance?.value ?? 0n],
74
+ ...Object.entries(tokensBalances ?? {}),
75
+ ].map((asset) => {
76
+ const [type, balance] = asset as [CryptoAssetKey, bigint]
77
+
78
+ if (isBitcoinLikeCryptoAsset(type)) {
79
+ return mapCryptoAssetToDetails(
80
+ type,
81
+ balance,
82
+ assetsConversionRates.btc.price,
83
+ assetsConversionRates.btc.decimals,
84
+ )
85
+ }
86
+ if (type === "mT") {
87
+ return mapCryptoAssetToDetails(
88
+ type,
89
+ balance,
90
+ assetsConversionRates.t.price,
91
+ assetsConversionRates.t.decimals,
92
+ )
93
+ }
94
+
95
+ return mapCryptoAssetToDetails(type, balance, 1n, 0)
96
+ })
97
+
98
+ const btcData = detailedAssets.find(({ type }) => type === "BTC")!
99
+ const musdData = detailedAssets.find(({ type }) => type === "MUSD")!
100
+ const otherAssetsData = detailedAssets.filter(
101
+ ({ type }) => !["BTC", "MUSD"].includes(type),
102
+ )
101
103
 
102
- const btcUsdConversionRate = Number(assetsUsdConversion?.btcUsd ?? 0)
104
+ const otherAssetsCount = otherAssetsData.filter(
105
+ (asset) => asset.rawBalance !== 0n,
106
+ ).length
103
107
 
104
- const formattedNativeAssets = nativeAssets.map((asset) =>
105
- formatCryptoAsset(asset.type, asset.balance, btcUsdConversionRate),
106
- )
108
+ const assets = {
109
+ btc: btcData || {
110
+ type: "BTC",
111
+ ...DEFAULT_ASSET_DATA,
112
+ },
113
+ musd: musdData || {
114
+ type: "mUSD",
115
+ ...DEFAULT_ASSET_DATA,
116
+ },
117
+ }
107
118
 
108
- const totalBalanceInUsd = formattedNativeAssets.reduce(
109
- (sum, value) => sum + value.balanceInUsd,
119
+ const otherAssetsUsdTotal = otherAssetsData.reduce(
120
+ (sum, { usdBalance }) => sum + usdBalance,
110
121
  0,
111
122
  )
112
123
 
113
- const matsBalance = passportAccount.mats.totalMats
124
+ const matsBalance = passportAccount?.mats.totalMats || 0
114
125
 
115
- const matsnetFormattedAssets = matsnetAssets.map((asset) =>
116
- formatCryptoAsset(asset.type, asset.balance, btcUsdConversionRate),
126
+ const usdCollateral = convertToUsd(
127
+ debt?.collateral ?? 0n,
128
+ getCryptoAsset("MUSD").decimals,
129
+ assetsConversionRates.btc.price,
130
+ assetsConversionRates.btc.decimals,
117
131
  )
118
132
 
133
+ const usdTroveDebt = fromFixedPoint(debt?.troveDebt ?? 0n, 18)
134
+
135
+ const usdTotalBalance =
136
+ detailedAssets.reduce((sum, { usdBalance }) => sum + usdBalance, 0) +
137
+ usdCollateral
138
+
119
139
  return {
120
140
  mezoId,
121
- address,
122
- walletType: networkFamily,
123
- totalBalanceInUsd,
124
- formattedNativeAssets,
125
- matsnet: {
126
- mats: matsBalance,
127
- formattedAssets: matsnetFormattedAssets,
128
- },
141
+ matsBalance,
142
+ accountAddress,
143
+ walletAddress,
144
+ walletType,
145
+ usdTotalBalance,
146
+ usdTroveDebt,
147
+ usdCollateral,
148
+ assets,
149
+ otherAssetsCount,
150
+ otherAssetsUsdTotal,
129
151
  }
130
152
  }
@@ -0,0 +1,56 @@
1
+ import { useQueryClient } from "@tanstack/react-query"
2
+ import { useCallback } from "react"
3
+ import { useAccount, useBalance } from "wagmi"
4
+ import { QUERY_KEYS } from "./constants"
5
+ import { useInvalidateBorrowData } from "./useBorrowData"
6
+ import { useInvalidateTokensBalances } from "./useTokensBalances"
7
+
8
+ /**
9
+ * Hook to refresh the passport using query invalidation mechanism.
10
+ * By calling the refresh function, the latest data will be refetched as soon as possible.
11
+ *
12
+ * @example
13
+ * const { refreshCurrentAccount, refreshUsdConversion } = useRefreshPassport()
14
+ *
15
+ * // Call this function to refresh the current account
16
+ * const handlerefreshCurrentAccount = async () => {
17
+ * await refreshCurrentAccount()
18
+ * }
19
+ */
20
+ export function useRefreshPassport() {
21
+ const { address } = useAccount()
22
+ const queryClient = useQueryClient()
23
+ const { invalidateBorrowData } = useInvalidateBorrowData()
24
+ const { invalidateTokensBalances } = useInvalidateTokensBalances()
25
+ const { queryKey: nativeTokenQueryKey } = useBalance({ address })
26
+
27
+ const refreshCurrentAccount = useCallback(
28
+ () =>
29
+ queryClient.invalidateQueries({
30
+ queryKey: [QUERY_KEYS.ACCOUNT, QUERY_KEYS.CURRENT],
31
+ }),
32
+ [queryClient],
33
+ )
34
+
35
+ const refreshUsdConversion = useCallback(
36
+ () =>
37
+ queryClient.invalidateQueries({
38
+ queryKey: [QUERY_KEYS.ASSETS_USD_CONVERSION],
39
+ }),
40
+ [queryClient],
41
+ )
42
+
43
+ const refreshTokensBalances = useCallback(async () => {
44
+ await queryClient.invalidateQueries({
45
+ queryKey: nativeTokenQueryKey,
46
+ })
47
+ await invalidateTokensBalances()
48
+ }, [queryClient, nativeTokenQueryKey, invalidateTokensBalances])
49
+
50
+ return {
51
+ refreshCurrentAccount,
52
+ refreshUsdConversion,
53
+ refreshBorrowData: invalidateBorrowData,
54
+ refreshTokensBalances,
55
+ }
56
+ }
@@ -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,39 +1,53 @@
1
- import { useBitcoinAccount } from "@mezo-org/orangekit"
2
- import { useEffect, useMemo, useState } from "react"
1
+ import { OrangeKitBitcoinProvider } from "@mezo-org/orangekit"
2
+ import { useQuery } from "@tanstack/react-query"
3
+ import { useMemo } from "react"
3
4
  import { Address } from "viem"
4
5
  import { Connector, useAccount } from "wagmi"
5
6
 
6
7
  type UseWalletAccountReturn = {
7
- address?: string | Address
8
+ accountAddress?: Address
9
+ walletAddress?: string
8
10
  isConnected: boolean
9
11
  networkFamily: "bitcoin" | "evm"
10
12
  connector?: Connector
11
13
  chainId?: number
12
14
  }
13
15
 
16
+ type OrangeKitConnector = {
17
+ getBitcoinProvider: () => OrangeKitBitcoinProvider
18
+ }
19
+
14
20
  export default function useWalletAccount(): UseWalletAccountReturn {
15
21
  const { address: evmAddress, connector, chainId } = useAccount()
16
- const { btcAddress } = useBitcoinAccount()
17
- const [isConnected, setIsConnected] = useState(false)
18
-
19
- useEffect(() => {
20
- if (!connector) {
21
- setIsConnected(false)
22
- return
23
- }
24
-
25
- const isBitcoinFlow = connector.type === "orangekit"
26
- setIsConnected(isBitcoinFlow ? !!btcAddress : !!evmAddress)
27
- }, [btcAddress, connector, evmAddress])
28
22
 
29
23
  const networkFamily = useMemo(
30
- () => (btcAddress ? "bitcoin" : "evm"),
31
- [btcAddress],
24
+ () => (connector?.type !== "orangekit" ? "evm" : "bitcoin"),
25
+ [connector],
32
26
  )
33
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
+
34
47
  return {
35
- address: btcAddress || evmAddress,
36
- isConnected,
48
+ accountAddress: evmAddress,
49
+ walletAddress: btcAddress ?? evmAddress,
50
+ isConnected: networkFamily === "bitcoin" ? !!btcAddress : !!evmAddress,
37
51
  networkFamily,
38
52
  connector,
39
53
  chainId,
@@ -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,5 +1,15 @@
1
1
  export * from "./components"
2
- export * from "./config"
2
+ export {
3
+ defaultConfig,
4
+ unisatWalletMezoMainnet,
5
+ unisatWalletMezoTestnet,
6
+ okxWalletMezoMainnet,
7
+ okxWalletMezoTestnet,
8
+ xverseWalletMezoMainnet,
9
+ xverseWalletMezoTestnet,
10
+ getDefaultWallets,
11
+ getConfig,
12
+ } from "./config"
3
13
  export * from "./constants"
4
14
  export * from "./hooks"
5
15
  export * from "./provider"