@cypher-zk/sdk 0.3.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.
@@ -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, f as PlaceBetInputs, R as ResolveMarketResult, g as ResolveMarketInputs, S as SubscribeOptions, h as CypherEvent } from '../client-hOLBWshA.js';
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 };
@@ -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
@@ -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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cypher-zk/sdk",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "TypeScript SDK for the Cypher prediction market (Arcium + Anchor on Solana)",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE",