@livo-build/kit 0.1.0

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 (64) hide show
  1. package/README.md +122 -0
  2. package/STYLING.md +76 -0
  3. package/dist/contracts/createLivoContracts.d.ts +24 -0
  4. package/dist/contracts/createLivoContracts.js +35 -0
  5. package/dist/contracts/index.d.ts +2 -0
  6. package/dist/contracts/index.js +2 -0
  7. package/dist/contracts/useContractValue.d.ts +11 -0
  8. package/dist/contracts/useContractValue.js +23 -0
  9. package/dist/data/index.d.ts +2 -0
  10. package/dist/data/index.js +2 -0
  11. package/dist/data/useApi.d.ts +17 -0
  12. package/dist/data/useApi.js +42 -0
  13. package/dist/data/useSubgraph.d.ts +9 -0
  14. package/dist/data/useSubgraph.js +32 -0
  15. package/dist/format.d.ts +16 -0
  16. package/dist/format.js +59 -0
  17. package/dist/index.d.ts +9 -0
  18. package/dist/index.js +22 -0
  19. package/dist/provider/Web3Provider.d.ts +11 -0
  20. package/dist/provider/Web3Provider.js +11 -0
  21. package/dist/provider/index.d.ts +1 -0
  22. package/dist/provider/index.js +1 -0
  23. package/dist/toast/index.d.ts +1 -0
  24. package/dist/toast/index.js +1 -0
  25. package/dist/toast/toast.css +30 -0
  26. package/dist/toast/toast.d.ts +23 -0
  27. package/dist/toast/toast.js +64 -0
  28. package/dist/tx/TxButton.d.ts +13 -0
  29. package/dist/tx/TxButton.js +56 -0
  30. package/dist/tx/index.d.ts +3 -0
  31. package/dist/tx/index.js +3 -0
  32. package/dist/tx/revert.d.ts +1 -0
  33. package/dist/tx/revert.js +24 -0
  34. package/dist/tx/tx.css +13 -0
  35. package/dist/tx/useTx.d.ts +21 -0
  36. package/dist/tx/useTx.js +45 -0
  37. package/dist/ui/index.d.ts +1 -0
  38. package/dist/ui/index.js +1 -0
  39. package/dist/ui/ui.css +23 -0
  40. package/dist/ui/ui.d.ts +40 -0
  41. package/dist/ui/ui.js +56 -0
  42. package/dist/util.d.ts +2 -0
  43. package/dist/util.js +2 -0
  44. package/dist/wallet/ConnectWallet.d.ts +21 -0
  45. package/dist/wallet/ConnectWallet.js +34 -0
  46. package/dist/wallet/WalletModal.d.ts +20 -0
  47. package/dist/wallet/WalletModal.js +40 -0
  48. package/dist/wallet/index.d.ts +3 -0
  49. package/dist/wallet/index.js +3 -0
  50. package/dist/wallet/useWalletConnectors.d.ts +16 -0
  51. package/dist/wallet/useWalletConnectors.js +31 -0
  52. package/dist/wallet/wallet.css +64 -0
  53. package/dist/web3/Address.d.ts +12 -0
  54. package/dist/web3/Address.js +25 -0
  55. package/dist/web3/Balance.d.ts +14 -0
  56. package/dist/web3/Balance.js +22 -0
  57. package/dist/web3/NetworkGuard.d.ts +12 -0
  58. package/dist/web3/NetworkGuard.js +15 -0
  59. package/dist/web3/TokenAmountInput.d.ts +13 -0
  60. package/dist/web3/TokenAmountInput.js +19 -0
  61. package/dist/web3/index.d.ts +4 -0
  62. package/dist/web3/index.js +4 -0
  63. package/dist/web3/web3.css +15 -0
  64. package/package.json +67 -0
@@ -0,0 +1,64 @@
1
+ /* Livo wallet modal — NEUTRAL defaults on purpose. The kit owns the structure +
2
+ behaviour; the LOOK is yours. Style it any of three ways:
3
+ 1. override the CSS variables below (on :root or a parent),
4
+ 2. pass `classNames={{ ... }}` to <ConnectWallet> / <WalletModal>,
5
+ 3. target the stable class hooks / [data-*] attributes in your own CSS.
6
+ Defaults inherit the app font and lean grayscale so sites don't all look alike. */
7
+ .wm-root{
8
+ --wm-accent:#111827; --wm-accent-fg:#fff;
9
+ --wm-bg:#fff; --wm-fg:#111827; --wm-muted:#6b7280;
10
+ --wm-row:#f3f4f6; --wm-row-hover:#e9eaee; --wm-border:#e5e7eb;
11
+ --wm-overlay:rgba(17,24,39,.5);
12
+ --wm-radius:18px; --wm-row-radius:12px;
13
+ --wm-shadow:0 20px 60px rgba(0,0,0,.25);
14
+ font-family:inherit;
15
+ position:fixed; inset:0; z-index:2147483000;
16
+ display:flex; align-items:center; justify-content:center;
17
+ }
18
+ @media (prefers-color-scheme:dark){.wm-root:not(.wm-light){
19
+ --wm-accent:#f5f5f7; --wm-accent-fg:#111827;
20
+ --wm-bg:#1b1b1f; --wm-fg:#f5f5f7; --wm-muted:#9b9ba4;
21
+ --wm-row:#27272c; --wm-row-hover:#313137; --wm-border:#2c2c31; --wm-overlay:rgba(0,0,0,.6);
22
+ }}
23
+ .wm-overlay{position:absolute;inset:0;background:var(--wm-overlay);animation:wm-fade .16s ease}
24
+ .wm-sheet{position:relative;width:360px;max-width:calc(100vw - 28px);background:var(--wm-bg);color:var(--wm-fg);border-radius:var(--wm-radius);box-shadow:var(--wm-shadow);padding:18px 18px 14px;animation:wm-pop .2s cubic-bezier(.2,.9,.25,1);outline:none}
25
+ .wm-handle{display:none}
26
+ .wm-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}
27
+ .wm-title{margin:0;font-size:17px;font-weight:600}
28
+ .wm-close{width:30px;height:30px;border:0;border-radius:50%;background:var(--wm-row);color:var(--wm-muted);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:background .12s,color .12s}
29
+ .wm-close:hover{background:var(--wm-row-hover);color:var(--wm-fg)}
30
+ .wm-list{display:flex;flex-direction:column;gap:6px;max-height:min(54vh,360px);overflow-y:auto}
31
+ .wm-wallet{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;padding:13px 14px;border:0;border-radius:var(--wm-row-radius);background:var(--wm-row);color:var(--wm-fg);cursor:pointer;font:inherit;font-size:15px;font-weight:500;text-align:left;transition:background .12s}
32
+ .wm-wallet:hover{background:var(--wm-row-hover)}
33
+ .wm-wallet:disabled{opacity:.55;cursor:default}
34
+ .wm-wname{flex:1}
35
+ .wm-wicon{position:relative;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px}
36
+ .wm-wicon img{width:28px;height:28px;border-radius:7px;object-fit:cover}
37
+ .wm-wfallback{width:28px;height:28px;border-radius:7px;background:var(--wm-accent);color:var(--wm-accent-fg);display:inline-flex;align-items:center;justify-content:center;font-weight:600;font-size:13px}
38
+ .wm-spin{position:absolute;inset:-4px;border:2px solid transparent;border-top-color:currentColor;border-radius:50%;opacity:.5;animation:wm-spin .7s linear infinite}
39
+ .wm-empty{color:var(--wm-muted);font-size:14px;text-align:center;padding:18px 8px;margin:0}
40
+ .wm-error{background:var(--wm-row);color:var(--wm-fg);border-radius:10px;padding:10px 12px;font-size:13px;margin-bottom:10px;display:flex;justify-content:space-between;gap:8px;align-items:center}
41
+ .wm-error button{border:0;background:transparent;color:inherit;font:inherit;font-weight:600;cursor:pointer;text-decoration:underline}
42
+ .wm-foot{color:var(--wm-muted);font-size:12px;text-align:center;margin:12px 4px 2px}
43
+ .wm-cta{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:10px 16px;border:0;border-radius:11px;background:var(--wm-accent);color:var(--wm-accent-fg);font:inherit;font-weight:600;font-size:14px;cursor:pointer;transition:opacity .12s,transform .08s}
44
+ .wm-cta:hover{opacity:.9}
45
+ .wm-cta:active{transform:translateY(1px)}
46
+ .wm-account-wrap{position:relative;display:inline-block}
47
+ .wm-account{display:inline-flex;align-items:center;gap:8px;padding:6px 14px 6px 7px;border:1px solid var(--wm-border);border-radius:999px;background:var(--wm-bg);color:var(--wm-fg);font:inherit;font-weight:600;font-size:14px;cursor:pointer;transition:border-color .12s}
48
+ .wm-account:hover{border-color:var(--wm-muted)}
49
+ .wm-avatar{width:22px;height:22px;border-radius:50%;background-size:cover}
50
+ .wm-menu-backdrop{position:fixed;inset:0;z-index:1}
51
+ .wm-menu{position:absolute;z-index:2;top:calc(100% + 6px);right:0;min-width:180px;background:var(--wm-bg);border:1px solid var(--wm-border);border-radius:12px;box-shadow:var(--wm-shadow);padding:6px;animation:wm-pop .14s ease}
52
+ .wm-menu button{display:block;width:100%;text-align:left;padding:9px 10px;border:0;background:transparent;color:var(--wm-fg);border-radius:8px;font:inherit;font-size:14px;cursor:pointer}
53
+ .wm-menu button:hover{background:var(--wm-row)}
54
+ @keyframes wm-fade{from{opacity:0}to{opacity:1}}
55
+ @keyframes wm-pop{from{opacity:0;transform:translateY(6px) scale(.98)}to{opacity:1;transform:none}}
56
+ @keyframes wm-spin{to{transform:rotate(360deg)}}
57
+ @media (max-width:480px){
58
+ .wm-root{align-items:flex-end}
59
+ .wm-sheet{width:100%;max-width:100%;border-radius:18px 18px 0 0;padding-bottom:24px;animation:wm-up .22s cubic-bezier(.2,.9,.25,1)}
60
+ .wm-handle{display:block;width:40px;height:4px;border-radius:2px;background:var(--wm-border);margin:0 auto 12px}
61
+ .wm-wallet{padding:15px}
62
+ }
63
+ @keyframes wm-up{from{transform:translateY(100%)}to{transform:none}}
64
+ @media (prefers-reduced-motion:reduce){.wm-overlay,.wm-sheet,.wm-menu{animation:none}}
@@ -0,0 +1,12 @@
1
+ import "./web3.css";
2
+ export interface AddressProps {
3
+ address: `0x${string}`;
4
+ /** Resolve + show an ENS name when available (mainnet). Default true. */
5
+ ens?: boolean;
6
+ /** Show a copy button. Default true. */
7
+ copy?: boolean;
8
+ /** Show an explorer link (uses the connected chain's explorer). Default false. */
9
+ explorer?: boolean;
10
+ className?: string;
11
+ }
12
+ export declare function Address({ address, ens, copy, explorer, className }: AddressProps): import("react").JSX.Element;
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import "./web3.css";
3
+ import { useState } from "react";
4
+ import { useEnsName, useConnection } from "wagmi";
5
+ import { shortAddress } from "../format";
6
+ import { cx } from "../util";
7
+ // Display an address: short form (or ENS), with optional copy + explorer link.
8
+ // Neutral; style via .kit-addr / [data-ens] or className.
9
+ export function Address({ address, ens = true, copy = true, explorer = false, className }) {
10
+ const { data: name } = useEnsName({ address, query: { enabled: ens } });
11
+ const { chain } = useConnection();
12
+ const explorerUrl = chain?.blockExplorers?.default?.url;
13
+ const [copied, setCopied] = useState(false);
14
+ const label = name || shortAddress(address);
15
+ return (_jsxs("span", { className: cx("kit-addr", className), "data-ens": name ? "" : undefined, children: [_jsx("span", { children: label }), copy ? (_jsx("button", { className: "kit-addr-btn", "aria-label": "Copy address", onClick: () => {
16
+ try {
17
+ navigator.clipboard.writeText(address);
18
+ setCopied(true);
19
+ setTimeout(() => setCopied(false), 1200);
20
+ }
21
+ catch {
22
+ /* clipboard unavailable */
23
+ }
24
+ }, children: copied ? (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", children: _jsx("path", { d: "M3 8.5l3 3 7-7", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round", strokeLinejoin: "round" }) })) : (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", children: [_jsx("rect", { x: "5.5", y: "5.5", width: "8", height: "8", rx: "2", stroke: "currentColor", strokeWidth: "1.4" }), _jsx("path", { d: "M10.5 5.5V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h1.5", stroke: "currentColor", strokeWidth: "1.4" })] })) })) : null, explorer && explorerUrl ? (_jsx("a", { className: "kit-addr-btn", href: explorerUrl + "/address/" + address, target: "_blank", rel: "noreferrer", "aria-label": "View on explorer", children: _jsx("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", children: _jsx("path", { d: "M6 3H4a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-2M9 3h4v4M13 3l-6 6", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round", strokeLinejoin: "round" }) }) })) : null] }));
25
+ }
@@ -0,0 +1,14 @@
1
+ import "./web3.css";
2
+ export interface BalanceProps {
3
+ /** Account to read. Omit to render the placeholder. */
4
+ address?: `0x${string}`;
5
+ /** ERC-20 token address. Omit for the native balance. */
6
+ token?: `0x${string}`;
7
+ decimals?: number;
8
+ symbol?: string;
9
+ precision?: number;
10
+ className?: string;
11
+ /** Shown while loading / when no address. Default "—". */
12
+ placeholder?: string;
13
+ }
14
+ export declare function Balance({ address, token, decimals, symbol, precision, className, placeholder }: BalanceProps): import("react").JSX.Element;
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import "./web3.css";
3
+ import { useBalance, useReadContract } from "wagmi";
4
+ import { erc20Abi } from "viem";
5
+ import { formatToken } from "../format";
6
+ import { cx } from "../util";
7
+ // Show a native or ERC-20 balance, decimals handled correctly. (wagmi v3's
8
+ // useBalance is native-only; ERC-20 reads balanceOf/decimals/symbol.) Neutral.
9
+ export function Balance({ address, token, decimals, symbol, precision = 4, className, placeholder = "—" }) {
10
+ const native = useBalance({ address, query: { enabled: Boolean(address) && !token } });
11
+ const bal = useReadContract({ address: token, abi: erc20Abi, functionName: "balanceOf", args: address ? [address] : undefined, query: { enabled: Boolean(address && token) } });
12
+ const dec = useReadContract({ address: token, abi: erc20Abi, functionName: "decimals", query: { enabled: Boolean(token) && decimals === undefined } });
13
+ const sym = useReadContract({ address: token, abi: erc20Abi, functionName: "symbol", query: { enabled: Boolean(token) && symbol === undefined } });
14
+ const value = token ? bal.data : native.data?.value;
15
+ const d = decimals ?? (token ? dec.data : native.data?.decimals);
16
+ const s = symbol ?? (token ? sym.data : native.data?.symbol) ?? "";
17
+ const loading = token ? bal.isLoading || (decimals === undefined && dec.isLoading) : native.isLoading;
18
+ if (!address || loading || value === undefined || d === undefined) {
19
+ return (_jsx("span", { className: cx("kit-balance", className), "data-state": "loading", children: placeholder }));
20
+ }
21
+ return (_jsxs("span", { className: cx("kit-balance", className), "data-state": "ready", children: [formatToken(value, d, precision), " ", s] }));
22
+ }
@@ -0,0 +1,12 @@
1
+ import "./web3.css";
2
+ import { type ReactNode } from "react";
3
+ export interface NetworkGuardProps {
4
+ /** The chain the children require. */
5
+ chainId: number;
6
+ /** Friendly chain name for the prompt (e.g. "Sepolia"). */
7
+ name?: string;
8
+ children: ReactNode;
9
+ /** Render this instead of the default switch prompt when on the wrong chain. */
10
+ fallback?: ReactNode;
11
+ }
12
+ export declare function NetworkGuard({ chainId, name, children, fallback }: NetworkGuardProps): import("react").JSX.Element;
@@ -0,0 +1,15 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import "./web3.css";
3
+ import {} from "react";
4
+ import { useChainId, useSwitchChain } from "wagmi";
5
+ // Render children only on the right chain; otherwise a neutral switch prompt. Style
6
+ // via .kit-net / [data-state="wrong-network"], or pass your own `fallback`.
7
+ export function NetworkGuard({ chainId, name, children, fallback }) {
8
+ const current = useChainId();
9
+ const { switchChain, isPending } = useSwitchChain();
10
+ if (current === chainId)
11
+ return _jsx(_Fragment, { children: children });
12
+ if (fallback !== undefined)
13
+ return _jsx(_Fragment, { children: fallback });
14
+ return (_jsxs("div", { className: "kit-net", "data-state": "wrong-network", role: "alert", children: [_jsxs("span", { children: ["Wrong network", name ? ` — switch to ${name}` : "", "."] }), _jsx("button", { disabled: isPending, onClick: () => switchChain({ chainId }), children: isPending ? "Switching…" : "Switch" })] }));
15
+ }
@@ -0,0 +1,13 @@
1
+ import "./web3.css";
2
+ export interface TokenAmountInputProps {
3
+ value: string;
4
+ onChange: (value: string) => void;
5
+ /** Decimals to clamp the fractional part to. Default 18. */
6
+ decimals?: number;
7
+ /** Human max (e.g. a balance); shows a "Max" button that sets it. */
8
+ max?: string;
9
+ symbol?: string;
10
+ placeholder?: string;
11
+ className?: string;
12
+ }
13
+ export declare function TokenAmountInput({ value, onChange, decimals, max, symbol, placeholder, className }: TokenAmountInputProps): import("react").JSX.Element;
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import "./web3.css";
3
+ import { cx } from "../util";
4
+ // A decimals-safe token amount input (controlled). Sanitizes to a valid decimal
5
+ // string clamped to `decimals` fractional digits — pair with parseToken(value,
6
+ // decimals) for the BigInt. Neutral; style via .kit-amount.
7
+ export function TokenAmountInput({ value, onChange, decimals = 18, max, symbol, placeholder = "0.0", className }) {
8
+ const sanitize = (s) => {
9
+ let v = s.replace(/[^0-9.]/g, "");
10
+ const parts = v.split(".");
11
+ if (parts.length > 2)
12
+ v = parts[0] + "." + parts.slice(1).join("");
13
+ const [w, f] = v.split(".");
14
+ if (f !== undefined && f.length > decimals)
15
+ v = w + "." + f.slice(0, decimals);
16
+ return v;
17
+ };
18
+ return (_jsxs("div", { className: cx("kit-amount", className), children: [_jsx("input", { inputMode: "decimal", autoComplete: "off", spellCheck: false, placeholder: placeholder, value: value, onChange: (e) => onChange(sanitize(e.target.value)) }), symbol ? _jsx("span", { className: "kit-amount-sym", children: symbol }) : null, max !== undefined ? (_jsx("button", { type: "button", className: "kit-amount-max", onClick: () => onChange(max), children: "Max" })) : null] }));
19
+ }
@@ -0,0 +1,4 @@
1
+ export { Address, type AddressProps } from "./Address";
2
+ export { Balance, type BalanceProps } from "./Balance";
3
+ export { NetworkGuard, type NetworkGuardProps } from "./NetworkGuard";
4
+ export { TokenAmountInput, type TokenAmountInputProps } from "./TokenAmountInput";
@@ -0,0 +1,4 @@
1
+ export { Address } from "./Address";
2
+ export { Balance } from "./Balance";
3
+ export { NetworkGuard } from "./NetworkGuard";
4
+ export { TokenAmountInput } from "./TokenAmountInput";
@@ -0,0 +1,15 @@
1
+ /* Neutral defaults — override the variables / class hooks / [data-state] to restyle. */
2
+ .kit-addr{display:inline-flex;align-items:center;gap:6px;font:inherit;font-variant-numeric:tabular-nums}
3
+ .kit-addr-btn{display:inline-flex;align-items:center;justify-content:center;border:0;background:transparent;color:var(--kit-muted,#6b7280);cursor:pointer;padding:0;width:16px;height:16px;text-decoration:none}
4
+ .kit-addr-btn:hover{color:inherit}
5
+ .kit-balance{font:inherit;font-variant-numeric:tabular-nums}
6
+ .kit-net{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 14px;border:1px solid var(--kit-border,#e5e7eb);border-radius:10px;font:inherit;font-size:14px}
7
+ .kit-net button{border:0;background:var(--kit-accent,#111827);color:var(--kit-accent-fg,#fff);border-radius:8px;padding:6px 12px;font:inherit;font-weight:600;cursor:pointer}
8
+ .kit-net button:disabled{opacity:.6;cursor:default}
9
+ .kit-amount{display:flex;align-items:center;gap:8px;border:1px solid var(--kit-border,#e5e7eb);border-radius:10px;padding:8px 10px;font:inherit}
10
+ .kit-amount:focus-within{border-color:var(--kit-muted,#6b7280)}
11
+ .kit-amount input{flex:1;border:0;outline:0;background:transparent;color:inherit;font:inherit;font-size:16px;min-width:0}
12
+ .kit-amount-sym{color:var(--kit-muted,#6b7280);font-size:14px}
13
+ .kit-amount-max{border:0;background:transparent;color:var(--kit-muted,#6b7280);font:inherit;font-weight:600;font-size:12px;letter-spacing:.02em;text-transform:uppercase;cursor:pointer}
14
+ .kit-amount-max:hover{color:inherit}
15
+ @media (prefers-color-scheme:dark){.kit-net,.kit-amount{--kit-border:#2c2e36}}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@livo-build/kit",
3
+ "version": "0.1.0",
4
+ "description": "Livo frontend kit — reusable React + wagmi v3 building blocks (wallet connect modal, providers, hooks) for web3 apps built on Livo.",
5
+ "type": "module",
6
+ "license": "UNLICENSED",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./styles.css": "./dist/wallet/wallet.css"
15
+ },
16
+ "sideEffects": [
17
+ "**/*.css"
18
+ ],
19
+ "files": [
20
+ "dist",
21
+ "STYLING.md"
22
+ ],
23
+ "engines": {
24
+ "node": ">=18"
25
+ },
26
+ "keywords": [
27
+ "livo",
28
+ "web3",
29
+ "wagmi",
30
+ "react",
31
+ "wallet",
32
+ "connect"
33
+ ],
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/livo-projects/livo-mcp.git",
40
+ "directory": "packages/kit"
41
+ },
42
+ "scripts": {
43
+ "typecheck": "tsc -p tsconfig.json",
44
+ "build": "tsc -p tsconfig.build.json && node ./scripts/copy-css.mjs",
45
+ "test": "vitest run",
46
+ "prepublishOnly": "npm run build",
47
+ "clean": "rm -rf dist"
48
+ },
49
+ "peerDependencies": {
50
+ "@tanstack/react-query": "^5",
51
+ "react": "^18 || ^19",
52
+ "react-dom": "^18 || ^19",
53
+ "viem": "^2",
54
+ "wagmi": "^3"
55
+ },
56
+ "devDependencies": {
57
+ "@tanstack/react-query": "^5.56.0",
58
+ "@types/react": "^18.3.0",
59
+ "@types/react-dom": "^18.3.0",
60
+ "react": "^18.3.1",
61
+ "react-dom": "^18.3.1",
62
+ "typescript": "^5.7.0",
63
+ "viem": "^2.52.2",
64
+ "vitest": "^2.1.0",
65
+ "wagmi": "^3.0.0"
66
+ }
67
+ }