@mezo-org/passport 0.4.0-dev.14 → 0.4.0-dev.16

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.
@@ -9,5 +9,5 @@ export * from "./useSignInWithWallet";
9
9
  export * from "./useSignOut";
10
10
  export * from "./useSignUpWithWallet";
11
11
  export * from "./useUpdateMezoId";
12
- export * from "./useUpdatePassport";
12
+ export * from "./useRefreshPassport";
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,kDAAkD,EAClD,4BAA4B,EAC5B,oDAAoD,GACrD,MAAM,qBAAqB,CAAA;AAC5B,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,cAAc,CAAA;AAC5B,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,kDAAkD,EAClD,4BAA4B,EAC5B,oDAAoD,GACrD,MAAM,qBAAqB,CAAA;AAC5B,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,cAAc,CAAA;AAC5B,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA"}
@@ -9,5 +9,5 @@ export * from "./useSignInWithWallet";
9
9
  export * from "./useSignOut";
10
10
  export * from "./useSignUpWithWallet";
11
11
  export * from "./useUpdateMezoId";
12
- export * from "./useUpdatePassport";
12
+ export * from "./useRefreshPassport";
13
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,kDAAkD,EAClD,4BAA4B,EAC5B,oDAAoD,GACrD,MAAM,qBAAqB,CAAA;AAC5B,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,cAAc,CAAA;AAC5B,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,kDAAkD,EAClD,4BAA4B,EAC5B,oDAAoD,GACrD,MAAM,qBAAqB,CAAA;AAC5B,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,cAAc,CAAA;AAC5B,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Hook to refresh the passport using query invalidation mechanism.
3
+ * By calling the refresh function, the latest data will be refetched as soon as possible.
4
+ *
5
+ * @example
6
+ * const { refreshCurrentAccount, refreshUsdConversion } = useRefreshPassport()
7
+ *
8
+ * // Call this function to refresh the current account
9
+ * const handlerefreshCurrentAccount = async () => {
10
+ * await refreshCurrentAccount()
11
+ * }
12
+ */
13
+ export declare function useRefreshPassport(): {
14
+ refreshCurrentAccount: () => Promise<void>;
15
+ refreshUsdConversion: () => Promise<void>;
16
+ };
17
+ //# sourceMappingURL=useRefreshPassport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRefreshPassport.d.ts","sourceRoot":"","sources":["../../../src/hooks/useRefreshPassport.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB;;;EAuBjC"}
@@ -0,0 +1,29 @@
1
+ import { useQueryClient } from "@tanstack/react-query";
2
+ import { useCallback } from "react";
3
+ import { QUERY_KEYS } from "./constants";
4
+ /**
5
+ * Hook to refresh the passport using query invalidation mechanism.
6
+ * By calling the refresh function, the latest data will be refetched as soon as possible.
7
+ *
8
+ * @example
9
+ * const { refreshCurrentAccount, refreshUsdConversion } = useRefreshPassport()
10
+ *
11
+ * // Call this function to refresh the current account
12
+ * const handlerefreshCurrentAccount = async () => {
13
+ * await refreshCurrentAccount()
14
+ * }
15
+ */
16
+ export function useRefreshPassport() {
17
+ const queryClient = useQueryClient();
18
+ const refreshCurrentAccount = useCallback(() => queryClient.invalidateQueries({
19
+ queryKey: [QUERY_KEYS.ACCOUNT, QUERY_KEYS.CURRENT],
20
+ }), [queryClient]);
21
+ const refreshUsdConversion = useCallback(() => queryClient.invalidateQueries({
22
+ queryKey: [QUERY_KEYS.ASSETS_USD_CONVERSION],
23
+ }), [queryClient]);
24
+ return {
25
+ refreshCurrentAccount,
26
+ refreshUsdConversion,
27
+ };
28
+ }
29
+ //# sourceMappingURL=useRefreshPassport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRefreshPassport.js","sourceRoot":"","sources":["../../../src/hooks/useRefreshPassport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IAEpC,MAAM,qBAAqB,GAAG,WAAW,CACvC,GAAG,EAAE,CACH,WAAW,CAAC,iBAAiB,CAAC;QAC5B,QAAQ,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;KACnD,CAAC,EACJ,CAAC,WAAW,CAAC,CACd,CAAA;IAED,MAAM,oBAAoB,GAAG,WAAW,CACtC,GAAG,EAAE,CACH,WAAW,CAAC,iBAAiB,CAAC;QAC5B,QAAQ,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC;KAC7C,CAAC,EACJ,CAAC,WAAW,CAAC,CACd,CAAA;IAED,OAAO;QACL,qBAAqB;QACrB,oBAAoB;KACrB,CAAA;AACH,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import { formatNumberToCompactString, fromFixedPoint, roundUpNumber, } from "./numbers";
2
+ import { formatNumberToLocaleString } from "./numbers";
3
+ import { fromFixedPointToString } from "./numbers";
2
4
  describe("formatNumberToCompactString", () => {
3
5
  it("formats number less than 1000 with decimals", () => {
4
6
  expect(formatNumberToCompactString(123.456789, 2)).toBe("123.46");
@@ -51,4 +53,128 @@ describe("fromFixedPoint", () => {
51
53
  expect(fromFixedPoint(raw, 6, 2)).toBe(1000000000000000000);
52
54
  });
53
55
  });
56
+ describe("formatNumberToLocaleString", () => {
57
+ it("formats zero with 0 decimals", () => {
58
+ expect(formatNumberToLocaleString(0, 0)).toBe("0");
59
+ });
60
+ it("formats zero with >0 decimals", () => {
61
+ expect(formatNumberToLocaleString(0, 2)).toBe("0.00");
62
+ expect(formatNumberToLocaleString(0, 4)).toBe("0.0000");
63
+ });
64
+ it("formats small decimal number", () => {
65
+ expect(formatNumberToLocaleString(0.123456, 2)).toBe("0.12");
66
+ expect(formatNumberToLocaleString(0.123456, 4)).toBe("0.1235");
67
+ });
68
+ it("formats number just above 1", () => {
69
+ expect(formatNumberToLocaleString(1.000001, 3)).toBe("1.000");
70
+ expect(formatNumberToLocaleString(1.234567, 2)).toBe("1.23");
71
+ });
72
+ it("formats whole number", () => {
73
+ expect(formatNumberToLocaleString(1234, 0)).toBe("1,234");
74
+ expect(formatNumberToLocaleString(1000, 2)).toBe("1,000.00");
75
+ });
76
+ it("formats number with trailing decimal zeroes", () => {
77
+ expect(formatNumberToLocaleString(10.1, 3)).toBe("10.100");
78
+ expect(formatNumberToLocaleString(5.0, 2)).toBe("5.00");
79
+ });
80
+ it("formats string input", () => {
81
+ expect(formatNumberToLocaleString("123.456", 2)).toBe("123.46");
82
+ expect(formatNumberToLocaleString("0.00123", 4)).toBe("0.0012");
83
+ });
84
+ it("formats negative number", () => {
85
+ expect(formatNumberToLocaleString(-123.456, 2)).toBe("-123.46");
86
+ expect(formatNumberToLocaleString("-0.00999", 3)).toBe("-0.010");
87
+ });
88
+ it("formats large number with commas", () => {
89
+ expect(formatNumberToLocaleString(12345678.9, 2)).toBe("12,345,678.90");
90
+ });
91
+ it("handles max decimals safely", () => {
92
+ expect(formatNumberToLocaleString(1.123456789, 8)).toBe("1.12345679");
93
+ expect(formatNumberToLocaleString("0.000000000000000001", 18)).toBe("0.000000000000000001");
94
+ });
95
+ it("defaults to 0 decimals if not passed", () => {
96
+ expect(formatNumberToLocaleString(1234.567)).toBe("1,235"); // rounds up by default
97
+ });
98
+ it("respects locale formatting", () => {
99
+ const val = 1234567.89;
100
+ const formatted = val.toLocaleString("default", {
101
+ minimumFractionDigits: 2,
102
+ maximumFractionDigits: 2,
103
+ });
104
+ expect(formatNumberToLocaleString(val, 2)).toBe(formatted);
105
+ });
106
+ });
107
+ describe("fromFixedPointToString", () => {
108
+ const toFixedPoint = (num) => BigInt(Math.round(num * 1e18));
109
+ const cases = [
110
+ { input: 2.0, expected: "2.000" },
111
+ { input: 2.009, expected: "2.009" },
112
+ { input: 2.01, expected: "2.010" },
113
+ { input: 2.015, expected: "2.016" },
114
+ { input: 2.05, expected: "2.050" },
115
+ { input: 2.09, expected: "2.090" },
116
+ ];
117
+ describe("withRoundUp: true", () => {
118
+ cases.forEach(({ input, expected }) => {
119
+ it(`formats ${input} → ${expected}`, () => {
120
+ const fixed = toFixedPoint(input);
121
+ expect(fromFixedPointToString(fixed, 18, 3, true)).toBe(expected);
122
+ });
123
+ });
124
+ });
125
+ describe("withRoundUp: false", () => {
126
+ const noRoundCases = [
127
+ { input: 2.0099, expected: "2.009" },
128
+ { input: 2.0159, expected: "2.015" },
129
+ { input: 2.0101, expected: "2.010" },
130
+ { input: 2.0199, expected: "2.019" },
131
+ ];
132
+ noRoundCases.forEach(({ input, expected }) => {
133
+ it(`formats ${input} → ${expected} (no rounding)`, () => {
134
+ const fixed = toFixedPoint(input);
135
+ expect(fromFixedPointToString(fixed, 18, 3, false)).toBe(expected);
136
+ });
137
+ });
138
+ });
139
+ describe("zero handling", () => {
140
+ it("formats 0 → 0.000 (3 decimals)", () => {
141
+ expect(fromFixedPointToString(0n, 18, 3)).toBe("0.000");
142
+ });
143
+ it("formats 0 → 0.0000 (4 decimals)", () => {
144
+ expect(fromFixedPointToString(0n, 18, 4)).toBe("0.0000");
145
+ });
146
+ });
147
+ describe("very small numbers below display threshold", () => {
148
+ it("returns <0.0001 for small number (3 decimals)", () => {
149
+ const small = BigInt(123); // ~1.23e-16
150
+ expect(fromFixedPointToString(small, 18, 4)).toBe("<0.0001");
151
+ });
152
+ it("returns <0.01 for small number with only 2 decimals", () => {
153
+ const tiny = BigInt(9999999999999); // <0.01
154
+ expect(fromFixedPointToString(tiny, 18, 2)).toBe("<0.01");
155
+ });
156
+ });
157
+ describe("input types", () => {
158
+ it("accepts bigint", () => {
159
+ const amount = 2100000000000000000n;
160
+ expect(fromFixedPointToString(amount, 18, 3)).toBe("2.100");
161
+ });
162
+ it("accepts string", () => {
163
+ expect(fromFixedPointToString("2000000000000000000", 18, 3)).toBe("2.000");
164
+ });
165
+ it("accepts number", () => {
166
+ expect(fromFixedPointToString(Number("1000000000000000000"), 18, 3)).toBe("1.000");
167
+ });
168
+ });
169
+ describe("high values", () => {
170
+ it("formats 1_000_000.123456789 correctly", () => {
171
+ const big = toFixedPoint(1_000_000.123456789);
172
+ expect(fromFixedPointToString(big, 18, 6)).toBe("1,000,000.123457");
173
+ });
174
+ it("formats 1e12 ETH", () => {
175
+ const big = BigInt("1000000000000000000000000000000");
176
+ expect(fromFixedPointToString(big, 18, 2)).toBe("1,000,000,000,000.00");
177
+ });
178
+ });
179
+ });
54
180
  //# sourceMappingURL=numbers.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"numbers.test.js","sourceRoot":"","sources":["../../../src/utils/numbers.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"numbers.test.js","sourceRoot":"","sources":["../../../src/utils/numbers.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mezo-org/passport",
3
- "version": "0.4.0-dev.14",
3
+ "version": "0.4.0-dev.16",
4
4
  "main": "dist/src/index.js",
5
5
  "license": "GPL-3.0-only",
6
6
  "scripts": {
@@ -16,4 +16,4 @@ export * from "./useSignInWithWallet"
16
16
  export * from "./useSignOut"
17
17
  export * from "./useSignUpWithWallet"
18
18
  export * from "./useUpdateMezoId"
19
- export * from "./useUpdatePassport"
19
+ export * from "./useRefreshPassport"
@@ -0,0 +1,40 @@
1
+ import { useQueryClient } from "@tanstack/react-query"
2
+ import { useCallback } from "react"
3
+ import { QUERY_KEYS } from "./constants"
4
+
5
+ /**
6
+ * Hook to refresh the passport using query invalidation mechanism.
7
+ * By calling the refresh function, the latest data will be refetched as soon as possible.
8
+ *
9
+ * @example
10
+ * const { refreshCurrentAccount, refreshUsdConversion } = useRefreshPassport()
11
+ *
12
+ * // Call this function to refresh the current account
13
+ * const handlerefreshCurrentAccount = async () => {
14
+ * await refreshCurrentAccount()
15
+ * }
16
+ */
17
+ export function useRefreshPassport() {
18
+ const queryClient = useQueryClient()
19
+
20
+ const refreshCurrentAccount = useCallback(
21
+ () =>
22
+ queryClient.invalidateQueries({
23
+ queryKey: [QUERY_KEYS.ACCOUNT, QUERY_KEYS.CURRENT],
24
+ }),
25
+ [queryClient],
26
+ )
27
+
28
+ const refreshUsdConversion = useCallback(
29
+ () =>
30
+ queryClient.invalidateQueries({
31
+ queryKey: [QUERY_KEYS.ASSETS_USD_CONVERSION],
32
+ }),
33
+ [queryClient],
34
+ )
35
+
36
+ return {
37
+ refreshCurrentAccount,
38
+ refreshUsdConversion,
39
+ }
40
+ }
@@ -4,6 +4,10 @@ import {
4
4
  roundUpNumber,
5
5
  } from "./numbers"
6
6
 
7
+ import { formatNumberToLocaleString } from "./numbers"
8
+
9
+ import { fromFixedPointToString } from "./numbers"
10
+
7
11
  describe("formatNumberToCompactString", () => {
8
12
  it("formats number less than 1000 with decimals", () => {
9
13
  expect(formatNumberToCompactString(123.456789, 2)).toBe("123.46")
@@ -71,3 +75,158 @@ describe("fromFixedPoint", () => {
71
75
  expect(fromFixedPoint(raw, 6, 2)).toBe(1000000000000000000)
72
76
  })
73
77
  })
78
+
79
+ describe("formatNumberToLocaleString", () => {
80
+ it("formats zero with 0 decimals", () => {
81
+ expect(formatNumberToLocaleString(0, 0)).toBe("0")
82
+ })
83
+
84
+ it("formats zero with >0 decimals", () => {
85
+ expect(formatNumberToLocaleString(0, 2)).toBe("0.00")
86
+ expect(formatNumberToLocaleString(0, 4)).toBe("0.0000")
87
+ })
88
+
89
+ it("formats small decimal number", () => {
90
+ expect(formatNumberToLocaleString(0.123456, 2)).toBe("0.12")
91
+ expect(formatNumberToLocaleString(0.123456, 4)).toBe("0.1235")
92
+ })
93
+
94
+ it("formats number just above 1", () => {
95
+ expect(formatNumberToLocaleString(1.000001, 3)).toBe("1.000")
96
+ expect(formatNumberToLocaleString(1.234567, 2)).toBe("1.23")
97
+ })
98
+
99
+ it("formats whole number", () => {
100
+ expect(formatNumberToLocaleString(1234, 0)).toBe("1,234")
101
+ expect(formatNumberToLocaleString(1000, 2)).toBe("1,000.00")
102
+ })
103
+
104
+ it("formats number with trailing decimal zeroes", () => {
105
+ expect(formatNumberToLocaleString(10.1, 3)).toBe("10.100")
106
+ expect(formatNumberToLocaleString(5.0, 2)).toBe("5.00")
107
+ })
108
+
109
+ it("formats string input", () => {
110
+ expect(formatNumberToLocaleString("123.456", 2)).toBe("123.46")
111
+ expect(formatNumberToLocaleString("0.00123", 4)).toBe("0.0012")
112
+ })
113
+
114
+ it("formats negative number", () => {
115
+ expect(formatNumberToLocaleString(-123.456, 2)).toBe("-123.46")
116
+ expect(formatNumberToLocaleString("-0.00999", 3)).toBe("-0.010")
117
+ })
118
+
119
+ it("formats large number with commas", () => {
120
+ expect(formatNumberToLocaleString(12345678.9, 2)).toBe("12,345,678.90")
121
+ })
122
+
123
+ it("handles max decimals safely", () => {
124
+ expect(formatNumberToLocaleString(1.123456789, 8)).toBe("1.12345679")
125
+ expect(formatNumberToLocaleString("0.000000000000000001", 18)).toBe(
126
+ "0.000000000000000001",
127
+ )
128
+ })
129
+
130
+ it("defaults to 0 decimals if not passed", () => {
131
+ expect(formatNumberToLocaleString(1234.567)).toBe("1,235") // rounds up by default
132
+ })
133
+
134
+ it("respects locale formatting", () => {
135
+ const val = 1234567.89
136
+ const formatted = val.toLocaleString("default", {
137
+ minimumFractionDigits: 2,
138
+ maximumFractionDigits: 2,
139
+ })
140
+
141
+ expect(formatNumberToLocaleString(val, 2)).toBe(formatted)
142
+ })
143
+ })
144
+
145
+ describe("fromFixedPointToString", () => {
146
+ const toFixedPoint = (num: number) => BigInt(Math.round(num * 1e18))
147
+
148
+ const cases = [
149
+ { input: 2.0, expected: "2.000" },
150
+ { input: 2.009, expected: "2.009" },
151
+ { input: 2.01, expected: "2.010" },
152
+ { input: 2.015, expected: "2.016" },
153
+ { input: 2.05, expected: "2.050" },
154
+ { input: 2.09, expected: "2.090" },
155
+ ]
156
+
157
+ describe("withRoundUp: true", () => {
158
+ cases.forEach(({ input, expected }) => {
159
+ it(`formats ${input} → ${expected}`, () => {
160
+ const fixed = toFixedPoint(input)
161
+ expect(fromFixedPointToString(fixed, 18, 3, true)).toBe(expected)
162
+ })
163
+ })
164
+ })
165
+
166
+ describe("withRoundUp: false", () => {
167
+ const noRoundCases = [
168
+ { input: 2.0099, expected: "2.009" },
169
+ { input: 2.0159, expected: "2.015" },
170
+ { input: 2.0101, expected: "2.010" },
171
+ { input: 2.0199, expected: "2.019" },
172
+ ]
173
+
174
+ noRoundCases.forEach(({ input, expected }) => {
175
+ it(`formats ${input} → ${expected} (no rounding)`, () => {
176
+ const fixed = toFixedPoint(input)
177
+ expect(fromFixedPointToString(fixed, 18, 3, false)).toBe(expected)
178
+ })
179
+ })
180
+ })
181
+
182
+ describe("zero handling", () => {
183
+ it("formats 0 → 0.000 (3 decimals)", () => {
184
+ expect(fromFixedPointToString(0n, 18, 3)).toBe("0.000")
185
+ })
186
+
187
+ it("formats 0 → 0.0000 (4 decimals)", () => {
188
+ expect(fromFixedPointToString(0n, 18, 4)).toBe("0.0000")
189
+ })
190
+ })
191
+
192
+ describe("very small numbers below display threshold", () => {
193
+ it("returns <0.0001 for small number (3 decimals)", () => {
194
+ const small = BigInt(123) // ~1.23e-16
195
+ expect(fromFixedPointToString(small, 18, 4)).toBe("<0.0001")
196
+ })
197
+
198
+ it("returns <0.01 for small number with only 2 decimals", () => {
199
+ const tiny = BigInt(9999999999999) // <0.01
200
+ expect(fromFixedPointToString(tiny, 18, 2)).toBe("<0.01")
201
+ })
202
+ })
203
+
204
+ describe("input types", () => {
205
+ it("accepts bigint", () => {
206
+ const amount = 2100000000000000000n
207
+ expect(fromFixedPointToString(amount, 18, 3)).toBe("2.100")
208
+ })
209
+
210
+ it("accepts string", () => {
211
+ expect(fromFixedPointToString("2000000000000000000", 18, 3)).toBe("2.000")
212
+ })
213
+
214
+ it("accepts number", () => {
215
+ expect(fromFixedPointToString(Number("1000000000000000000"), 18, 3)).toBe(
216
+ "1.000",
217
+ )
218
+ })
219
+ })
220
+
221
+ describe("high values", () => {
222
+ it("formats 1_000_000.123456789 correctly", () => {
223
+ const big = toFixedPoint(1_000_000.123456789)
224
+ expect(fromFixedPointToString(big, 18, 6)).toBe("1,000,000.123457")
225
+ })
226
+
227
+ it("formats 1e12 ETH", () => {
228
+ const big = BigInt("1000000000000000000000000000000")
229
+ expect(fromFixedPointToString(big, 18, 2)).toBe("1,000,000,000,000.00")
230
+ })
231
+ })
232
+ })
@@ -1,40 +0,0 @@
1
- import { useQueryClient } from "@tanstack/react-query"
2
- import { useCallback } from "react"
3
- import { QUERY_KEYS } from "./constants"
4
-
5
- /**
6
- * Hook to update the passport using query invalidation mechanism.
7
- * By calling the update function, the latest data will be refetched as soon as possible.
8
- *
9
- * @example
10
- * const { updateCurrentAccount, updateUsdConversion } = useUpdatePassport()
11
- *
12
- * // Call this function to update the current account
13
- * const handleUpdateCurrentAccount = async () => {
14
- * await updateCurrentAccount()
15
- * }
16
- */
17
- export function useUpdatePassport() {
18
- const queryClient = useQueryClient()
19
-
20
- const updateCurrentAccount = useCallback(
21
- () =>
22
- queryClient.invalidateQueries({
23
- queryKey: [QUERY_KEYS.ACCOUNT, QUERY_KEYS.CURRENT],
24
- }),
25
- [queryClient],
26
- )
27
-
28
- const updateUsdConversion = useCallback(
29
- () =>
30
- queryClient.invalidateQueries({
31
- queryKey: [QUERY_KEYS.ASSETS_USD_CONVERSION],
32
- }),
33
- [queryClient],
34
- )
35
-
36
- return {
37
- updateCurrentAccount,
38
- updateUsdConversion,
39
- }
40
- }