@cypher-zk/sdk 0.4.0 → 0.5.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.
- package/README.md +252 -21
- package/dist/{client-hOLBWshA.d.ts → client-B0EueahJ.d.ts} +587 -21
- package/dist/{cypher-WAYH63ZA.json → cypher-M5PH6UM5.json} +440 -30
- package/dist/index.d.ts +23 -4
- package/dist/index.js +191 -12
- package/dist/index.js.map +1 -1
- package/dist/react/index.d.ts +6 -2
- package/dist/react/index.js +34 -1
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
- package/src/idl/cypher.json +440 -30
- package/src/idl/cypher.ts +440 -30
package/dist/react/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { ReactNode } from 'react';
|
|
2
|
-
import { C as CypherClient, G as GlobalStateAccount, M as MarketAccount, E as EncryptedPositionAccount, a as CancelMarketParams, b as ClaimResult, c as ClaimInputs, d as CreateMarketResult, e as CreateMarketParams, P as PlaceBetResult,
|
|
2
|
+
import { C as CypherClient, G as GlobalStateAccount, M as MarketAccount, E as EncryptedPositionAccount, R as ResolutionActionResult, A as AdminOverrideResolutionInputs, a as CancelMarketParams, b as ClaimResult, c as ClaimInputs, d as CreateMarketResult, e as CreateMarketParams, F as FinalizeResolutionInputs, f as FlagResolutionInputs, P as PlaceBetResult, g as PlaceBetInputs, h as ResolveMarketResult, i as ResolveMarketInputs, S as SubscribeOptions, j as CypherEvent } from '../client-B0EueahJ.js';
|
|
3
3
|
import * as _tanstack_react_query from '@tanstack/react-query';
|
|
4
4
|
import { UseQueryOptions, UseMutationOptions } from '@tanstack/react-query';
|
|
5
5
|
import { PublicKey } from '@solana/web3.js';
|
|
@@ -148,6 +148,10 @@ declare function useCancelMarket(opts?: Omit<UseMutationOptions<{
|
|
|
148
148
|
market: MarketAccount | null;
|
|
149
149
|
}, Error, CancelMarketInputs, unknown>;
|
|
150
150
|
|
|
151
|
+
declare function useFlagResolution(opts?: Omit<UseMutationOptions<ResolutionActionResult, Error, FlagResolutionInputs>, "mutationFn">): _tanstack_react_query.UseMutationResult<ResolutionActionResult, Error, FlagResolutionInputs, unknown>;
|
|
152
|
+
declare function useFinalizeResolution(opts?: Omit<UseMutationOptions<ResolutionActionResult, Error, FinalizeResolutionInputs>, "mutationFn">): _tanstack_react_query.UseMutationResult<ResolutionActionResult, Error, FinalizeResolutionInputs, unknown>;
|
|
153
|
+
declare function useAdminOverrideResolution(opts?: Omit<UseMutationOptions<ResolutionActionResult, Error, AdminOverrideResolutionInputs>, "mutationFn">): _tanstack_react_query.UseMutationResult<ResolutionActionResult, Error, AdminOverrideResolutionInputs, unknown>;
|
|
154
|
+
|
|
151
155
|
/**
|
|
152
156
|
* Subscribe to all Cypher events for the lifetime of the component.
|
|
153
157
|
* Returns the latest batch of events as an ever-growing array (newest
|
|
@@ -161,4 +165,4 @@ declare function useCancelMarket(opts?: Omit<UseMutationOptions<{
|
|
|
161
165
|
*/
|
|
162
166
|
declare function useMarketEvents(opts?: SubscribeOptions): CypherEvent[];
|
|
163
167
|
|
|
164
|
-
export { CypherProvider, type CypherProviderProps, type UseMarketsFilter, globalStateKeys, marketKeys, positionKeys, useCancelMarket, useClaimPayout, useClaimRefund, useCreateMarket, useCypherClient, useGlobalState, useMarket, useMarketEvents, useMarkets, usePlaceBet, useResolveMarket, useUserPositions };
|
|
168
|
+
export { CypherProvider, type CypherProviderProps, type UseMarketsFilter, globalStateKeys, marketKeys, positionKeys, useAdminOverrideResolution, useCancelMarket, useClaimPayout, useClaimRefund, useCreateMarket, useCypherClient, useFinalizeResolution, useFlagResolution, useGlobalState, useMarket, useMarketEvents, useMarkets, usePlaceBet, useResolveMarket, useUserPositions };
|
package/dist/react/index.js
CHANGED
|
@@ -142,6 +142,39 @@ function useCancelMarket(opts) {
|
|
|
142
142
|
...opts
|
|
143
143
|
});
|
|
144
144
|
}
|
|
145
|
+
function useFlagResolution(opts) {
|
|
146
|
+
const client = useCypherClient();
|
|
147
|
+
const qc = useQueryClient();
|
|
148
|
+
return useMutation({
|
|
149
|
+
mutationFn: (inputs) => client.actions.flagResolution(inputs),
|
|
150
|
+
onSuccess: (_data, vars) => {
|
|
151
|
+
qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });
|
|
152
|
+
},
|
|
153
|
+
...opts
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
function useFinalizeResolution(opts) {
|
|
157
|
+
const client = useCypherClient();
|
|
158
|
+
const qc = useQueryClient();
|
|
159
|
+
return useMutation({
|
|
160
|
+
mutationFn: (inputs) => client.actions.finalizeResolution(inputs),
|
|
161
|
+
onSuccess: (_data, vars) => {
|
|
162
|
+
qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });
|
|
163
|
+
},
|
|
164
|
+
...opts
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
function useAdminOverrideResolution(opts) {
|
|
168
|
+
const client = useCypherClient();
|
|
169
|
+
const qc = useQueryClient();
|
|
170
|
+
return useMutation({
|
|
171
|
+
mutationFn: (inputs) => client.actions.adminOverrideResolution(inputs),
|
|
172
|
+
onSuccess: (_data, vars) => {
|
|
173
|
+
qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });
|
|
174
|
+
},
|
|
175
|
+
...opts
|
|
176
|
+
});
|
|
177
|
+
}
|
|
145
178
|
function useMarketEvents(opts) {
|
|
146
179
|
const client = useCypherClient();
|
|
147
180
|
const [events, setEvents] = useState([]);
|
|
@@ -158,6 +191,6 @@ function useMarketEvents(opts) {
|
|
|
158
191
|
return events;
|
|
159
192
|
}
|
|
160
193
|
|
|
161
|
-
export { CypherProvider, globalStateKeys, marketKeys, positionKeys, useCancelMarket, useClaimPayout, useClaimRefund, useCreateMarket, useCypherClient, useGlobalState, useMarket, useMarketEvents, useMarkets, usePlaceBet, useResolveMarket, useUserPositions };
|
|
194
|
+
export { CypherProvider, globalStateKeys, marketKeys, positionKeys, useAdminOverrideResolution, useCancelMarket, useClaimPayout, useClaimRefund, useCreateMarket, useCypherClient, useFinalizeResolution, useFlagResolution, useGlobalState, useMarket, useMarketEvents, useMarkets, usePlaceBet, useResolveMarket, useUserPositions };
|
|
162
195
|
//# sourceMappingURL=index.js.map
|
|
163
196
|
//# sourceMappingURL=index.js.map
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../react/src/CypherProvider.tsx","../../react/src/useGlobalState.ts","../../react/src/useMarket.ts","../../react/src/useUserPositions.ts","../../react/src/mutations.ts","../../react/src/useMarketEvents.ts"],"names":["useQuery"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\n\nimport React, { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { CypherClient } from \"../../src/client.ts\";\n\n/* -----------------------------------------------------------------------\n * Context\n * ----------------------------------------------------------------------- */\n\ninterface CypherContextValue {\n client: CypherClient;\n}\n\nconst CypherContext = createContext<CypherContextValue | null>(null);\n\n/* -----------------------------------------------------------------------\n * Provider\n * ----------------------------------------------------------------------- */\n\nexport interface CypherProviderProps {\n /**\n * A fully-constructed `CypherClient`. The provider does NOT manage\n * lifecycle — the host app creates the client (with its own connection\n * + wallet) and passes it in.\n */\n client: CypherClient;\n children: ReactNode;\n}\n\n/**\n * Provides a `CypherClient` instance to the React tree. All SDK hooks\n * read from this context — mount exactly one `<CypherProvider>` at the\n * top of your app (or the feature subtree that needs it).\n *\n * @example\n * ```tsx\n * import { CypherClient } from \"@cypher/sdk\";\n * import { CypherProvider } from \"@cypher/sdk/react\";\n *\n * const client = new CypherClient({ connection, wallet, cluster: \"devnet\" });\n *\n * function App() {\n * return (\n * <CypherProvider client={client}>\n * <MarketList />\n * </CypherProvider>\n * );\n * }\n * ```\n */\nexport function CypherProvider({ client, children }: CypherProviderProps) {\n const value = useMemo<CypherContextValue>(() => ({ client }), [client]);\n return React.createElement(CypherContext.Provider, { value }, children);\n}\n\n/* -----------------------------------------------------------------------\n * Hook\n * ----------------------------------------------------------------------- */\n\n/**\n * Returns the `CypherClient` from the nearest `<CypherProvider>`.\n * Throws if called outside the provider tree.\n */\nexport function useCypherClient(): CypherClient {\n const ctx = useContext(CypherContext);\n if (!ctx) {\n throw new Error(\n \"useCypherClient must be used within a <CypherProvider>. \" +\n \"Wrap your component tree with <CypherProvider client={client}>.\",\n );\n }\n return ctx.client;\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { useCypherClient } from \"./CypherProvider.tsx\";\nimport type { GlobalStateAccount } from \"../../src/accounts/globalState.ts\";\n\n/** Query key factory — keeps cache keys stable across the app. */\nexport const globalStateKeys = {\n all: [\"cypher\", \"globalState\"] as const,\n};\n\n/**\n * Fetches the on-chain `GlobalState` singleton (protocol fees, admin,\n * accepted mint, market counter). Automatically cached via React Query.\n *\n * @example\n * ```tsx\n * const { data: gs, isLoading } = useGlobalState();\n * if (gs) console.log(\"Fee rate:\", gs.protocolFeeRate);\n * ```\n */\nexport function useGlobalState(\n opts?: Omit<\n UseQueryOptions<GlobalStateAccount, Error>,\n \"queryKey\" | \"queryFn\"\n >,\n) {\n const client = useCypherClient();\n return useQuery<GlobalStateAccount, Error>({\n queryKey: globalStateKeys.all,\n queryFn: () => client.globalState.fetch({ refresh: true }),\n staleTime: 30_000, // 30s — global state changes rarely\n ...opts,\n });\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { PublicKey } from \"@solana/web3.js\";\nimport { useCypherClient } from \"./CypherProvider.tsx\";\nimport type { MarketAccount } from \"../../src/accounts/market.ts\";\n\nexport const marketKeys = {\n all: [\"cypher\", \"market\"] as const,\n one: (id: bigint | number) => [\"cypher\", \"market\", String(id)] as const,\n byCreator: (creator: PublicKey) =>\n [\"cypher\", \"market\", \"creator\", creator.toBase58()] as const,\n byState: (state: number) =>\n [\"cypher\", \"market\", \"state\", state] as const,\n};\n\n/**\n * Fetch a single market by its numeric `marketId`.\n *\n * @example\n * ```tsx\n * const { data: market } = useMarket(42n);\n * ```\n */\nexport function useMarket(\n marketId: bigint | number,\n opts?: Omit<\n UseQueryOptions<MarketAccount | null, Error>,\n \"queryKey\" | \"queryFn\"\n >,\n) {\n const client = useCypherClient();\n return useQuery<MarketAccount | null, Error>({\n queryKey: marketKeys.one(marketId),\n queryFn: () => client.markets.fetch(marketId),\n staleTime: 10_000,\n ...opts,\n });\n}\n\nexport interface UseMarketsFilter {\n creator?: PublicKey;\n state?: number;\n}\n\n/**\n * Fetch multiple markets, optionally filtered by creator or state.\n * With no filter, fetches **all** markets (expensive on large deployments).\n *\n * @example\n * ```tsx\n * const { data: active } = useMarkets({ state: MarketState.Active });\n * ```\n */\nexport function useMarkets(\n filter?: UseMarketsFilter,\n opts?: Omit<\n UseQueryOptions<\n Array<{ publicKey: PublicKey; account: MarketAccount }>,\n Error\n >,\n \"queryKey\" | \"queryFn\"\n >,\n) {\n const client = useCypherClient();\n\n const queryKey = filter?.creator\n ? marketKeys.byCreator(filter.creator)\n : filter?.state !== undefined\n ? marketKeys.byState(filter.state)\n : marketKeys.all;\n\n const queryFn = () => {\n if (filter?.creator) return client.markets.byCreator(filter.creator);\n if (filter?.state !== undefined) return client.markets.byState(filter.state);\n return client.markets.all();\n };\n\n return useQuery({\n queryKey,\n queryFn,\n staleTime: 10_000,\n ...opts,\n });\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { PublicKey } from \"@solana/web3.js\";\nimport { useCypherClient } from \"./CypherProvider.tsx\";\nimport type { EncryptedPositionAccount } from \"../../src/accounts/position.ts\";\n\nexport const positionKeys = {\n byUser: (user: PublicKey) =>\n [\"cypher\", \"position\", \"user\", user.toBase58()] as const,\n forMarket: (market: PublicKey) =>\n [\"cypher\", \"position\", \"market\", market.toBase58()] as const,\n};\n\n/**\n * Fetch all positions for a given user across all markets.\n *\n * @example\n * ```tsx\n * const { data: positions } = useUserPositions(wallet.publicKey);\n * ```\n */\nexport function useUserPositions(\n user: PublicKey,\n opts?: Omit<\n UseQueryOptions<\n Array<{ publicKey: PublicKey; account: EncryptedPositionAccount }>,\n Error\n >,\n \"queryKey\" | \"queryFn\"\n >,\n) {\n const client = useCypherClient();\n return useQuery({\n queryKey: positionKeys.byUser(user),\n queryFn: () => client.positions.byUser(user),\n staleTime: 5_000,\n ...opts,\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient, type UseMutationOptions } from \"@tanstack/react-query\";\nimport { useCypherClient } from \"./CypherProvider.tsx\";\nimport { marketKeys } from \"./useMarket.ts\";\nimport { positionKeys } from \"./useUserPositions.ts\";\nimport type { PlaceBetInputs, PlaceBetResult } from \"../../src/actions/placeBet.ts\";\nimport type { ResolveMarketInputs, ResolveMarketResult } from \"../../src/actions/resolveMarket.ts\";\nimport type { ClaimInputs, ClaimResult } from \"../../src/actions/claim.ts\";\nimport type { CreateMarketResult } from \"../../src/actions/createMarket.ts\";\nimport type {\n CreateMarketParams,\n CancelMarketParams,\n} from \"../../src/instructions/market.ts\";\nimport type { PublicKey } from \"@solana/web3.js\";\nimport type { MarketAccount } from \"../../src/accounts/market.ts\";\n\n/* -----------------------------------------------------------------------\n * usePlaceBet\n * ----------------------------------------------------------------------- */\n\n/**\n * Mutation hook for the end-to-end `placeBet` action: encrypt → send →\n * await callback → refetch position. Invalidates the market + position\n * queries on success.\n *\n * @example\n * ```tsx\n * const { mutateAsync: placeBet, isPending } = usePlaceBet();\n * await placeBet({ payer: wallet.publicKey, user: wallet.publicKey, marketId: 1n, side: 0, amountUsdc: 5_000_000n });\n * ```\n */\nexport function usePlaceBet(\n opts?: Omit<UseMutationOptions<PlaceBetResult, Error, PlaceBetInputs>, \"mutationFn\">,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation<PlaceBetResult, Error, PlaceBetInputs>({\n mutationFn: (inputs) => client.actions.placeBet(inputs),\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });\n qc.invalidateQueries({ queryKey: positionKeys.byUser(vars.user) });\n },\n ...opts,\n });\n}\n\n/* -----------------------------------------------------------------------\n * useResolveMarket\n * ----------------------------------------------------------------------- */\n\nexport function useResolveMarket(\n opts?: Omit<UseMutationOptions<ResolveMarketResult, Error, ResolveMarketInputs>, \"mutationFn\">,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation<ResolveMarketResult, Error, ResolveMarketInputs>({\n mutationFn: (inputs) => client.actions.resolveMarket(inputs),\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });\n },\n ...opts,\n });\n}\n\n/* -----------------------------------------------------------------------\n * useClaimPayout\n * ----------------------------------------------------------------------- */\n\nexport function useClaimPayout(\n opts?: Omit<UseMutationOptions<ClaimResult, Error, ClaimInputs>, \"mutationFn\">,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation<ClaimResult, Error, ClaimInputs>({\n mutationFn: (inputs) => client.actions.claimPayout(inputs),\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });\n qc.invalidateQueries({ queryKey: positionKeys.byUser(vars.user) });\n },\n ...opts,\n });\n}\n\n/* -----------------------------------------------------------------------\n * useClaimRefund\n * ----------------------------------------------------------------------- */\n\nexport function useClaimRefund(\n opts?: Omit<UseMutationOptions<ClaimResult, Error, ClaimInputs>, \"mutationFn\">,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation<ClaimResult, Error, ClaimInputs>({\n mutationFn: (inputs) => client.actions.claimRefund(inputs),\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });\n qc.invalidateQueries({ queryKey: positionKeys.byUser(vars.user) });\n },\n ...opts,\n });\n}\n\n/* -----------------------------------------------------------------------\n * useCreateMarket\n * ----------------------------------------------------------------------- */\n\ntype CreateMarketInputs = Omit<CreateMarketParams, \"expectedMarketId\" | \"acceptedMint\"> & {\n acceptedMint?: PublicKey;\n};\n\nexport function useCreateMarket(\n opts?: Omit<UseMutationOptions<CreateMarketResult, Error, CreateMarketInputs>, \"mutationFn\">,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation<CreateMarketResult, Error, CreateMarketInputs>({\n mutationFn: (inputs) => client.actions.createMarket(inputs),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: marketKeys.all });\n },\n ...opts,\n });\n}\n\n/* -----------------------------------------------------------------------\n * useCancelMarket\n * ----------------------------------------------------------------------- */\n\ntype CancelMarketInputs = Omit<CancelMarketParams, \"acceptedMint\"> & {\n acceptedMint?: PublicKey;\n};\n\nexport function useCancelMarket(\n opts?: Omit<\n UseMutationOptions<{ signature: string; market: MarketAccount | null }, Error, CancelMarketInputs>,\n \"mutationFn\"\n >,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (inputs: CancelMarketInputs) => client.actions.cancelMarket(inputs),\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });\n qc.invalidateQueries({ queryKey: marketKeys.all });\n },\n ...opts,\n });\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { useCypherClient } from \"./CypherProvider.tsx\";\nimport type { CypherEvent } from \"../../src/events/parser.ts\";\nimport type { EventSubscription, SubscribeOptions } from \"../../src/events/subscribe.ts\";\n\n/**\n * Subscribe to all Cypher events for the lifetime of the component.\n * Returns the latest batch of events as an ever-growing array (newest\n * last). Clear the buffer by re-mounting the component.\n *\n * @example\n * ```tsx\n * const events = useMarketEvents();\n * // events: CypherEvent[]\n * ```\n */\nexport function useMarketEvents(opts?: SubscribeOptions): CypherEvent[] {\n const client = useCypherClient();\n const [events, setEvents] = useState<CypherEvent[]>([]);\n const subRef = useRef<EventSubscription | null>(null);\n\n useEffect(() => {\n subRef.current = client.events.subscribeAll((event) => {\n setEvents((prev) => [...prev, event]);\n }, opts);\n return () => {\n subRef.current?.unsubscribe();\n subRef.current = null;\n };\n // Re-subscribe when the client identity changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client]);\n\n return events;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../react/src/CypherProvider.tsx","../../react/src/useGlobalState.ts","../../react/src/useMarket.ts","../../react/src/useUserPositions.ts","../../react/src/mutations.ts","../../react/src/useMarketEvents.ts"],"names":["useQuery"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\n\nimport React, { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { CypherClient } from \"../../src/client.ts\";\n\n/* -----------------------------------------------------------------------\n * Context\n * ----------------------------------------------------------------------- */\n\ninterface CypherContextValue {\n client: CypherClient;\n}\n\nconst CypherContext = createContext<CypherContextValue | null>(null);\n\n/* -----------------------------------------------------------------------\n * Provider\n * ----------------------------------------------------------------------- */\n\nexport interface CypherProviderProps {\n /**\n * A fully-constructed `CypherClient`. The provider does NOT manage\n * lifecycle — the host app creates the client (with its own connection\n * + wallet) and passes it in.\n */\n client: CypherClient;\n children: ReactNode;\n}\n\n/**\n * Provides a `CypherClient` instance to the React tree. All SDK hooks\n * read from this context — mount exactly one `<CypherProvider>` at the\n * top of your app (or the feature subtree that needs it).\n *\n * @example\n * ```tsx\n * import { CypherClient } from \"@cypher/sdk\";\n * import { CypherProvider } from \"@cypher/sdk/react\";\n *\n * const client = new CypherClient({ connection, wallet, cluster: \"devnet\" });\n *\n * function App() {\n * return (\n * <CypherProvider client={client}>\n * <MarketList />\n * </CypherProvider>\n * );\n * }\n * ```\n */\nexport function CypherProvider({ client, children }: CypherProviderProps) {\n const value = useMemo<CypherContextValue>(() => ({ client }), [client]);\n return React.createElement(CypherContext.Provider, { value }, children);\n}\n\n/* -----------------------------------------------------------------------\n * Hook\n * ----------------------------------------------------------------------- */\n\n/**\n * Returns the `CypherClient` from the nearest `<CypherProvider>`.\n * Throws if called outside the provider tree.\n */\nexport function useCypherClient(): CypherClient {\n const ctx = useContext(CypherContext);\n if (!ctx) {\n throw new Error(\n \"useCypherClient must be used within a <CypherProvider>. \" +\n \"Wrap your component tree with <CypherProvider client={client}>.\",\n );\n }\n return ctx.client;\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { useCypherClient } from \"./CypherProvider.tsx\";\nimport type { GlobalStateAccount } from \"../../src/accounts/globalState.ts\";\n\n/** Query key factory — keeps cache keys stable across the app. */\nexport const globalStateKeys = {\n all: [\"cypher\", \"globalState\"] as const,\n};\n\n/**\n * Fetches the on-chain `GlobalState` singleton (protocol fees, admin,\n * accepted mint, market counter). Automatically cached via React Query.\n *\n * @example\n * ```tsx\n * const { data: gs, isLoading } = useGlobalState();\n * if (gs) console.log(\"Fee rate:\", gs.protocolFeeRate);\n * ```\n */\nexport function useGlobalState(\n opts?: Omit<\n UseQueryOptions<GlobalStateAccount, Error>,\n \"queryKey\" | \"queryFn\"\n >,\n) {\n const client = useCypherClient();\n return useQuery<GlobalStateAccount, Error>({\n queryKey: globalStateKeys.all,\n queryFn: () => client.globalState.fetch({ refresh: true }),\n staleTime: 30_000, // 30s — global state changes rarely\n ...opts,\n });\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { PublicKey } from \"@solana/web3.js\";\nimport { useCypherClient } from \"./CypherProvider.tsx\";\nimport type { MarketAccount } from \"../../src/accounts/market.ts\";\n\nexport const marketKeys = {\n all: [\"cypher\", \"market\"] as const,\n one: (id: bigint | number) => [\"cypher\", \"market\", String(id)] as const,\n byCreator: (creator: PublicKey) =>\n [\"cypher\", \"market\", \"creator\", creator.toBase58()] as const,\n byState: (state: number) =>\n [\"cypher\", \"market\", \"state\", state] as const,\n};\n\n/**\n * Fetch a single market by its numeric `marketId`.\n *\n * @example\n * ```tsx\n * const { data: market } = useMarket(42n);\n * ```\n */\nexport function useMarket(\n marketId: bigint | number,\n opts?: Omit<\n UseQueryOptions<MarketAccount | null, Error>,\n \"queryKey\" | \"queryFn\"\n >,\n) {\n const client = useCypherClient();\n return useQuery<MarketAccount | null, Error>({\n queryKey: marketKeys.one(marketId),\n queryFn: () => client.markets.fetch(marketId),\n staleTime: 10_000,\n ...opts,\n });\n}\n\nexport interface UseMarketsFilter {\n creator?: PublicKey;\n state?: number;\n}\n\n/**\n * Fetch multiple markets, optionally filtered by creator or state.\n * With no filter, fetches **all** markets (expensive on large deployments).\n *\n * @example\n * ```tsx\n * const { data: active } = useMarkets({ state: MarketState.Active });\n * ```\n */\nexport function useMarkets(\n filter?: UseMarketsFilter,\n opts?: Omit<\n UseQueryOptions<\n Array<{ publicKey: PublicKey; account: MarketAccount }>,\n Error\n >,\n \"queryKey\" | \"queryFn\"\n >,\n) {\n const client = useCypherClient();\n\n const queryKey = filter?.creator\n ? marketKeys.byCreator(filter.creator)\n : filter?.state !== undefined\n ? marketKeys.byState(filter.state)\n : marketKeys.all;\n\n const queryFn = () => {\n if (filter?.creator) return client.markets.byCreator(filter.creator);\n if (filter?.state !== undefined) return client.markets.byState(filter.state);\n return client.markets.all();\n };\n\n return useQuery({\n queryKey,\n queryFn,\n staleTime: 10_000,\n ...opts,\n });\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { PublicKey } from \"@solana/web3.js\";\nimport { useCypherClient } from \"./CypherProvider.tsx\";\nimport type { EncryptedPositionAccount } from \"../../src/accounts/position.ts\";\n\nexport const positionKeys = {\n byUser: (user: PublicKey) =>\n [\"cypher\", \"position\", \"user\", user.toBase58()] as const,\n forMarket: (market: PublicKey) =>\n [\"cypher\", \"position\", \"market\", market.toBase58()] as const,\n};\n\n/**\n * Fetch all positions for a given user across all markets.\n *\n * @example\n * ```tsx\n * const { data: positions } = useUserPositions(wallet.publicKey);\n * ```\n */\nexport function useUserPositions(\n user: PublicKey,\n opts?: Omit<\n UseQueryOptions<\n Array<{ publicKey: PublicKey; account: EncryptedPositionAccount }>,\n Error\n >,\n \"queryKey\" | \"queryFn\"\n >,\n) {\n const client = useCypherClient();\n return useQuery({\n queryKey: positionKeys.byUser(user),\n queryFn: () => client.positions.byUser(user),\n staleTime: 5_000,\n ...opts,\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient, type UseMutationOptions } from \"@tanstack/react-query\";\nimport { useCypherClient } from \"./CypherProvider.tsx\";\nimport { marketKeys } from \"./useMarket.ts\";\nimport { positionKeys } from \"./useUserPositions.ts\";\nimport type { PlaceBetInputs, PlaceBetResult } from \"../../src/actions/placeBet.ts\";\nimport type { ResolveMarketInputs, ResolveMarketResult } from \"../../src/actions/resolveMarket.ts\";\nimport type { ClaimInputs, ClaimResult } from \"../../src/actions/claim.ts\";\nimport type { CreateMarketResult } from \"../../src/actions/createMarket.ts\";\nimport type {\n CreateMarketParams,\n CancelMarketParams,\n} from \"../../src/instructions/market.ts\";\nimport type { PublicKey } from \"@solana/web3.js\";\nimport type { MarketAccount } from \"../../src/accounts/market.ts\";\n\n/* -----------------------------------------------------------------------\n * usePlaceBet\n * ----------------------------------------------------------------------- */\n\n/**\n * Mutation hook for the end-to-end `placeBet` action: encrypt → send →\n * await callback → refetch position. Invalidates the market + position\n * queries on success.\n *\n * @example\n * ```tsx\n * const { mutateAsync: placeBet, isPending } = usePlaceBet();\n * await placeBet({ payer: wallet.publicKey, user: wallet.publicKey, marketId: 1n, side: 0, amountUsdc: 5_000_000n });\n * ```\n */\nexport function usePlaceBet(\n opts?: Omit<UseMutationOptions<PlaceBetResult, Error, PlaceBetInputs>, \"mutationFn\">,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation<PlaceBetResult, Error, PlaceBetInputs>({\n mutationFn: (inputs) => client.actions.placeBet(inputs),\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });\n qc.invalidateQueries({ queryKey: positionKeys.byUser(vars.user) });\n },\n ...opts,\n });\n}\n\n/* -----------------------------------------------------------------------\n * useResolveMarket\n * ----------------------------------------------------------------------- */\n\nexport function useResolveMarket(\n opts?: Omit<UseMutationOptions<ResolveMarketResult, Error, ResolveMarketInputs>, \"mutationFn\">,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation<ResolveMarketResult, Error, ResolveMarketInputs>({\n mutationFn: (inputs) => client.actions.resolveMarket(inputs),\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });\n },\n ...opts,\n });\n}\n\n/* -----------------------------------------------------------------------\n * useClaimPayout\n * ----------------------------------------------------------------------- */\n\nexport function useClaimPayout(\n opts?: Omit<UseMutationOptions<ClaimResult, Error, ClaimInputs>, \"mutationFn\">,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation<ClaimResult, Error, ClaimInputs>({\n mutationFn: (inputs) => client.actions.claimPayout(inputs),\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });\n qc.invalidateQueries({ queryKey: positionKeys.byUser(vars.user) });\n },\n ...opts,\n });\n}\n\n/* -----------------------------------------------------------------------\n * useClaimRefund\n * ----------------------------------------------------------------------- */\n\nexport function useClaimRefund(\n opts?: Omit<UseMutationOptions<ClaimResult, Error, ClaimInputs>, \"mutationFn\">,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation<ClaimResult, Error, ClaimInputs>({\n mutationFn: (inputs) => client.actions.claimRefund(inputs),\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });\n qc.invalidateQueries({ queryKey: positionKeys.byUser(vars.user) });\n },\n ...opts,\n });\n}\n\n/* -----------------------------------------------------------------------\n * useCreateMarket\n * ----------------------------------------------------------------------- */\n\ntype CreateMarketInputs = Omit<CreateMarketParams, \"expectedMarketId\" | \"acceptedMint\"> & {\n acceptedMint?: PublicKey;\n};\n\nexport function useCreateMarket(\n opts?: Omit<UseMutationOptions<CreateMarketResult, Error, CreateMarketInputs>, \"mutationFn\">,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation<CreateMarketResult, Error, CreateMarketInputs>({\n mutationFn: (inputs) => client.actions.createMarket(inputs),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: marketKeys.all });\n },\n ...opts,\n });\n}\n\n/* -----------------------------------------------------------------------\n * useCancelMarket\n * ----------------------------------------------------------------------- */\n\ntype CancelMarketInputs = Omit<CancelMarketParams, \"acceptedMint\"> & {\n acceptedMint?: PublicKey;\n};\n\nexport function useCancelMarket(\n opts?: Omit<\n UseMutationOptions<{ signature: string; market: MarketAccount | null }, Error, CancelMarketInputs>,\n \"mutationFn\"\n >,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (inputs: CancelMarketInputs) => client.actions.cancelMarket(inputs),\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });\n qc.invalidateQueries({ queryKey: marketKeys.all });\n },\n ...opts,\n });\n}\n\n/* -----------------------------------------------------------------------\n * Dispute / challenge window mutation hooks (v0.2+)\n * ----------------------------------------------------------------------- */\n\nimport type {\n FlagResolutionInputs,\n FinalizeResolutionInputs,\n AdminOverrideResolutionInputs,\n ResolutionActionResult,\n} from \"../../src/actions/resolution.ts\";\n\nexport function useFlagResolution(\n opts?: Omit<\n UseMutationOptions<ResolutionActionResult, Error, FlagResolutionInputs>,\n \"mutationFn\"\n >,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation<ResolutionActionResult, Error, FlagResolutionInputs>({\n mutationFn: (inputs) => client.actions.flagResolution(inputs),\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });\n },\n ...opts,\n });\n}\n\nexport function useFinalizeResolution(\n opts?: Omit<\n UseMutationOptions<ResolutionActionResult, Error, FinalizeResolutionInputs>,\n \"mutationFn\"\n >,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation<ResolutionActionResult, Error, FinalizeResolutionInputs>({\n mutationFn: (inputs) => client.actions.finalizeResolution(inputs),\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });\n },\n ...opts,\n });\n}\n\nexport function useAdminOverrideResolution(\n opts?: Omit<\n UseMutationOptions<ResolutionActionResult, Error, AdminOverrideResolutionInputs>,\n \"mutationFn\"\n >,\n) {\n const client = useCypherClient();\n const qc = useQueryClient();\n return useMutation<ResolutionActionResult, Error, AdminOverrideResolutionInputs>({\n mutationFn: (inputs) => client.actions.adminOverrideResolution(inputs),\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: marketKeys.one(vars.marketId) });\n },\n ...opts,\n });\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { useCypherClient } from \"./CypherProvider.tsx\";\nimport type { CypherEvent } from \"../../src/events/parser.ts\";\nimport type { EventSubscription, SubscribeOptions } from \"../../src/events/subscribe.ts\";\n\n/**\n * Subscribe to all Cypher events for the lifetime of the component.\n * Returns the latest batch of events as an ever-growing array (newest\n * last). Clear the buffer by re-mounting the component.\n *\n * @example\n * ```tsx\n * const events = useMarketEvents();\n * // events: CypherEvent[]\n * ```\n */\nexport function useMarketEvents(opts?: SubscribeOptions): CypherEvent[] {\n const client = useCypherClient();\n const [events, setEvents] = useState<CypherEvent[]>([]);\n const subRef = useRef<EventSubscription | null>(null);\n\n useEffect(() => {\n subRef.current = client.events.subscribeAll((event) => {\n setEvents((prev) => [...prev, event]);\n }, opts);\n return () => {\n subRef.current?.unsubscribe();\n subRef.current = null;\n };\n // Re-subscribe when the client identity changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client]);\n\n return events;\n}\n"]}
|