@helium/helium-react-hooks 0.0.8

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 (75) hide show
  1. package/LICENSE +203 -0
  2. package/lib/cjs/contexts/accountContext.js +47 -0
  3. package/lib/cjs/contexts/accountContext.js.map +1 -0
  4. package/lib/cjs/hooks/useAccount.js +151 -0
  5. package/lib/cjs/hooks/useAccount.js.map +1 -0
  6. package/lib/cjs/hooks/useAccountFetchCache.js +14 -0
  7. package/lib/cjs/hooks/useAccountFetchCache.js.map +1 -0
  8. package/lib/cjs/hooks/useAssociatedTokenAccount.js +34 -0
  9. package/lib/cjs/hooks/useAssociatedTokenAccount.js.map +1 -0
  10. package/lib/cjs/hooks/useAssociatedTokenAddress.js +26 -0
  11. package/lib/cjs/hooks/useAssociatedTokenAddress.js.map +1 -0
  12. package/lib/cjs/hooks/useIdlAccount.js +24 -0
  13. package/lib/cjs/hooks/useIdlAccount.js.map +1 -0
  14. package/lib/cjs/hooks/useInterval.js +20 -0
  15. package/lib/cjs/hooks/useInterval.js.map +1 -0
  16. package/lib/cjs/hooks/useMint.js +20 -0
  17. package/lib/cjs/hooks/useMint.js.map +1 -0
  18. package/lib/cjs/hooks/useOwnedAmount.js +28 -0
  19. package/lib/cjs/hooks/useOwnedAmount.js.map +1 -0
  20. package/lib/cjs/hooks/useSolOwnedAmount.js +13 -0
  21. package/lib/cjs/hooks/useSolOwnedAmount.js.map +1 -0
  22. package/lib/cjs/hooks/useTokenAccount.js +13 -0
  23. package/lib/cjs/hooks/useTokenAccount.js.map +1 -0
  24. package/lib/cjs/index.js +27 -0
  25. package/lib/cjs/index.js.map +1 -0
  26. package/lib/esm/src/contexts/accountContext.js +20 -0
  27. package/lib/esm/src/contexts/accountContext.js.map +1 -0
  28. package/lib/esm/src/hooks/useAccount.js +147 -0
  29. package/lib/esm/src/hooks/useAccount.js.map +1 -0
  30. package/lib/esm/src/hooks/useAccountFetchCache.js +10 -0
  31. package/lib/esm/src/hooks/useAccountFetchCache.js.map +1 -0
  32. package/lib/esm/src/hooks/useAssociatedTokenAccount.js +30 -0
  33. package/lib/esm/src/hooks/useAssociatedTokenAccount.js.map +1 -0
  34. package/lib/esm/src/hooks/useAssociatedTokenAddress.js +13 -0
  35. package/lib/esm/src/hooks/useAssociatedTokenAddress.js.map +1 -0
  36. package/lib/esm/src/hooks/useIdlAccount.js +20 -0
  37. package/lib/esm/src/hooks/useIdlAccount.js.map +1 -0
  38. package/lib/esm/src/hooks/useInterval.js +16 -0
  39. package/lib/esm/src/hooks/useInterval.js.map +1 -0
  40. package/lib/esm/src/hooks/useMint.js +17 -0
  41. package/lib/esm/src/hooks/useMint.js.map +1 -0
  42. package/lib/esm/src/hooks/useOwnedAmount.js +24 -0
  43. package/lib/esm/src/hooks/useOwnedAmount.js.map +1 -0
  44. package/lib/esm/src/hooks/useSolOwnedAmount.js +9 -0
  45. package/lib/esm/src/hooks/useSolOwnedAmount.js.map +1 -0
  46. package/lib/esm/src/hooks/useTokenAccount.js +9 -0
  47. package/lib/esm/src/hooks/useTokenAccount.js.map +1 -0
  48. package/lib/esm/src/index.js +12 -0
  49. package/lib/esm/src/index.js.map +1 -0
  50. package/lib/esm/tsconfig.esm.tsbuildinfo +1 -0
  51. package/lib/types/src/contexts/accountContext.d.ts +12 -0
  52. package/lib/types/src/contexts/accountContext.d.ts.map +1 -0
  53. package/lib/types/src/hooks/useAccount.d.ts +24 -0
  54. package/lib/types/src/hooks/useAccount.d.ts.map +1 -0
  55. package/lib/types/src/hooks/useAccountFetchCache.d.ts +6 -0
  56. package/lib/types/src/hooks/useAccountFetchCache.d.ts.map +1 -0
  57. package/lib/types/src/hooks/useAssociatedTokenAccount.d.ts +16 -0
  58. package/lib/types/src/hooks/useAssociatedTokenAccount.d.ts.map +1 -0
  59. package/lib/types/src/hooks/useAssociatedTokenAddress.d.ts +8 -0
  60. package/lib/types/src/hooks/useAssociatedTokenAddress.d.ts.map +1 -0
  61. package/lib/types/src/hooks/useIdlAccount.d.ts +5 -0
  62. package/lib/types/src/hooks/useIdlAccount.d.ts.map +1 -0
  63. package/lib/types/src/hooks/useInterval.d.ts +2 -0
  64. package/lib/types/src/hooks/useInterval.d.ts.map +1 -0
  65. package/lib/types/src/hooks/useMint.d.ts +5 -0
  66. package/lib/types/src/hooks/useMint.d.ts.map +1 -0
  67. package/lib/types/src/hooks/useOwnedAmount.d.ts +7 -0
  68. package/lib/types/src/hooks/useOwnedAmount.d.ts.map +1 -0
  69. package/lib/types/src/hooks/useSolOwnedAmount.d.ts +6 -0
  70. package/lib/types/src/hooks/useSolOwnedAmount.d.ts.map +1 -0
  71. package/lib/types/src/hooks/useTokenAccount.d.ts +5 -0
  72. package/lib/types/src/hooks/useTokenAccount.d.ts.map +1 -0
  73. package/lib/types/src/index.d.ts +14 -0
  74. package/lib/types/src/index.d.ts.map +1 -0
  75. package/package.json +55 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTokenAccount.js","sourceRoot":"","sources":["../../../src/hooks/useTokenAccount.ts"],"names":[],"mappings":";;;AAAA,6CAA2D;AAC3D,iDAA2D;AAG3D,MAAM,MAAM,GAAG,CACb,MAAiB,EACjB,IAAyB,EACJ,EAAE;IACvB,OAAO,IAAA,yBAAa,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,SAAgB,eAAe,CAC7B,OAAqC;IAErC,OAAO,IAAA,uBAAU,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAJD,0CAIC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useAssociatedTokenAddress = exports.useTokenAccount = exports.useSolOwnedAmount = exports.useOwnedAmount = exports.useMint = exports.useAssociatedTokenAccount = exports.useInterval = exports.useAccountFetchCache = exports.useIdlAccount = exports.AccountProvider = exports.AccountContext = exports.useAccount = void 0;
4
+ var useAccount_1 = require("./hooks/useAccount");
5
+ Object.defineProperty(exports, "useAccount", { enumerable: true, get: function () { return useAccount_1.useAccount; } });
6
+ var accountContext_1 = require("./contexts/accountContext");
7
+ Object.defineProperty(exports, "AccountContext", { enumerable: true, get: function () { return accountContext_1.AccountContext; } });
8
+ Object.defineProperty(exports, "AccountProvider", { enumerable: true, get: function () { return accountContext_1.AccountProvider; } });
9
+ var useIdlAccount_1 = require("./hooks/useIdlAccount");
10
+ Object.defineProperty(exports, "useIdlAccount", { enumerable: true, get: function () { return useIdlAccount_1.useIdlAccount; } });
11
+ var useAccountFetchCache_1 = require("./hooks/useAccountFetchCache");
12
+ Object.defineProperty(exports, "useAccountFetchCache", { enumerable: true, get: function () { return useAccountFetchCache_1.useAccountFetchCache; } });
13
+ var useInterval_1 = require("./hooks/useInterval");
14
+ Object.defineProperty(exports, "useInterval", { enumerable: true, get: function () { return useInterval_1.useInterval; } });
15
+ var useAssociatedTokenAccount_1 = require("./hooks/useAssociatedTokenAccount");
16
+ Object.defineProperty(exports, "useAssociatedTokenAccount", { enumerable: true, get: function () { return useAssociatedTokenAccount_1.useAssociatedTokenAccount; } });
17
+ var useMint_1 = require("./hooks/useMint");
18
+ Object.defineProperty(exports, "useMint", { enumerable: true, get: function () { return useMint_1.useMint; } });
19
+ var useOwnedAmount_1 = require("./hooks/useOwnedAmount");
20
+ Object.defineProperty(exports, "useOwnedAmount", { enumerable: true, get: function () { return useOwnedAmount_1.useOwnedAmount; } });
21
+ var useSolOwnedAmount_1 = require("./hooks/useSolOwnedAmount");
22
+ Object.defineProperty(exports, "useSolOwnedAmount", { enumerable: true, get: function () { return useSolOwnedAmount_1.useSolOwnedAmount; } });
23
+ var useTokenAccount_1 = require("./hooks/useTokenAccount");
24
+ Object.defineProperty(exports, "useTokenAccount", { enumerable: true, get: function () { return useTokenAccount_1.useTokenAccount; } });
25
+ var useAssociatedTokenAddress_1 = require("./hooks/useAssociatedTokenAddress");
26
+ Object.defineProperty(exports, "useAssociatedTokenAddress", { enumerable: true, get: function () { return useAssociatedTokenAddress_1.useAssociatedTokenAddress; } });
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAAgD;AAAvC,wGAAA,UAAU,OAAA;AAEnB,4DAA4E;AAAnE,gHAAA,cAAc,OAAA;AAAE,iHAAA,eAAe,OAAA;AAExC,uDAAsD;AAA7C,8GAAA,aAAa,OAAA;AACtB,qEAAoE;AAA3D,4HAAA,oBAAoB,OAAA;AAC7B,mDAAkD;AAAzC,0GAAA,WAAW,OAAA;AACpB,+EAA8E;AAArE,sIAAA,yBAAyB,OAAA;AAClC,2CAA0C;AAAjC,kGAAA,OAAO,OAAA;AAChB,yDAAwD;AAA/C,gHAAA,cAAc,OAAA;AACvB,+DAA8D;AAArD,sHAAA,iBAAiB,OAAA;AAC1B,2DAA0D;AAAjD,kHAAA,eAAe,OAAA;AACxB,+EAA8E;AAArE,sIAAA,yBAAyB,OAAA"}
@@ -0,0 +1,20 @@
1
+ import { AccountFetchCache } from "@helium/spl-utils";
2
+ import React, { createContext, useEffect, useState, } from "react";
3
+ export const AccountContext = createContext(undefined);
4
+ export const AccountProvider = ({ children, commitment = "confirmed", extendConnection = true, connection }) => {
5
+ const [cache, setCache] = useState();
6
+ useEffect(() => {
7
+ if (connection) {
8
+ cache?.close();
9
+ setCache(new AccountFetchCache({
10
+ connection,
11
+ delay: 50,
12
+ commitment,
13
+ extendConnection,
14
+ }));
15
+ }
16
+ }, [connection]);
17
+ return (React.createElement(AccountContext.Provider, { value: cache }, children));
18
+ return null;
19
+ };
20
+ //# sourceMappingURL=accountContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountContext.js","sourceRoot":"","sources":["../../../../src/contexts/accountContext.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,EACZ,aAAa,EAGb,SAAS,EACT,QAAQ,GACT,MAAM,OAAO,CAAC;AASf,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CACzC,SAAS,CACV,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAA8B,CAAC,EACzD,QAAQ,EACR,UAAU,GAAG,WAAW,EACxB,gBAAgB,GAAG,IAAI,EACvB,UAAU,EACX,EAAE,EAAE;IACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAqB,CAAC;IACxD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,EAAE;YACd,KAAK,EAAE,KAAK,EAAE,CAAC;YAEf,QAAQ,CACN,IAAI,iBAAiB,CAAC;gBACpB,UAAU;gBACV,KAAK,EAAE,EAAE;gBACT,UAAU;gBACV,gBAAgB;aACjB,CAAC,CACH,CAAC;SACH;IACH,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,OAAO,CACL,oBAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,IAAG,QAAQ,CAA2B,CAC5E,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
@@ -0,0 +1,147 @@
1
+ import { useState, useEffect } from "react";
2
+ import { useAccountFetchCache } from "./useAccountFetchCache";
3
+ /**
4
+ * Generic hook to get a cached, auto updating, deserialized form of any Solana account. Massively saves on RPC usage by using
5
+ * the spl-utils accountFetchCache.
6
+ *
7
+ * @param key
8
+ * @param parser
9
+ * @param isStatic
10
+ * @returns
11
+ */
12
+ export function useAccount(key, parser, isStatic = false // Set if the accounts data will never change, optimisation to lower websocket usage.
13
+ ) {
14
+ const cache = useAccountFetchCache();
15
+ const [state, setState] = useState({
16
+ loading: true,
17
+ });
18
+ const parsedAccountBaseParser = (pubkey, data) => {
19
+ try {
20
+ const info = parser(pubkey, data);
21
+ return {
22
+ pubkey,
23
+ account: data,
24
+ info,
25
+ };
26
+ }
27
+ catch (e) {
28
+ console.error("Error while parsing", e);
29
+ return {
30
+ pubkey,
31
+ account: data,
32
+ info: undefined,
33
+ };
34
+ }
35
+ };
36
+ const id = typeof key === "string" ? key : key?.toBase58();
37
+ useEffect(() => {
38
+ // Occassionally, dispose can get called while the cache promise is still going.
39
+ // In that case, we want to dispose immediately.
40
+ let shouldDisposeImmediately = false;
41
+ let disposeWatch = () => {
42
+ shouldDisposeImmediately = true;
43
+ };
44
+ if (!id || !cache) {
45
+ setState({ loading: false });
46
+ return;
47
+ }
48
+ else {
49
+ setState({ loading: true });
50
+ }
51
+ let prevInfo = state.info;
52
+ cache
53
+ .searchAndWatch(id, parser ? parsedAccountBaseParser : undefined, isStatic)
54
+ .then(([acc, dispose]) => {
55
+ if (shouldDisposeImmediately) {
56
+ dispose();
57
+ shouldDisposeImmediately = false;
58
+ }
59
+ disposeWatch = dispose;
60
+ if (acc) {
61
+ try {
62
+ const nextInfo = mergePublicKeys(prevInfo, (parser && parser(acc.pubkey, acc.account)));
63
+ prevInfo = nextInfo;
64
+ setState({
65
+ loading: false,
66
+ info: nextInfo,
67
+ account: acc.account,
68
+ });
69
+ }
70
+ catch (e) {
71
+ console.error("Error while parsing", e);
72
+ setState({
73
+ loading: false,
74
+ info: undefined,
75
+ account: acc.account,
76
+ });
77
+ }
78
+ }
79
+ else {
80
+ setState({ loading: false });
81
+ }
82
+ })
83
+ .catch((e) => {
84
+ console.error(e);
85
+ setState({ loading: false });
86
+ });
87
+ const disposeEmitter = cache.emitter.onCache((e) => {
88
+ const event = e;
89
+ if (event.id === id) {
90
+ cache
91
+ .search(id, parser ? parsedAccountBaseParser : undefined)
92
+ .then((acc) => {
93
+ if (acc && acc.account != state.account) {
94
+ try {
95
+ setState({
96
+ loading: false,
97
+ info: mergePublicKeys(state.info, parser && parser(acc.pubkey, acc.account)),
98
+ account: acc.account,
99
+ });
100
+ }
101
+ catch (e) {
102
+ console.error("Error while parsing", e);
103
+ setState({
104
+ loading: false,
105
+ info: undefined,
106
+ account: acc.account,
107
+ });
108
+ }
109
+ }
110
+ });
111
+ }
112
+ });
113
+ return () => {
114
+ disposeEmitter();
115
+ setTimeout(disposeWatch, 30 * 1000); // Keep cached accounts around for 30s in case a rerender is causing reuse
116
+ };
117
+ }, [cache, id, !parser]); // only trigger on change to parser if it wasn't defined before.
118
+ return state;
119
+ }
120
+ function isPureObject(input) {
121
+ return (null !== input &&
122
+ typeof input === "object" &&
123
+ Object.getPrototypeOf(input).isPrototypeOf(Object));
124
+ }
125
+ /**
126
+ * Updates to a solana account will contain new PublicKeys that are
127
+ * actually the same, just a new JS object. This will cause a lot of useMemo
128
+ * to fail.
129
+ */
130
+ function mergePublicKeys(arg0, arg1) {
131
+ if (!isPureObject(arg1) || !arg1 || !arg0) {
132
+ return arg1;
133
+ }
134
+ return Object.entries(arg1).reduce((acc, [key, value]) => {
135
+ if (arg1[key] &&
136
+ arg1[key].equals &&
137
+ arg0[key] &&
138
+ arg1[key].equals(arg0[key])) {
139
+ acc[key] = arg0[key];
140
+ }
141
+ else {
142
+ acc[key] = value;
143
+ }
144
+ return acc;
145
+ }, {});
146
+ }
147
+ //# sourceMappingURL=useAccount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAccount.js","sourceRoot":"","sources":["../../../../src/hooks/useAccount.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { useContext } from "react";
2
+ import { AccountContext } from "../contexts/accountContext";
3
+ /**
4
+ * Get the account fetch cache to save on rcp calls. Generally, you want to use {@link useAccount}
5
+ * @returns
6
+ */
7
+ export const useAccountFetchCache = () => {
8
+ return useContext(AccountContext);
9
+ };
10
+ //# sourceMappingURL=useAccountFetchCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAccountFetchCache.js","sourceRoot":"","sources":["../../../../src/hooks/useAccountFetchCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE;IACvC,OAAO,UAAU,CAAC,cAAc,CAAC,CAAC;AACpC,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { useMemo } from "react";
2
+ import { useAssociatedTokenAddress } from "./useAssociatedTokenAddress";
3
+ import { useTokenAccount } from "./useTokenAccount";
4
+ /**
5
+ * Get the associcated token account for this wallet, or the account itself is this address is already an ata
6
+ *
7
+ * @param walletOrAta
8
+ * @param mint
9
+ * @returns
10
+ */
11
+ export function useAssociatedTokenAccount(walletOrAta, mint) {
12
+ const { result: associatedTokenAddress, loading: loading } = useAssociatedTokenAddress(walletOrAta, mint);
13
+ const { info: associatedAccount, loading: loading2 } = useTokenAccount(associatedTokenAddress);
14
+ const { info: account, loading: loading3 } = useTokenAccount(associatedTokenAddress || undefined);
15
+ const result = useMemo(() => {
16
+ if (account?.mint === mint) {
17
+ // The passed value is the ata
18
+ return account;
19
+ }
20
+ else {
21
+ return associatedAccount;
22
+ }
23
+ }, [associatedAccount, account, mint]);
24
+ return {
25
+ associatedAccount: result,
26
+ loading: loading || loading2 || loading3,
27
+ associatedAccountKey: associatedTokenAddress,
28
+ };
29
+ }
30
+ //# sourceMappingURL=useAssociatedTokenAccount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAssociatedTokenAccount.js","sourceRoot":"","sources":["../../../../src/hooks/useAssociatedTokenAccount.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAQpD;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CACvC,WAAyC,EACzC,IAAkC;IAElC,MAAM,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,EAAE,GACxD,yBAAyB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,eAAe,CACpE,sBAAsB,CACvB,CAAC;IACF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,eAAe,CAC1D,sBAAsB,IAAI,SAAS,CACpC,CAAC;IAEF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,OAAO,EAAE,IAAI,KAAK,IAAI,EAAE;YAC1B,8BAA8B;YAC9B,OAAO,OAAO,CAAC;SAChB;aAAM;YACL,OAAO,iBAAiB,CAAC;SAC1B;IACH,CAAC,EAAE,CAAC,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAEvC,OAAO;QACL,iBAAiB,EAAE,MAAM;QACzB,OAAO,EAAE,OAAO,IAAI,QAAQ,IAAI,QAAQ;QACxC,oBAAoB,EAAE,sBAAsB;KAC7C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { getAssociatedTokenAddress, } from "@solana/spl-token";
2
+ import { useAsync } from "react-async-hook";
3
+ const fetch = async (wallet, mint) => {
4
+ if (!wallet || !mint) {
5
+ return undefined;
6
+ }
7
+ return getAssociatedTokenAddress(mint, wallet, true);
8
+ };
9
+ export function useAssociatedTokenAddress(wallet, mint) {
10
+ const { result, loading } = useAsync(fetch, [wallet, mint]);
11
+ return { result, loading };
12
+ }
13
+ //# sourceMappingURL=useAssociatedTokenAddress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAssociatedTokenAddress.js","sourceRoot":"","sources":["../../../../src/hooks/useAssociatedTokenAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,GAC1B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAM5C,MAAM,KAAK,GAAG,KAAK,EACjB,MAAoC,EACpC,IAAkC,EACF,EAAE;IAClC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE;QACpB,OAAO,SAAS,CAAC;KAClB;IAED,OAAO,yBAAyB,CAC9B,IAAI,EACJ,MAAM,EACN,IAAI,CACL,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,UAAU,yBAAyB,CACvC,MAAoC,EACpC,IAAkC;IAElC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAE5D,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { useAccount } from "./useAccount";
2
+ import { BorshAccountsCoder } from "@project-serum/anchor";
3
+ import { useMemo } from "react";
4
+ export function useIdlAccount(key, idl, type) {
5
+ const parser = useMemo(() => {
6
+ return (pubkey, data) => {
7
+ try {
8
+ const coder = new BorshAccountsCoder(idl);
9
+ const decoded = coder.decode(type, data.data);
10
+ decoded.pubkey = pubkey;
11
+ return decoded;
12
+ }
13
+ catch (e) {
14
+ console.error(e);
15
+ }
16
+ };
17
+ }, [idl, type]);
18
+ return useAccount(key, parser);
19
+ }
20
+ //# sourceMappingURL=useIdlAccount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIdlAccount.js","sourceRoot":"","sources":["../../../../src/hooks/useIdlAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAoB,MAAM,uBAAuB,CAAC;AAE7E,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGhC,MAAM,UAAU,aAAa,CAC3B,GAAc,EACd,GAAQ,EACR,IAAO;IAEP,MAAM,MAAM,GAA4C,OAAO,CAAC,GAAG,EAAE;QACnE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;YACtB,IAAI;gBACF,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC9C,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;gBACxB,OAAO,OAAO,CAAC;aAChB;YAAC,OAAO,CAAM,EAAE;gBACf,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aAClB;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAChB,OAAO,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { useRef, useEffect } from "react";
2
+ export function useInterval(callback, delay, deps = []) {
3
+ const savedCallbackRef = useRef();
4
+ useEffect(() => {
5
+ savedCallbackRef.current = callback;
6
+ }, [callback]);
7
+ useEffect(() => {
8
+ const handler = (...args) => savedCallbackRef.current(...args);
9
+ if (delay !== null) {
10
+ handler();
11
+ const intervalId = setInterval(handler, delay);
12
+ return () => clearInterval(intervalId);
13
+ }
14
+ }, [delay, ...deps]);
15
+ }
16
+ //# sourceMappingURL=useInterval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInterval.js","sourceRoot":"","sources":["../../../../src/hooks/useInterval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE1C,MAAM,UAAU,WAAW,CACzB,QAAkC,EAClC,KAAoB,EACpB,OAAc,EAAE;IAEhB,MAAM,gBAAgB,GAAG,MAAM,EAA4B,CAAC;IAE5D,SAAS,CAAC,GAAG,EAAE;QACb,gBAAgB,CAAC,OAAO,GAAG,QAAQ,CAAC;IACtC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QAEvE,IAAI,KAAK,KAAK,IAAI,EAAE;YAClB,OAAO,EAAE,CAAC;YACV,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC/C,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;SACxC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { unpackMint } from "@solana/spl-token";
2
+ import { useAccount } from "./useAccount";
3
+ export const MintParser = (pubKey, info) => {
4
+ const data = unpackMint(pubKey, info);
5
+ const details = {
6
+ pubkey: pubKey,
7
+ account: {
8
+ ...info,
9
+ },
10
+ info: data,
11
+ };
12
+ return details;
13
+ };
14
+ export function useMint(key) {
15
+ return useAccount(key, MintParser);
16
+ }
17
+ //# sourceMappingURL=useMint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMint.js","sourceRoot":"","sources":["../../../../src/hooks/useMint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAqB,UAAU,EAAE,MAAM,cAAc,CAAC;AAE7D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAiB,EAAE,IAAyB,EAAE,EAAE;IACzE,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG;QACd,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,GAAG,IAAI;SACR;QACD,IAAI,EAAE,IAAI;KACU,CAAC;IAEvB,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,GAAiC;IACvD,OAAO,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { NATIVE_MINT } from "@solana/spl-token";
2
+ import { useMemo } from "react";
3
+ import { useAssociatedTokenAccount } from "./useAssociatedTokenAccount";
4
+ import { useMint } from "./useMint";
5
+ import { useSolOwnedAmount } from "./useSolOwnedAmount";
6
+ export function useOwnedAmount(wallet, mint) {
7
+ const { amount: solOwnedAmount } = useSolOwnedAmount(wallet || undefined);
8
+ const { associatedAccount, loading: loadingAssoc } = useAssociatedTokenAccount(wallet, mint);
9
+ const { info: mintAcc, loading: loadingMint } = useMint(mint);
10
+ const amount = useMemo(() => {
11
+ if (mint?.equals(NATIVE_MINT)) {
12
+ return solOwnedAmount;
13
+ }
14
+ else if (associatedAccount) {
15
+ return associatedAccount.amount;
16
+ }
17
+ }, [solOwnedAmount, associatedAccount?.amount]);
18
+ return {
19
+ loading: loadingAssoc || loadingMint,
20
+ amount,
21
+ decimals: mintAcc?.info.decimals,
22
+ };
23
+ }
24
+ //# sourceMappingURL=useOwnedAmount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOwnedAmount.js","sourceRoot":"","sources":["../../../../src/hooks/useOwnedAmount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,UAAU,cAAc,CAC5B,MAAoC,EACpC,IAAkC;IAElC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;IAC1E,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE,GAChD,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE;YAC7B,OAAO,cAAc,CAAA;SACtB;aAAM,IAAI,iBAAiB,EAAE;YAC5B,OAAO,iBAAiB,CAAC,MAAM,CAAA;SAChC;IACH,CAAC,EAAE,CAAC,cAAc,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,OAAO;QACL,OAAO,EAAE,YAAY,IAAI,WAAW;QACpC,MAAM;QACN,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { useAccount } from "./useAccount";
2
+ export function useSolOwnedAmount(ownerPublicKey) {
3
+ const { info: lamports, loading } = useAccount(ownerPublicKey, (_, account) => BigInt(account.lamports));
4
+ return {
5
+ amount: lamports,
6
+ loading,
7
+ };
8
+ }
9
+ //# sourceMappingURL=useSolOwnedAmount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSolOwnedAmount.js","sourceRoot":"","sources":["../../../../src/hooks/useSolOwnedAmount.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,iBAAiB,CAAC,cAA0B;IAI1D,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,UAAU,CAC5C,cAAc,EACd,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CACzC,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { useAccount } from "./useAccount";
2
+ import { unpackAccount } from "@solana/spl-token";
3
+ const parser = (pubkey, acct) => {
4
+ return unpackAccount(pubkey, acct);
5
+ };
6
+ export function useTokenAccount(address) {
7
+ return useAccount(address, parser);
8
+ }
9
+ //# sourceMappingURL=useTokenAccount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTokenAccount.js","sourceRoot":"","sources":["../../../../src/hooks/useTokenAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAW,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG3D,MAAM,MAAM,GAAG,CACb,MAAiB,EACjB,IAAyB,EACJ,EAAE;IACvB,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,OAAqC;IAErC,OAAO,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,12 @@
1
+ export { useAccount } from "./hooks/useAccount";
2
+ export { AccountContext, AccountProvider } from "./contexts/accountContext";
3
+ export { useIdlAccount } from "./hooks/useIdlAccount";
4
+ export { useAccountFetchCache } from "./hooks/useAccountFetchCache";
5
+ export { useInterval } from "./hooks/useInterval";
6
+ export { useAssociatedTokenAccount } from "./hooks/useAssociatedTokenAccount";
7
+ export { useMint } from "./hooks/useMint";
8
+ export { useOwnedAmount } from "./hooks/useOwnedAmount";
9
+ export { useSolOwnedAmount } from "./hooks/useSolOwnedAmount";
10
+ export { useTokenAccount } from "./hooks/useTokenAccount";
11
+ export { useAssociatedTokenAddress } from "./hooks/useAssociatedTokenAddress";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC"}