@0xslots/sdk 0.10.1 → 0.11.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.
@@ -4292,6 +4292,7 @@ interface CreateSlotsParams extends CreateSlotParams {
4292
4292
  }
4293
4293
  interface BuyParams {
4294
4294
  slot: Address;
4295
+ account: Address;
4295
4296
  depositAmount: bigint;
4296
4297
  selfAssessedPrice: bigint;
4297
4298
  }
@@ -4327,7 +4328,6 @@ declare class SlotsClient {
4327
4328
  private readonly _publicClient?;
4328
4329
  private readonly walletClient?;
4329
4330
  private readonly _factory?;
4330
- private _atomicSupport;
4331
4331
  /** Module namespaces for protocol extensions. */
4332
4332
  readonly modules: {
4333
4333
  metadata: MetadataModuleClient;
@@ -4465,7 +4465,8 @@ declare class SlotsClient {
4465
4465
  */
4466
4466
  selfAssess(slot: Address, newPrice: bigint): Promise<Hash>;
4467
4467
  /**
4468
- * Top up deposit on a slot (occupant only). Handles ERC-20 approval automatically.
4468
+ * Top up deposit on a slot. Anyone can pay to extend the occupant's deposit.
4469
+ * Handles ERC-20 approval automatically.
4469
4470
  * @param slot - The slot contract address.
4470
4471
  * @param amount - The amount to deposit (must be > 0).
4471
4472
  * @returns Transaction hash.
@@ -4537,16 +4538,13 @@ declare class SlotsClient {
4537
4538
  functionName: string;
4538
4539
  args?: any[];
4539
4540
  }[]): Promise<Hash>;
4540
- /** Check if wallet supports atomic batch calls (EIP-5792). */
4541
- private supportsAtomicBatch;
4542
- /** Poll EIP-5792 getCallsStatus until the batch settles, then return a tx hash. */
4543
- private pollBatchReceipt;
4544
4541
  /**
4545
- * Execute a contract call that needs ERC-20 allowance.
4546
- * If wallet supports atomic batch (EIP-5792): sends approve + action as one atomic call.
4547
- * Otherwise: chains approve tx (if needed) then action tx.
4542
+ * Approve confirm on-chain execute call sequentially.
4543
+ * Skips approval if the existing allowance already covers the amount.
4548
4544
  */
4549
4545
  private withAllowance;
4546
+ /** Poll `check` every `delayMs` until it returns a truthy value or `maxAttempts` is exhausted. */
4547
+ private pollUntil;
4550
4548
  }
4551
4549
  declare function createSlotsClient(config: SlotsClientConfig): SlotsClient;
4552
4550
 
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as SlotsChain } from './client-BcIWQW9H.js';
2
- export { A as Account, a as AccountFieldsFragment, b as AccountFieldsFragmentDoc, c as AccountSlotsAsOccupantArgs, d as AccountSlotsAsRecipientArgs, e as AccountType, f as Account_Filter, g as Account_OrderBy, h as Aggregation_Current, i as Aggregation_Interval, B as BlockChangedFilter, j as Block_Height, k as BoughtEvent, l as BoughtEvent_Filter, m as BoughtEvent_OrderBy, n as BuyParams, C as CreateSlotParams, o as CreateSlotsParams, p as Currency, q as CurrencyFieldsFragment, r as CurrencyFieldsFragmentDoc, s as Currency_Filter, t as Currency_OrderBy, D as DepositedEvent, u as DepositedEvent_Filter, v as DepositedEvent_OrderBy, E as Exact, F as Factory, w as FactoryModulesArgs, x as Factory_Filter, y as Factory_OrderBy, G as GetAccountDocument, z as GetAccountQuery, H as GetAccountQueryVariables, I as GetAccountsDocument, J as GetAccountsQuery, K as GetAccountsQueryVariables, L as GetBoughtEventsDocument, M as GetBoughtEventsQuery, N as GetBoughtEventsQueryVariables, O as GetDepositedEventsDocument, P as GetDepositedEventsQuery, Q as GetDepositedEventsQueryVariables, R as GetFactoryDocument, T as GetFactoryQuery, U as GetFactoryQueryVariables, V as GetLiquidatedEventsDocument, W as GetLiquidatedEventsQuery, X as GetLiquidatedEventsQueryVariables, Y as GetMetadataSlotDocument, Z as GetMetadataSlotQuery, _ as GetMetadataSlotQueryVariables, $ as GetMetadataSlotsByRecipientDocument, a0 as GetMetadataSlotsByRecipientQuery, a1 as GetMetadataSlotsByRecipientQueryVariables, a2 as GetMetadataSlotsDocument, a3 as GetMetadataSlotsQuery, a4 as GetMetadataSlotsQueryVariables, a5 as GetMetadataUpdatedEventsDocument, a6 as GetMetadataUpdatedEventsQuery, a7 as GetMetadataUpdatedEventsQueryVariables, a8 as GetModulesDocument, a9 as GetModulesQuery, aa as GetModulesQueryVariables, ab as GetPriceUpdatedEventsDocument, ac as GetPriceUpdatedEventsQuery, ad as GetPriceUpdatedEventsQueryVariables, ae as GetRecentEventsDocument, af as GetRecentEventsQuery, ag as GetRecentEventsQueryVariables, ah as GetReleasedEventsDocument, ai as GetReleasedEventsQuery, aj as GetReleasedEventsQueryVariables, ak as GetSettledEventsDocument, al as GetSettledEventsQuery, am as GetSettledEventsQueryVariables, an as GetSlotActivityDocument, ao as GetSlotActivityQuery, ap as GetSlotActivityQueryVariables, aq as GetSlotDeployedEventsDocument, ar as GetSlotDeployedEventsQuery, as as GetSlotDeployedEventsQueryVariables, at as GetSlotDocument, au as GetSlotQuery, av as GetSlotQueryVariables, aw as GetSlotsByOccupantDocument, ax as GetSlotsByOccupantQuery, ay as GetSlotsByOccupantQueryVariables, az as GetSlotsByRecipientDocument, aA as GetSlotsByRecipientQuery, aB as GetSlotsByRecipientQueryVariables, aC as GetSlotsDocument, aD as GetSlotsQuery, aE as GetSlotsQueryVariables, aF as GetTaxCollectedEventsDocument, aG as GetTaxCollectedEventsQuery, aH as GetTaxCollectedEventsQueryVariables, aI as GetWithdrawnEventsDocument, aJ as GetWithdrawnEventsQuery, aK as GetWithdrawnEventsQueryVariables, aL as Incremental, aM as InputMaybe, aN as LiquidatedEvent, aO as LiquidatedEvent_Filter, aP as LiquidatedEvent_OrderBy, aQ as MakeEmpty, aR as MakeMaybe, aS as MakeOptional, aT as Maybe, aU as MetadataModuleClient, aV as MetadataSlot, aW as MetadataSlotFieldsFragment, aX as MetadataSlotFieldsFragmentDoc, aY as MetadataSlot_Filter, aZ as MetadataSlot_OrderBy, a_ as MetadataUpdatedEvent, a$ as MetadataUpdatedEvent_Filter, b0 as MetadataUpdatedEvent_OrderBy, b1 as Module, b2 as ModuleUpdateProposedEvent, b3 as ModuleUpdateProposedEvent_Filter, b4 as ModuleUpdateProposedEvent_OrderBy, b5 as Module_Filter, b6 as Module_OrderBy, b7 as NftCollection, b8 as NftCollectionTokensArgs, b9 as NftCollection_Filter, ba as NftCollection_OrderBy, bb as NftToken, bc as NftToken_Filter, bd as NftToken_OrderBy, be as OrderDirection, bf as PendingUpdateCancelledEvent, bg as PendingUpdateCancelledEvent_Filter, bh as PendingUpdateCancelledEvent_OrderBy, bi as PriceUpdatedEvent, bj as PriceUpdatedEvent_Filter, bk as PriceUpdatedEvent_OrderBy, bl as Query, bm as QueryAccountArgs, bn as QueryAccountsArgs, bo as QueryBoughtEventArgs, bp as QueryBoughtEventsArgs, bq as QueryCurrenciesArgs, br as QueryCurrencyArgs, bs as QueryDepositedEventArgs, bt as QueryDepositedEventsArgs, bu as QueryFactoriesArgs, bv as QueryFactoryArgs, bw as QueryLiquidatedEventArgs, bx as QueryLiquidatedEventsArgs, by as QueryMetadataSlotArgs, bz as QueryMetadataSlotsArgs, bA as QueryMetadataUpdatedEventArgs, bB as QueryMetadataUpdatedEventsArgs, bC as QueryModuleArgs, bD as QueryModuleUpdateProposedEventArgs, bE as QueryModuleUpdateProposedEventsArgs, bF as QueryModulesArgs, bG as QueryNftcollectionArgs, bH as QueryNftcollectionsArgs, bI as QueryNfttokenArgs, bJ as QueryNfttokensArgs, bK as QueryPendingUpdateCancelledEventArgs, bL as QueryPendingUpdateCancelledEventsArgs, bM as QueryPriceUpdatedEventArgs, bN as QueryPriceUpdatedEventsArgs, bO as QueryReleasedEventArgs, bP as QueryReleasedEventsArgs, bQ as QuerySettledEventArgs, bR as QuerySettledEventsArgs, bS as QuerySlotArgs, bT as QuerySlotDeployedEventArgs, bU as QuerySlotDeployedEventsArgs, bV as QuerySlotsArgs, bW as QueryTaxCollectedEventArgs, bX as QueryTaxCollectedEventsArgs, bY as QueryTaxUpdateProposedEventArgs, bZ as QueryTaxUpdateProposedEventsArgs, b_ as QueryWithdrawnEventArgs, b$ as QueryWithdrawnEventsArgs, c0 as Query_MetaArgs, c1 as ReleasedEvent, c2 as ReleasedEvent_Filter, c3 as ReleasedEvent_OrderBy, c4 as SUBGRAPH_URLS, c5 as Scalars, c6 as Sdk, c7 as SdkFunctionWrapper, c8 as SettledEvent, c9 as SettledEvent_Filter, ca as SettledEvent_OrderBy, cb as Slot, cc as SlotConfig, cd as SlotDeployedEvent, ce as SlotDeployedEvent_Filter, cf as SlotDeployedEvent_OrderBy, cg as SlotDepositsArgs, ch as SlotFieldsFragment, ci as SlotFieldsFragmentDoc, cj as SlotInitParams, ck as SlotLiquidationsArgs, cl as SlotMetadataUpdatesArgs, cm as SlotModuleUpdateProposalsArgs, cn as SlotPendingUpdateCancellationsArgs, co as SlotPriceUpdatesArgs, cp as SlotPurchasesArgs, cq as SlotReleasesArgs, cr as SlotSettlementsArgs, cs as SlotTaxCollectionsArgs, ct as SlotTaxUpdateProposalsArgs, cu as SlotWithdrawalsArgs, cv as Slot_Filter, cw as Slot_OrderBy, cx as SlotsClient, cy as SlotsClientConfig, cz as SubgraphMeta, cA as TaxCollectedEvent, cB as TaxCollectedEvent_Filter, cC as TaxCollectedEvent_OrderBy, cD as TaxUpdateProposedEvent, cE as TaxUpdateProposedEvent_Filter, cF as TaxUpdateProposedEvent_OrderBy, cG as WithdrawnEvent, cH as WithdrawnEvent_Filter, cI as WithdrawnEvent_OrderBy, cJ as _Block_, cK as _Meta_, cL as _SubgraphErrorPolicy_, cM as createSlotsClient, cN as getSdk } from './client-BcIWQW9H.js';
1
+ import { S as SlotsChain } from './client-CN0aLhHJ.js';
2
+ export { A as Account, a as AccountFieldsFragment, b as AccountFieldsFragmentDoc, c as AccountSlotsAsOccupantArgs, d as AccountSlotsAsRecipientArgs, e as AccountType, f as Account_Filter, g as Account_OrderBy, h as Aggregation_Current, i as Aggregation_Interval, B as BlockChangedFilter, j as Block_Height, k as BoughtEvent, l as BoughtEvent_Filter, m as BoughtEvent_OrderBy, n as BuyParams, C as CreateSlotParams, o as CreateSlotsParams, p as Currency, q as CurrencyFieldsFragment, r as CurrencyFieldsFragmentDoc, s as Currency_Filter, t as Currency_OrderBy, D as DepositedEvent, u as DepositedEvent_Filter, v as DepositedEvent_OrderBy, E as Exact, F as Factory, w as FactoryModulesArgs, x as Factory_Filter, y as Factory_OrderBy, G as GetAccountDocument, z as GetAccountQuery, H as GetAccountQueryVariables, I as GetAccountsDocument, J as GetAccountsQuery, K as GetAccountsQueryVariables, L as GetBoughtEventsDocument, M as GetBoughtEventsQuery, N as GetBoughtEventsQueryVariables, O as GetDepositedEventsDocument, P as GetDepositedEventsQuery, Q as GetDepositedEventsQueryVariables, R as GetFactoryDocument, T as GetFactoryQuery, U as GetFactoryQueryVariables, V as GetLiquidatedEventsDocument, W as GetLiquidatedEventsQuery, X as GetLiquidatedEventsQueryVariables, Y as GetMetadataSlotDocument, Z as GetMetadataSlotQuery, _ as GetMetadataSlotQueryVariables, $ as GetMetadataSlotsByRecipientDocument, a0 as GetMetadataSlotsByRecipientQuery, a1 as GetMetadataSlotsByRecipientQueryVariables, a2 as GetMetadataSlotsDocument, a3 as GetMetadataSlotsQuery, a4 as GetMetadataSlotsQueryVariables, a5 as GetMetadataUpdatedEventsDocument, a6 as GetMetadataUpdatedEventsQuery, a7 as GetMetadataUpdatedEventsQueryVariables, a8 as GetModulesDocument, a9 as GetModulesQuery, aa as GetModulesQueryVariables, ab as GetPriceUpdatedEventsDocument, ac as GetPriceUpdatedEventsQuery, ad as GetPriceUpdatedEventsQueryVariables, ae as GetRecentEventsDocument, af as GetRecentEventsQuery, ag as GetRecentEventsQueryVariables, ah as GetReleasedEventsDocument, ai as GetReleasedEventsQuery, aj as GetReleasedEventsQueryVariables, ak as GetSettledEventsDocument, al as GetSettledEventsQuery, am as GetSettledEventsQueryVariables, an as GetSlotActivityDocument, ao as GetSlotActivityQuery, ap as GetSlotActivityQueryVariables, aq as GetSlotDeployedEventsDocument, ar as GetSlotDeployedEventsQuery, as as GetSlotDeployedEventsQueryVariables, at as GetSlotDocument, au as GetSlotQuery, av as GetSlotQueryVariables, aw as GetSlotsByOccupantDocument, ax as GetSlotsByOccupantQuery, ay as GetSlotsByOccupantQueryVariables, az as GetSlotsByRecipientDocument, aA as GetSlotsByRecipientQuery, aB as GetSlotsByRecipientQueryVariables, aC as GetSlotsDocument, aD as GetSlotsQuery, aE as GetSlotsQueryVariables, aF as GetTaxCollectedEventsDocument, aG as GetTaxCollectedEventsQuery, aH as GetTaxCollectedEventsQueryVariables, aI as GetWithdrawnEventsDocument, aJ as GetWithdrawnEventsQuery, aK as GetWithdrawnEventsQueryVariables, aL as Incremental, aM as InputMaybe, aN as LiquidatedEvent, aO as LiquidatedEvent_Filter, aP as LiquidatedEvent_OrderBy, aQ as MakeEmpty, aR as MakeMaybe, aS as MakeOptional, aT as Maybe, aU as MetadataModuleClient, aV as MetadataSlot, aW as MetadataSlotFieldsFragment, aX as MetadataSlotFieldsFragmentDoc, aY as MetadataSlot_Filter, aZ as MetadataSlot_OrderBy, a_ as MetadataUpdatedEvent, a$ as MetadataUpdatedEvent_Filter, b0 as MetadataUpdatedEvent_OrderBy, b1 as Module, b2 as ModuleUpdateProposedEvent, b3 as ModuleUpdateProposedEvent_Filter, b4 as ModuleUpdateProposedEvent_OrderBy, b5 as Module_Filter, b6 as Module_OrderBy, b7 as NftCollection, b8 as NftCollectionTokensArgs, b9 as NftCollection_Filter, ba as NftCollection_OrderBy, bb as NftToken, bc as NftToken_Filter, bd as NftToken_OrderBy, be as OrderDirection, bf as PendingUpdateCancelledEvent, bg as PendingUpdateCancelledEvent_Filter, bh as PendingUpdateCancelledEvent_OrderBy, bi as PriceUpdatedEvent, bj as PriceUpdatedEvent_Filter, bk as PriceUpdatedEvent_OrderBy, bl as Query, bm as QueryAccountArgs, bn as QueryAccountsArgs, bo as QueryBoughtEventArgs, bp as QueryBoughtEventsArgs, bq as QueryCurrenciesArgs, br as QueryCurrencyArgs, bs as QueryDepositedEventArgs, bt as QueryDepositedEventsArgs, bu as QueryFactoriesArgs, bv as QueryFactoryArgs, bw as QueryLiquidatedEventArgs, bx as QueryLiquidatedEventsArgs, by as QueryMetadataSlotArgs, bz as QueryMetadataSlotsArgs, bA as QueryMetadataUpdatedEventArgs, bB as QueryMetadataUpdatedEventsArgs, bC as QueryModuleArgs, bD as QueryModuleUpdateProposedEventArgs, bE as QueryModuleUpdateProposedEventsArgs, bF as QueryModulesArgs, bG as QueryNftcollectionArgs, bH as QueryNftcollectionsArgs, bI as QueryNfttokenArgs, bJ as QueryNfttokensArgs, bK as QueryPendingUpdateCancelledEventArgs, bL as QueryPendingUpdateCancelledEventsArgs, bM as QueryPriceUpdatedEventArgs, bN as QueryPriceUpdatedEventsArgs, bO as QueryReleasedEventArgs, bP as QueryReleasedEventsArgs, bQ as QuerySettledEventArgs, bR as QuerySettledEventsArgs, bS as QuerySlotArgs, bT as QuerySlotDeployedEventArgs, bU as QuerySlotDeployedEventsArgs, bV as QuerySlotsArgs, bW as QueryTaxCollectedEventArgs, bX as QueryTaxCollectedEventsArgs, bY as QueryTaxUpdateProposedEventArgs, bZ as QueryTaxUpdateProposedEventsArgs, b_ as QueryWithdrawnEventArgs, b$ as QueryWithdrawnEventsArgs, c0 as Query_MetaArgs, c1 as ReleasedEvent, c2 as ReleasedEvent_Filter, c3 as ReleasedEvent_OrderBy, c4 as SUBGRAPH_URLS, c5 as Scalars, c6 as Sdk, c7 as SdkFunctionWrapper, c8 as SettledEvent, c9 as SettledEvent_Filter, ca as SettledEvent_OrderBy, cb as Slot, cc as SlotConfig, cd as SlotDeployedEvent, ce as SlotDeployedEvent_Filter, cf as SlotDeployedEvent_OrderBy, cg as SlotDepositsArgs, ch as SlotFieldsFragment, ci as SlotFieldsFragmentDoc, cj as SlotInitParams, ck as SlotLiquidationsArgs, cl as SlotMetadataUpdatesArgs, cm as SlotModuleUpdateProposalsArgs, cn as SlotPendingUpdateCancellationsArgs, co as SlotPriceUpdatesArgs, cp as SlotPurchasesArgs, cq as SlotReleasesArgs, cr as SlotSettlementsArgs, cs as SlotTaxCollectionsArgs, ct as SlotTaxUpdateProposalsArgs, cu as SlotWithdrawalsArgs, cv as Slot_Filter, cw as Slot_OrderBy, cx as SlotsClient, cy as SlotsClientConfig, cz as SubgraphMeta, cA as TaxCollectedEvent, cB as TaxCollectedEvent_Filter, cC as TaxCollectedEvent_OrderBy, cD as TaxUpdateProposedEvent, cE as TaxUpdateProposedEvent_Filter, cF as TaxUpdateProposedEvent_OrderBy, cG as WithdrawnEvent, cH as WithdrawnEvent_Filter, cI as WithdrawnEvent_OrderBy, cJ as _Block_, cK as _Meta_, cL as _SubgraphErrorPolicy_, cM as createSlotsClient, cN as getSdk } from './client-CN0aLhHJ.js';
3
3
  import { Address } from 'viem';
4
4
  import 'graphql-request';
5
5
  import 'graphql';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { AccountFieldsFragmentDoc, CurrencyFieldsFragmentDoc, GetAccountDocument, GetAccountsDocument, GetBoughtEventsDocument, GetDepositedEventsDocument, GetFactoryDocument, GetLiquidatedEventsDocument, GetMetadataSlotDocument, GetMetadataSlotsByRecipientDocument, GetMetadataSlotsDocument, GetMetadataUpdatedEventsDocument, GetModulesDocument, GetPriceUpdatedEventsDocument, GetRecentEventsDocument, GetReleasedEventsDocument, GetSettledEventsDocument, GetSlotActivityDocument, GetSlotDeployedEventsDocument, GetSlotDocument, GetSlotsByOccupantDocument, GetSlotsByRecipientDocument, GetSlotsDocument, GetTaxCollectedEventsDocument, GetWithdrawnEventsDocument, MetadataModuleClient, MetadataSlotFieldsFragmentDoc, SUBGRAPH_URLS, SlotFieldsFragmentDoc, SlotsChain, SlotsClient, SlotsError, createSlotsClient, getSdk } from './chunk-VQ5PSOCE.js';
1
+ export { AccountFieldsFragmentDoc, CurrencyFieldsFragmentDoc, GetAccountDocument, GetAccountsDocument, GetBoughtEventsDocument, GetDepositedEventsDocument, GetFactoryDocument, GetLiquidatedEventsDocument, GetMetadataSlotDocument, GetMetadataSlotsByRecipientDocument, GetMetadataSlotsDocument, GetMetadataUpdatedEventsDocument, GetModulesDocument, GetPriceUpdatedEventsDocument, GetRecentEventsDocument, GetReleasedEventsDocument, GetSettledEventsDocument, GetSlotActivityDocument, GetSlotDeployedEventsDocument, GetSlotDocument, GetSlotsByOccupantDocument, GetSlotsByRecipientDocument, GetSlotsDocument, GetTaxCollectedEventsDocument, GetWithdrawnEventsDocument, MetadataModuleClient, MetadataSlotFieldsFragmentDoc, SUBGRAPH_URLS, SlotFieldsFragmentDoc, SlotsChain, SlotsClient, SlotsError, createSlotsClient, getSdk } from './chunk-XQG6GMWZ.js';
2
2
 
3
3
  // src/tokens.ts
4
4
  var CHAIN_TOKENS = {
package/dist/react.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { S as SlotsChain, cx as SlotsClient, C as CreateSlotParams, o as CreateSlotsParams, n as BuyParams } from './client-BcIWQW9H.js';
1
+ import { S as SlotsChain, cx as SlotsClient, C as CreateSlotParams, o as CreateSlotsParams, n as BuyParams } from './client-CN0aLhHJ.js';
2
2
  import { Hash, Address } from 'viem';
3
3
  import 'graphql-request';
4
4
  import 'graphql';
package/dist/react.js CHANGED
@@ -1,9 +1,8 @@
1
- import { SlotsClient } from './chunk-VQ5PSOCE.js';
1
+ import { SlotsClient } from './chunk-XQG6GMWZ.js';
2
2
  import { slotFactoryAddress, slotAbi } from '@0xslots/contracts';
3
3
  import { useMemo, useState, useRef, useEffect, useCallback } from 'react';
4
- import { usePublicClient, useWalletClient, useWaitForTransactionReceipt, useReadContract, useReadContracts, useBlockNumber } from 'wagmi';
4
+ import { usePublicClient, useWalletClient, useWaitForTransactionReceipt, useReadContract, useReadContracts } from 'wagmi';
5
5
  import { erc20Abi } from 'viem';
6
- import { useQueryClient } from '@tanstack/react-query';
7
6
 
8
7
  function useSlotsClient(chainId, subgraphApiKey) {
9
8
  const publicClient = usePublicClient({ chainId });
@@ -133,10 +132,7 @@ function useSlotAction(opts) {
133
132
  [exec, client]
134
133
  );
135
134
  const proposeModuleUpdate = useCallback(
136
- (slot, newModule) => exec(
137
- "Propose module",
138
- () => client.proposeModuleUpdate(slot, newModule)
139
- ),
135
+ (slot, newModule) => exec("Propose module", () => client.proposeModuleUpdate(slot, newModule)),
140
136
  [exec, client]
141
137
  );
142
138
  const cancelPendingUpdates = useCallback(
@@ -210,18 +206,7 @@ function parseSlotInfo(slotAddress, info, currencyMeta) {
210
206
  currencyDecimals: currencyMeta?.decimals
211
207
  };
212
208
  }
213
- function useInvalidateOnBlock(chainId) {
214
- const queryClient = useQueryClient();
215
- const { data: blockNumber } = useBlockNumber({ watch: true, chainId });
216
- useEffect(() => {
217
- if (blockNumber) {
218
- queryClient.invalidateQueries({ queryKey: ["readContract"] });
219
- queryClient.invalidateQueries({ queryKey: ["readContracts"] });
220
- }
221
- }, [blockNumber, queryClient]);
222
- }
223
209
  function useSlotOnChain(slotAddress, chainId) {
224
- useInvalidateOnBlock(chainId);
225
210
  const addr = slotAddress;
226
211
  const {
227
212
  data: info,
@@ -256,7 +241,6 @@ function useSlotOnChain(slotAddress, chainId) {
256
241
  return { data: slot, isLoading, refetch };
257
242
  }
258
243
  function useSlotsOnChain(slotAddresses, chainId) {
259
- useInvalidateOnBlock(chainId);
260
244
  const contracts = slotAddresses.map((addr) => ({
261
245
  address: addr,
262
246
  abi: slotAbi,
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useSlotsClient.ts","../src/hooks/useSlotAction.ts","../src/hooks/useSlotOnChain.ts"],"names":["useEffect"],"mappings":"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","file":"react.js","sourcesContent":["\"use client\";\n\nimport { type SupportedChainId, slotFactoryAddress } from \"@0xslots/contracts\";\nimport { useMemo } from \"react\";\nimport { usePublicClient, useWalletClient } from \"wagmi\";\nimport { type SlotsChain, SlotsClient } from \"../client\";\n\n/**\n * React hook that creates a memoized {@link SlotsClient} from wagmi's public/wallet clients.\n *\n * @param chainId - Optional chain ID override. Defaults to the connected chain.\n * @returns A configured SlotsClient instance.\n * @throws If no public client is available or the chain has no factory address.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const client = useSlotsClient(SlotsChain.BASE);\n * // use client.getSlots(), client.buy(), etc.\n * }\n * ```\n */\nexport function useSlotsClient(chainId?: SlotsChain, subgraphApiKey?: string): SlotsClient {\n const publicClient = usePublicClient({ chainId });\n const { data: walletClient } = useWalletClient({ chainId });\n\n return useMemo(() => {\n if (!publicClient) throw new Error(\"No publicClient available\");\n const resolvedChainId = (chainId ?? publicClient.chain.id) as SlotsChain;\n const factoryAddress =\n slotFactoryAddress[resolvedChainId as SupportedChainId];\n if (!factoryAddress)\n throw new Error(`No factory address for chain ${resolvedChainId}`);\n\n return new SlotsClient({\n chainId: resolvedChainId,\n factoryAddress,\n publicClient,\n walletClient: walletClient ?? undefined,\n subgraphApiKey,\n });\n }, [chainId, publicClient, walletClient, subgraphApiKey]);\n}\n","\"use client\";\n\nimport type {\n BuyParams,\n CreateSlotParams,\n CreateSlotsParams,\n SlotsChain,\n} from \"../client\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Address, Hash } from \"viem\";\nimport { useWaitForTransactionReceipt } from \"wagmi\";\nimport { useSlotsClient } from \"./useSlotsClient\";\n\nfunction extractErrorMessage(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"User rejected\") || message.includes(\"User denied\"))\n return \"Transaction rejected\";\n\n // viem ContractFunctionExecutionError: extract the shortMessage or reason\n const err = error as Record<string, unknown> | undefined;\n if (err && typeof err === \"object\") {\n if (typeof err.shortMessage === \"string\") return err.shortMessage;\n const cause = err.cause as Record<string, unknown> | undefined;\n if (cause && typeof cause.shortMessage === \"string\")\n return cause.shortMessage;\n if (cause && typeof cause.reason === \"string\") return cause.reason;\n }\n\n return message.split(\"\\n\")[0] || \"Transaction failed\";\n}\n\nexport interface SlotActionCallbacks {\n chainId?: SlotsChain;\n onSuccess?: (label: string, hash: Hash) => void;\n onError?: (label: string, error: string) => void;\n}\n\nexport function useSlotAction(opts?: SlotActionCallbacks) {\n const client = useSlotsClient(opts?.chainId);\n\n // --- state ---\n const [hash, setHash] = useState<Hash | undefined>();\n const [activeAction, setActiveAction] = useState<string | null>(null);\n const [isPending, setIsPending] = useState(false);\n const labelRef = useRef<string>(\"\");\n\n // --- receipt tracking ---\n const {\n isLoading: isConfirming,\n isSuccess,\n isError,\n } = useWaitForTransactionReceipt({ hash });\n\n const busy = isPending || isConfirming;\n\n // --- callback on success ---\n useEffect(() => {\n if (isSuccess && labelRef.current) {\n opts?.onSuccess?.(labelRef.current, hash!);\n setActiveAction(null);\n labelRef.current = \"\";\n }\n }, [isSuccess]);\n\n // --- callback on on-chain error ---\n useEffect(() => {\n if (isError && labelRef.current) {\n opts?.onError?.(labelRef.current, `${labelRef.current} failed on-chain`);\n setActiveAction(null);\n labelRef.current = \"\";\n }\n }, [isError]);\n\n // --- reset if everything settles with no result ---\n useEffect(() => {\n if (!isPending && !isConfirming && !isSuccess && !isError) {\n setActiveAction(null);\n }\n }, [isPending, isConfirming, isSuccess, isError]);\n\n /**\n * Execute an SDK method with shared pending/receipt tracking.\n */\n const exec = useCallback(\n async (label: string, fn: () => Promise<Hash>) => {\n labelRef.current = label;\n setActiveAction(label);\n setIsPending(true);\n setHash(undefined);\n try {\n const txHash = await fn();\n setHash(txHash);\n } catch (error) {\n console.error(`[useSlotAction] ${label} failed:`, error);\n setActiveAction(null);\n labelRef.current = \"\";\n opts?.onError?.(label, extractErrorMessage(error));\n } finally {\n setIsPending(false);\n }\n },\n [opts?.onError],\n );\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Named actions — each calls one SDK method\n // ═══════════════════════════════════════════════════════════════════════════\n\n // Factory\n const createSlot = useCallback(\n (params: CreateSlotParams) =>\n exec(\"Create slot\", () => client.createSlot(params)),\n [exec, client],\n );\n const createSlots = useCallback(\n (params: CreateSlotsParams) =>\n exec(\"Create slots\", () => client.createSlots(params)),\n [exec, client],\n );\n\n // Slot interactions\n const buy = useCallback(\n (params: BuyParams) => exec(\"Buy slot\", () => client.buy(params)),\n [exec, client],\n );\n const selfAssess = useCallback(\n (slot: Address, newPrice: bigint) =>\n exec(\"Set price\", () => client.selfAssess(slot, newPrice)),\n [exec, client],\n );\n const topUp = useCallback(\n (slot: Address, amount: bigint) =>\n exec(\"Top up\", () => client.topUp(slot, amount)),\n [exec, client],\n );\n const withdraw = useCallback(\n (slot: Address, amount: bigint) =>\n exec(\"Withdraw\", () => client.withdraw(slot, amount)),\n [exec, client],\n );\n const release = useCallback(\n (slot: Address) => exec(\"Release slot\", () => client.release(slot)),\n [exec, client],\n );\n const collect = useCallback(\n (slot: Address) => exec(\"Collect tax\", () => client.collect(slot)),\n [exec, client],\n );\n const payTax = useCallback(\n (slot: Address) => exec(\"Pay tax\", () => client.collect(slot)),\n [exec, client],\n );\n const liquidate = useCallback(\n (slot: Address) => exec(\"Liquidate\", () => client.liquidate(slot)),\n [exec, client],\n );\n\n // Manager\n const proposeTaxUpdate = useCallback(\n (slot: Address, newPct: bigint) =>\n exec(\"Propose tax\", () => client.proposeTaxUpdate(slot, newPct)),\n [exec, client],\n );\n const proposeModuleUpdate = useCallback(\n (slot: Address, newModule: Address) =>\n exec(\"Propose module\", () =>\n client.proposeModuleUpdate(slot, newModule),\n ),\n [exec, client],\n );\n const cancelPendingUpdates = useCallback(\n (slot: Address) =>\n exec(\"Cancel updates\", () => client.cancelPendingUpdates(slot)),\n [exec, client],\n );\n const setLiquidationBounty = useCallback(\n (slot: Address, newBps: bigint) =>\n exec(\"Set bounty\", () => client.setLiquidationBounty(slot, newBps)),\n [exec, client],\n );\n\n // Metadata module\n const updateMetadata = useCallback(\n (moduleAddress: Address, slot: Address, uri: string) =>\n exec(\"Update metadata\", () =>\n client.modules.metadata.updateMetadata(moduleAddress, slot, uri),\n ),\n [exec, client],\n );\n\n return {\n // Actions\n createSlot,\n createSlots,\n buy,\n selfAssess,\n topUp,\n withdraw,\n release,\n collect,\n payTax,\n liquidate,\n proposeTaxUpdate,\n proposeModuleUpdate,\n cancelPendingUpdates,\n setLiquidationBounty,\n updateMetadata,\n // Executor\n exec,\n // State\n busy,\n isPending,\n isConfirming,\n isSuccess,\n activeAction,\n };\n}\n","\"use client\";\n\nimport { slotAbi } from \"@0xslots/contracts\";\nimport { type Address, erc20Abi } from \"viem\";\nimport { useReadContract, useReadContracts, useBlockNumber } from \"wagmi\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useEffect } from \"react\";\n\nexport type SlotOnChain = {\n // Identity\n id: string;\n recipient: string;\n currency: string;\n manager: string;\n mutableTax: boolean;\n mutableModule: boolean;\n // State\n occupant: string | null;\n price: bigint;\n taxPercentage: bigint;\n module: string;\n liquidationBountyBps: bigint;\n minDepositSeconds: bigint;\n // Financials\n deposit: bigint;\n collectedTax: bigint;\n taxOwed: bigint;\n secondsUntilLiquidation: bigint;\n insolvent: boolean;\n // Pending\n hasPendingTax: boolean;\n pendingTaxPercentage: bigint;\n hasPendingModule: boolean;\n pendingModule: string;\n // Currency metadata\n currencyName?: string;\n currencySymbol?: string;\n currencyDecimals?: number;\n};\n\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\ntype SlotInfoResult = {\n recipient: string;\n currency: string;\n manager: string;\n mutableTax: boolean;\n mutableModule: boolean;\n occupant: string;\n price: bigint;\n taxPercentage: bigint;\n module: string;\n liquidationBountyBps: bigint;\n minDepositSeconds: bigint;\n deposit: bigint;\n collectedTax: bigint;\n taxOwed: bigint;\n secondsUntilLiquidation: bigint;\n insolvent: boolean;\n hasPendingTax: boolean;\n pendingTaxPercentage: bigint;\n hasPendingModule: boolean;\n pendingModule: string;\n};\n\nfunction parseSlotInfo(\n slotAddress: string,\n info: SlotInfoResult,\n currencyMeta?: { name?: string; symbol?: string; decimals?: number },\n): SlotOnChain {\n return {\n id: slotAddress.toLowerCase(),\n recipient: info.recipient.toLowerCase(),\n currency: info.currency.toLowerCase(),\n manager: info.manager.toLowerCase(),\n mutableTax: info.mutableTax,\n mutableModule: info.mutableModule,\n occupant:\n info.occupant === ZERO_ADDRESS ? null : info.occupant.toLowerCase(),\n price: info.price,\n taxPercentage: info.taxPercentage,\n module: info.module.toLowerCase(),\n liquidationBountyBps: info.liquidationBountyBps,\n minDepositSeconds: info.minDepositSeconds,\n deposit: info.deposit,\n collectedTax: info.collectedTax,\n taxOwed: info.taxOwed,\n secondsUntilLiquidation: info.secondsUntilLiquidation,\n insolvent: info.insolvent,\n hasPendingTax: info.hasPendingTax,\n pendingTaxPercentage: info.pendingTaxPercentage,\n hasPendingModule: info.hasPendingModule,\n pendingModule: info.pendingModule.toLowerCase(),\n currencyName: currencyMeta?.name,\n currencySymbol: currencyMeta?.symbol,\n currencyDecimals: currencyMeta?.decimals,\n };\n}\n\n/**\n * Invalidate all contract reads on every new block — ensures fresh data after txs\n */\nfunction useInvalidateOnBlock(chainId: number) {\n const queryClient = useQueryClient();\n const { data: blockNumber } = useBlockNumber({ watch: true, chainId });\n useEffect(() => {\n if (blockNumber) {\n queryClient.invalidateQueries({ queryKey: [\"readContract\"] });\n queryClient.invalidateQueries({ queryKey: [\"readContracts\"] });\n }\n }, [blockNumber, queryClient]);\n}\n\n/**\n * Fetch a single slot's complete state from on-chain via getSlotInfo() + currency metadata.\n *\n * @param slotAddress - The slot contract address\n * @param chainId - The chain ID to read from\n */\nexport function useSlotOnChain(slotAddress: string, chainId: number): {\n data: SlotOnChain | null;\n isLoading: boolean;\n refetch: () => void;\n} {\n useInvalidateOnBlock(chainId);\n const addr = slotAddress as Address;\n\n const {\n data: info,\n isLoading: infoLoading,\n refetch,\n } = useReadContract({\n address: addr,\n abi: slotAbi,\n functionName: \"getSlotInfo\",\n chainId,\n query: { gcTime: 0, staleTime: 0, refetchOnMount: \"always\" },\n });\n\n // Currency metadata — only fetch when we have info (static, can cache)\n const currencyAddr = info\n ? ((info as SlotInfoResult).currency as Address)\n : undefined;\n const { data: currencyMeta, isLoading: metaLoading } = useReadContracts({\n contracts: currencyAddr\n ? [\n { address: currencyAddr, abi: erc20Abi, functionName: \"name\", chainId },\n { address: currencyAddr, abi: erc20Abi, functionName: \"symbol\", chainId },\n { address: currencyAddr, abi: erc20Abi, functionName: \"decimals\", chainId },\n ]\n : [],\n query: { enabled: !!currencyAddr, staleTime: Infinity },\n });\n\n const isLoading = infoLoading || metaLoading;\n\n const slot = info\n ? parseSlotInfo(\n slotAddress,\n info as SlotInfoResult,\n currencyMeta\n ? {\n name: currencyMeta[0]?.result as string | undefined,\n symbol: currencyMeta[1]?.result as string | undefined,\n decimals: currencyMeta[2]?.result as number | undefined,\n }\n : undefined,\n )\n : null;\n\n return { data: slot, isLoading, refetch };\n}\n\n/**\n * Fetch multiple slots' state via multicall getSlotInfo().\n *\n * @param slotAddresses - Array of slot contract addresses\n * @param chainId - The chain ID to read from\n */\nexport function useSlotsOnChain(slotAddresses: string[], chainId: number): {\n data: SlotOnChain[];\n isLoading: boolean;\n refetch: () => void;\n} {\n useInvalidateOnBlock(chainId);\n const contracts = slotAddresses.map((addr) => ({\n address: addr as Address,\n abi: slotAbi,\n functionName: \"getSlotInfo\" as const,\n chainId,\n }));\n\n const {\n data: infos,\n isLoading: infosLoading,\n refetch,\n } = useReadContracts({\n contracts,\n query: {\n enabled: slotAddresses.length > 0,\n gcTime: 0,\n staleTime: 0,\n refetchOnMount: \"always\",\n },\n });\n\n // Get unique currencies to fetch metadata\n const currencies = new Set<string>();\n if (infos) {\n for (const r of infos) {\n if (r.result)\n currencies.add(\n (r.result as SlotInfoResult).currency.toLowerCase(),\n );\n }\n }\n const currencyList = Array.from(currencies);\n\n const { data: metaResults, isLoading: metaLoading } = useReadContracts({\n contracts: currencyList.flatMap((c) => [\n { address: c as Address, abi: erc20Abi, functionName: \"name\" as const, chainId },\n { address: c as Address, abi: erc20Abi, functionName: \"symbol\" as const, chainId },\n {\n address: c as Address,\n abi: erc20Abi,\n functionName: \"decimals\" as const,\n chainId,\n },\n ]),\n query: { enabled: currencyList.length > 0 },\n });\n\n // Build currency metadata map\n const currencyMeta: Record<\n string,\n { name?: string; symbol?: string; decimals?: number }\n > = {};\n if (metaResults) {\n currencyList.forEach((c, i) => {\n currencyMeta[c] = {\n name: metaResults[i * 3]?.result as string | undefined,\n symbol: metaResults[i * 3 + 1]?.result as string | undefined,\n decimals: metaResults[i * 3 + 2]?.result as number | undefined,\n };\n });\n }\n\n const isLoading = infosLoading || metaLoading;\n\n const slots: SlotOnChain[] = [];\n if (infos) {\n for (let i = 0; i < infos.length; i++) {\n const r = infos[i];\n if (r.result) {\n const result = r.result as SlotInfoResult;\n const currency = result.currency.toLowerCase();\n slots.push(\n parseSlotInfo(slotAddresses[i], result, currencyMeta[currency]),\n );\n }\n }\n }\n\n return { data: slots, isLoading, refetch };\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/useSlotsClient.ts","../src/hooks/useSlotAction.ts","../src/hooks/useSlotOnChain.ts"],"names":[],"mappings":";;;;;;AAsBO,SAAS,cAAA,CAAe,SAAsB,cAAA,EAAsC;AACzF,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,EAAE,OAAA,EAAS,CAAA;AAChD,EAAA,MAAM,EAAE,IAAA,EAAM,YAAA,KAAiB,eAAA,CAAgB,EAAE,SAAS,CAAA;AAE1D,EAAA,OAAO,QAAQ,MAAM;AACnB,IAAA,IAAI,CAAC,YAAA,EAAc,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAC9D,IAAA,MAAM,eAAA,GAAmB,OAAA,IAAW,YAAA,CAAa,KAAA,CAAM,EAAA;AACvD,IAAA,MAAM,cAAA,GACJ,mBAAmB,eAAmC,CAAA;AACxD,IAAA,IAAI,CAAC,cAAA;AACH,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,eAAe,CAAA,CAAE,CAAA;AAEnE,IAAA,OAAO,IAAI,WAAA,CAAY;AAAA,MACrB,OAAA,EAAS,eAAA;AAAA,MACT,cAAA;AAAA,MACA,YAAA;AAAA,MACA,cAAc,YAAA,IAAgB,MAAA;AAAA,MAC9B;AAAA,KACD,CAAA;AAAA,EACH,GAAG,CAAC,OAAA,EAAS,YAAA,EAAc,YAAA,EAAc,cAAc,CAAC,CAAA;AAC1D;AC7BA,SAAS,oBAAoB,KAAA,EAAwB;AACnD,EAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,EAAA,IAAI,QAAQ,QAAA,CAAS,eAAe,CAAA,IAAK,OAAA,CAAQ,SAAS,aAAa,CAAA;AACrE,IAAA,OAAO,sBAAA;AAGT,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AAClC,IAAA,IAAI,OAAO,GAAA,CAAI,YAAA,KAAiB,QAAA,SAAiB,GAAA,CAAI,YAAA;AACrD,IAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,CAAM,YAAA,KAAiB,QAAA;AACzC,MAAA,OAAO,KAAA,CAAM,YAAA;AACf,IAAA,IAAI,SAAS,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,SAAiB,KAAA,CAAM,MAAA;AAAA,EAC9D;AAEA,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,oBAAA;AACnC;AAQO,SAAS,cAAc,IAAA,EAA4B;AACxD,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,IAAA,EAAM,OAAO,CAAA;AAG3C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAA,EAA2B;AACnD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,OAAe,EAAE,CAAA;AAGlC,EAAA,MAAM;AAAA,IACJ,SAAA,EAAW,YAAA;AAAA,IACX,SAAA;AAAA,IACA;AAAA,GACF,GAAI,4BAAA,CAA6B,EAAE,IAAA,EAAM,CAAA;AAEzC,EAAA,MAAM,OAAO,SAAA,IAAa,YAAA;AAG1B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,IAAa,SAAS,OAAA,EAAS;AACjC,MAAA,IAAA,EAAM,SAAA,GAAY,QAAA,CAAS,OAAA,EAAS,IAAK,CAAA;AACzC,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,QAAA,CAAS,OAAA,GAAU,EAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAA,IAAW,SAAS,OAAA,EAAS;AAC/B,MAAA,IAAA,EAAM,UAAU,QAAA,CAAS,OAAA,EAAS,CAAA,EAAG,QAAA,CAAS,OAAO,CAAA,gBAAA,CAAkB,CAAA;AACvE,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,QAAA,CAAS,OAAA,GAAU,EAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,gBAAgB,CAAC,SAAA,IAAa,CAAC,OAAA,EAAS;AACzD,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,YAAA,EAAc,SAAA,EAAW,OAAO,CAAC,CAAA;AAKhD,EAAA,MAAM,IAAA,GAAO,WAAA;AAAA,IACX,OAAO,OAAe,EAAA,KAA4B;AAChD,MAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,MAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,OAAA,CAAQ,MAAS,CAAA;AACjB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAChB,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gBAAA,EAAmB,KAAK,CAAA,QAAA,CAAA,EAAY,KAAK,CAAA;AACvD,QAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,QAAA,QAAA,CAAS,OAAA,GAAU,EAAA;AACnB,QAAA,IAAA,EAAM,OAAA,GAAU,KAAA,EAAO,mBAAA,CAAoB,KAAK,CAAC,CAAA;AAAA,MACnD,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM,OAAO;AAAA,GAChB;AAOA,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,CAAC,WACC,IAAA,CAAK,aAAA,EAAe,MAAM,MAAA,CAAO,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,IACrD,CAAC,MAAM,MAAM;AAAA,GACf;AACA,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CAAC,WACC,IAAA,CAAK,cAAA,EAAgB,MAAM,MAAA,CAAO,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,IACvD,CAAC,MAAM,MAAM;AAAA,GACf;AAGA,EAAA,MAAM,GAAA,GAAM,WAAA;AAAA,IACV,CAAC,WAAsB,IAAA,CAAK,UAAA,EAAY,MAAM,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,IAChE,CAAC,MAAM,MAAM;AAAA,GACf;AACA,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,CAAC,IAAA,EAAe,QAAA,KACd,IAAA,CAAK,WAAA,EAAa,MAAM,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,IAC3D,CAAC,MAAM,MAAM;AAAA,GACf;AACA,EAAA,MAAM,KAAA,GAAQ,WAAA;AAAA,IACZ,CAAC,IAAA,EAAe,MAAA,KACd,IAAA,CAAK,QAAA,EAAU,MAAM,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,IACjD,CAAC,MAAM,MAAM;AAAA,GACf;AACA,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,IAAA,EAAe,MAAA,KACd,IAAA,CAAK,UAAA,EAAY,MAAM,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,IACtD,CAAC,MAAM,MAAM;AAAA,GACf;AACA,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACd,CAAC,SAAkB,IAAA,CAAK,cAAA,EAAgB,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,IAClE,CAAC,MAAM,MAAM;AAAA,GACf;AACA,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACd,CAAC,SAAkB,IAAA,CAAK,aAAA,EAAe,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,IACjE,CAAC,MAAM,MAAM;AAAA,GACf;AACA,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACb,CAAC,SAAkB,IAAA,CAAK,SAAA,EAAW,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,IAC7D,CAAC,MAAM,MAAM;AAAA,GACf;AACA,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,CAAC,SAAkB,IAAA,CAAK,WAAA,EAAa,MAAM,MAAA,CAAO,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IACjE,CAAC,MAAM,MAAM;AAAA,GACf;AAGA,EAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,IACvB,CAAC,IAAA,EAAe,MAAA,KACd,IAAA,CAAK,aAAA,EAAe,MAAM,MAAA,CAAO,gBAAA,CAAiB,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,IACjE,CAAC,MAAM,MAAM;AAAA,GACf;AACA,EAAA,MAAM,mBAAA,GAAsB,WAAA;AAAA,IAC1B,CAAC,IAAA,EAAe,SAAA,KACd,IAAA,CAAK,gBAAA,EAAkB,MAAM,MAAA,CAAO,mBAAA,CAAoB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IAC1E,CAAC,MAAM,MAAM;AAAA,GACf;AACA,EAAA,MAAM,oBAAA,GAAuB,WAAA;AAAA,IAC3B,CAAC,SACC,IAAA,CAAK,gBAAA,EAAkB,MAAM,MAAA,CAAO,oBAAA,CAAqB,IAAI,CAAC,CAAA;AAAA,IAChE,CAAC,MAAM,MAAM;AAAA,GACf;AACA,EAAA,MAAM,oBAAA,GAAuB,WAAA;AAAA,IAC3B,CAAC,IAAA,EAAe,MAAA,KACd,IAAA,CAAK,YAAA,EAAc,MAAM,MAAA,CAAO,oBAAA,CAAqB,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,IACpE,CAAC,MAAM,MAAM;AAAA,GACf;AAGA,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,CAAC,aAAA,EAAwB,IAAA,EAAe,GAAA,KACtC,IAAA;AAAA,MAAK,iBAAA;AAAA,MAAmB,MACtB,MAAA,CAAO,OAAA,CAAQ,SAAS,cAAA,CAAe,aAAA,EAAe,MAAM,GAAG;AAAA,KACjE;AAAA,IACF,CAAC,MAAM,MAAM;AAAA,GACf;AAEA,EAAA,OAAO;AAAA;AAAA,IAEL,UAAA;AAAA,IACA,WAAA;AAAA,IACA,GAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA,oBAAA;AAAA,IACA,oBAAA;AAAA,IACA,cAAA;AAAA;AAAA,IAEA,IAAA;AAAA;AAAA,IAEA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;AChLA,IAAM,YAAA,GAAe,4CAAA;AAyBrB,SAAS,aAAA,CACP,WAAA,EACA,IAAA,EACA,YAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,YAAY,WAAA,EAAY;AAAA,IAC5B,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,WAAA,EAAY;AAAA,IACtC,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY;AAAA,IACpC,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAAA,IAClC,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,UACE,IAAA,CAAK,QAAA,KAAa,eAAe,IAAA,GAAO,IAAA,CAAK,SAAS,WAAA,EAAY;AAAA,IACpE,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,WAAA,EAAY;AAAA,IAChC,sBAAsB,IAAA,CAAK,oBAAA;AAAA,IAC3B,mBAAmB,IAAA,CAAK,iBAAA;AAAA,IACxB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,yBAAyB,IAAA,CAAK,uBAAA;AAAA,IAC9B,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,sBAAsB,IAAA,CAAK,oBAAA;AAAA,IAC3B,kBAAkB,IAAA,CAAK,gBAAA;AAAA,IACvB,aAAA,EAAe,IAAA,CAAK,aAAA,CAAc,WAAA,EAAY;AAAA,IAC9C,cAAc,YAAA,EAAc,IAAA;AAAA,IAC5B,gBAAgB,YAAA,EAAc,MAAA;AAAA,IAC9B,kBAAkB,YAAA,EAAc;AAAA,GAClC;AACF;AAUO,SAAS,cAAA,CAAe,aAAqB,OAAA,EAIlD;AAEA,EAAA,MAAM,IAAA,GAAO,WAAA;AAEb,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,IAAA;AAAA,IACN,SAAA,EAAW,WAAA;AAAA,IACX;AAAA,MACE,eAAA,CAAgB;AAAA,IAClB,OAAA,EAAS,IAAA;AAAA,IACT,GAAA,EAAK,OAAA;AAAA,IACL,YAAA,EAAc,aAAA;AAAA,IACd,OAAA;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,GAAG,SAAA,EAAW,CAAA,EAAG,gBAAgB,QAAA;AAAS,GAC5D,CAAA;AAGD,EAAA,MAAM,YAAA,GAAe,IAAA,GACf,IAAA,CAAwB,QAAA,GAC1B,MAAA;AACJ,EAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,SAAA,EAAW,WAAA,KAAgB,gBAAA,CAAiB;AAAA,IACtE,WAAW,YAAA,GACP;AAAA,MACE,EAAE,OAAA,EAAS,YAAA,EAAc,KAAK,QAAA,EAAU,YAAA,EAAc,QAAQ,OAAA,EAAQ;AAAA,MACtE,EAAE,OAAA,EAAS,YAAA,EAAc,KAAK,QAAA,EAAU,YAAA,EAAc,UAAU,OAAA,EAAQ;AAAA,MACxE,EAAE,OAAA,EAAS,YAAA,EAAc,KAAK,QAAA,EAAU,YAAA,EAAc,YAAY,OAAA;AAAQ,QAE5E,EAAC;AAAA,IACL,OAAO,EAAE,OAAA,EAAS,CAAC,CAAC,YAAA,EAAc,WAAW,QAAA;AAAS,GACvD,CAAA;AAED,EAAA,MAAM,YAAY,WAAA,IAAe,WAAA;AAEjC,EAAA,MAAM,OAAO,IAAA,GACT,aAAA;AAAA,IACE,WAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA,GACI;AAAA,MACE,IAAA,EAAM,YAAA,CAAa,CAAC,CAAA,EAAG,MAAA;AAAA,MACvB,MAAA,EAAQ,YAAA,CAAa,CAAC,CAAA,EAAG,MAAA;AAAA,MACzB,QAAA,EAAU,YAAA,CAAa,CAAC,CAAA,EAAG;AAAA,KAC7B,GACA;AAAA,GACN,GACA,IAAA;AAEJ,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,OAAA,EAAQ;AAC1C;AAQO,SAAS,eAAA,CAAgB,eAAyB,OAAA,EAIvD;AAEA,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,IAC7C,OAAA,EAAS,IAAA;AAAA,IACT,GAAA,EAAK,OAAA;AAAA,IACL,YAAA,EAAc,aAAA;AAAA,IACd;AAAA,GACF,CAAE,CAAA;AAEF,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAW,YAAA;AAAA,IACX;AAAA,MACE,gBAAA,CAAiB;AAAA,IACnB,SAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,cAAc,MAAA,GAAS,CAAA;AAAA,MAChC,MAAA,EAAQ,CAAA;AAAA,MACR,SAAA,EAAW,CAAA;AAAA,MACX,cAAA,EAAgB;AAAA;AAClB,GACD,CAAA;AAGD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,CAAA,CAAE,MAAA;AACJ,QAAA,UAAA,CAAW,GAAA;AAAA,UACR,CAAA,CAAE,MAAA,CAA0B,QAAA,CAAS,WAAA;AAAY,SACpD;AAAA,IACJ;AAAA,EACF;AACA,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AAE1C,EAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,SAAA,EAAW,WAAA,KAAgB,gBAAA,CAAiB;AAAA,IACrE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAA,KAAM;AAAA,MACrC,EAAE,OAAA,EAAS,CAAA,EAAc,KAAK,QAAA,EAAU,YAAA,EAAc,QAAiB,OAAA,EAAQ;AAAA,MAC/E,EAAE,OAAA,EAAS,CAAA,EAAc,KAAK,QAAA,EAAU,YAAA,EAAc,UAAmB,OAAA,EAAQ;AAAA,MACjF;AAAA,QACE,OAAA,EAAS,CAAA;AAAA,QACT,GAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAc,UAAA;AAAA,QACd;AAAA;AACF,KACD,CAAA;AAAA,IACD,KAAA,EAAO,EAAE,OAAA,EAAS,YAAA,CAAa,SAAS,CAAA;AAAE,GAC3C,CAAA;AAGD,EAAA,MAAM,eAGF,EAAC;AACL,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC7B,MAAA,YAAA,CAAa,CAAC,CAAA,GAAI;AAAA,QAChB,IAAA,EAAM,WAAA,CAAY,CAAA,GAAI,CAAC,CAAA,EAAG,MAAA;AAAA,QAC1B,MAAA,EAAQ,WAAA,CAAY,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,EAAG,MAAA;AAAA,QAChC,QAAA,EAAU,WAAA,CAAY,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,EAAG;AAAA,OACpC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,YAAY,YAAA,IAAgB,WAAA;AAElC,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,MAAA,IAAI,EAAE,MAAA,EAAQ;AACZ,QAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,WAAA,EAAY;AAC7C,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ,cAAc,aAAA,CAAc,CAAC,GAAG,MAAA,EAAQ,YAAA,CAAa,QAAQ,CAAC;AAAA,SAChE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,OAAA,EAAQ;AAC3C","file":"react.js","sourcesContent":["\"use client\";\n\nimport { type SupportedChainId, slotFactoryAddress } from \"@0xslots/contracts\";\nimport { useMemo } from \"react\";\nimport { usePublicClient, useWalletClient } from \"wagmi\";\nimport { type SlotsChain, SlotsClient } from \"../client\";\n\n/**\n * React hook that creates a memoized {@link SlotsClient} from wagmi's public/wallet clients.\n *\n * @param chainId - Optional chain ID override. Defaults to the connected chain.\n * @returns A configured SlotsClient instance.\n * @throws If no public client is available or the chain has no factory address.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const client = useSlotsClient(SlotsChain.BASE);\n * // use client.getSlots(), client.buy(), etc.\n * }\n * ```\n */\nexport function useSlotsClient(chainId?: SlotsChain, subgraphApiKey?: string): SlotsClient {\n const publicClient = usePublicClient({ chainId });\n const { data: walletClient } = useWalletClient({ chainId });\n\n return useMemo(() => {\n if (!publicClient) throw new Error(\"No publicClient available\");\n const resolvedChainId = (chainId ?? publicClient.chain.id) as SlotsChain;\n const factoryAddress =\n slotFactoryAddress[resolvedChainId as SupportedChainId];\n if (!factoryAddress)\n throw new Error(`No factory address for chain ${resolvedChainId}`);\n\n return new SlotsClient({\n chainId: resolvedChainId,\n factoryAddress,\n publicClient,\n walletClient: walletClient ?? undefined,\n subgraphApiKey,\n });\n }, [chainId, publicClient, walletClient, subgraphApiKey]);\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Address, Hash } from \"viem\";\nimport { useWaitForTransactionReceipt } from \"wagmi\";\nimport type {\n BuyParams,\n CreateSlotParams,\n CreateSlotsParams,\n SlotsChain,\n} from \"../client\";\nimport { useSlotsClient } from \"./useSlotsClient\";\n\nfunction extractErrorMessage(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"User rejected\") || message.includes(\"User denied\"))\n return \"Transaction rejected\";\n\n // viem ContractFunctionExecutionError: extract the shortMessage or reason\n const err = error as Record<string, unknown> | undefined;\n if (err && typeof err === \"object\") {\n if (typeof err.shortMessage === \"string\") return err.shortMessage;\n const cause = err.cause as Record<string, unknown> | undefined;\n if (cause && typeof cause.shortMessage === \"string\")\n return cause.shortMessage;\n if (cause && typeof cause.reason === \"string\") return cause.reason;\n }\n\n return message.split(\"\\n\")[0] || \"Transaction failed\";\n}\n\nexport interface SlotActionCallbacks {\n chainId?: SlotsChain;\n onSuccess?: (label: string, hash: Hash) => void;\n onError?: (label: string, error: string) => void;\n}\n\nexport function useSlotAction(opts?: SlotActionCallbacks) {\n const client = useSlotsClient(opts?.chainId);\n\n // --- state ---\n const [hash, setHash] = useState<Hash | undefined>();\n const [activeAction, setActiveAction] = useState<string | null>(null);\n const [isPending, setIsPending] = useState(false);\n const labelRef = useRef<string>(\"\");\n\n // --- receipt tracking ---\n const {\n isLoading: isConfirming,\n isSuccess,\n isError,\n } = useWaitForTransactionReceipt({ hash });\n\n const busy = isPending || isConfirming;\n\n // --- callback on success ---\n useEffect(() => {\n if (isSuccess && labelRef.current) {\n opts?.onSuccess?.(labelRef.current, hash!);\n setActiveAction(null);\n labelRef.current = \"\";\n }\n }, [isSuccess]);\n\n // --- callback on on-chain error ---\n useEffect(() => {\n if (isError && labelRef.current) {\n opts?.onError?.(labelRef.current, `${labelRef.current} failed on-chain`);\n setActiveAction(null);\n labelRef.current = \"\";\n }\n }, [isError]);\n\n // --- reset if everything settles with no result ---\n useEffect(() => {\n if (!isPending && !isConfirming && !isSuccess && !isError) {\n setActiveAction(null);\n }\n }, [isPending, isConfirming, isSuccess, isError]);\n\n /**\n * Execute an SDK method with shared pending/receipt tracking.\n */\n const exec = useCallback(\n async (label: string, fn: () => Promise<Hash>) => {\n labelRef.current = label;\n setActiveAction(label);\n setIsPending(true);\n setHash(undefined);\n try {\n const txHash = await fn();\n setHash(txHash);\n } catch (error) {\n console.error(`[useSlotAction] ${label} failed:`, error);\n setActiveAction(null);\n labelRef.current = \"\";\n opts?.onError?.(label, extractErrorMessage(error));\n } finally {\n setIsPending(false);\n }\n },\n [opts?.onError],\n );\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Named actions — each calls one SDK method\n // ═══════════════════════════════════════════════════════════════════════════\n\n // Factory\n const createSlot = useCallback(\n (params: CreateSlotParams) =>\n exec(\"Create slot\", () => client.createSlot(params)),\n [exec, client],\n );\n const createSlots = useCallback(\n (params: CreateSlotsParams) =>\n exec(\"Create slots\", () => client.createSlots(params)),\n [exec, client],\n );\n\n // Slot interactions\n const buy = useCallback(\n (params: BuyParams) => exec(\"Buy slot\", () => client.buy(params)),\n [exec, client],\n );\n const selfAssess = useCallback(\n (slot: Address, newPrice: bigint) =>\n exec(\"Set price\", () => client.selfAssess(slot, newPrice)),\n [exec, client],\n );\n const topUp = useCallback(\n (slot: Address, amount: bigint) =>\n exec(\"Top up\", () => client.topUp(slot, amount)),\n [exec, client],\n );\n const withdraw = useCallback(\n (slot: Address, amount: bigint) =>\n exec(\"Withdraw\", () => client.withdraw(slot, amount)),\n [exec, client],\n );\n const release = useCallback(\n (slot: Address) => exec(\"Release slot\", () => client.release(slot)),\n [exec, client],\n );\n const collect = useCallback(\n (slot: Address) => exec(\"Collect tax\", () => client.collect(slot)),\n [exec, client],\n );\n const payTax = useCallback(\n (slot: Address) => exec(\"Pay tax\", () => client.collect(slot)),\n [exec, client],\n );\n const liquidate = useCallback(\n (slot: Address) => exec(\"Liquidate\", () => client.liquidate(slot)),\n [exec, client],\n );\n\n // Manager\n const proposeTaxUpdate = useCallback(\n (slot: Address, newPct: bigint) =>\n exec(\"Propose tax\", () => client.proposeTaxUpdate(slot, newPct)),\n [exec, client],\n );\n const proposeModuleUpdate = useCallback(\n (slot: Address, newModule: Address) =>\n exec(\"Propose module\", () => client.proposeModuleUpdate(slot, newModule)),\n [exec, client],\n );\n const cancelPendingUpdates = useCallback(\n (slot: Address) =>\n exec(\"Cancel updates\", () => client.cancelPendingUpdates(slot)),\n [exec, client],\n );\n const setLiquidationBounty = useCallback(\n (slot: Address, newBps: bigint) =>\n exec(\"Set bounty\", () => client.setLiquidationBounty(slot, newBps)),\n [exec, client],\n );\n\n // Metadata module\n const updateMetadata = useCallback(\n (moduleAddress: Address, slot: Address, uri: string) =>\n exec(\"Update metadata\", () =>\n client.modules.metadata.updateMetadata(moduleAddress, slot, uri),\n ),\n [exec, client],\n );\n\n return {\n // Actions\n createSlot,\n createSlots,\n buy,\n selfAssess,\n topUp,\n withdraw,\n release,\n collect,\n payTax,\n liquidate,\n proposeTaxUpdate,\n proposeModuleUpdate,\n cancelPendingUpdates,\n setLiquidationBounty,\n updateMetadata,\n // Executor\n exec,\n // State\n busy,\n isPending,\n isConfirming,\n isSuccess,\n activeAction,\n };\n}\n","\"use client\";\n\nimport { slotAbi } from \"@0xslots/contracts\";\nimport { type Address, erc20Abi } from \"viem\";\nimport { useReadContract, useReadContracts } from \"wagmi\";\n\nexport type SlotOnChain = {\n // Identity\n id: string;\n recipient: string;\n currency: string;\n manager: string;\n mutableTax: boolean;\n mutableModule: boolean;\n // State\n occupant: string | null;\n price: bigint;\n taxPercentage: bigint;\n module: string;\n liquidationBountyBps: bigint;\n minDepositSeconds: bigint;\n // Financials\n deposit: bigint;\n collectedTax: bigint;\n taxOwed: bigint;\n secondsUntilLiquidation: bigint;\n insolvent: boolean;\n // Pending\n hasPendingTax: boolean;\n pendingTaxPercentage: bigint;\n hasPendingModule: boolean;\n pendingModule: string;\n // Currency metadata\n currencyName?: string;\n currencySymbol?: string;\n currencyDecimals?: number;\n};\n\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\ntype SlotInfoResult = {\n recipient: string;\n currency: string;\n manager: string;\n mutableTax: boolean;\n mutableModule: boolean;\n occupant: string;\n price: bigint;\n taxPercentage: bigint;\n module: string;\n liquidationBountyBps: bigint;\n minDepositSeconds: bigint;\n deposit: bigint;\n collectedTax: bigint;\n taxOwed: bigint;\n secondsUntilLiquidation: bigint;\n insolvent: boolean;\n hasPendingTax: boolean;\n pendingTaxPercentage: bigint;\n hasPendingModule: boolean;\n pendingModule: string;\n};\n\nfunction parseSlotInfo(\n slotAddress: string,\n info: SlotInfoResult,\n currencyMeta?: { name?: string; symbol?: string; decimals?: number },\n): SlotOnChain {\n return {\n id: slotAddress.toLowerCase(),\n recipient: info.recipient.toLowerCase(),\n currency: info.currency.toLowerCase(),\n manager: info.manager.toLowerCase(),\n mutableTax: info.mutableTax,\n mutableModule: info.mutableModule,\n occupant:\n info.occupant === ZERO_ADDRESS ? null : info.occupant.toLowerCase(),\n price: info.price,\n taxPercentage: info.taxPercentage,\n module: info.module.toLowerCase(),\n liquidationBountyBps: info.liquidationBountyBps,\n minDepositSeconds: info.minDepositSeconds,\n deposit: info.deposit,\n collectedTax: info.collectedTax,\n taxOwed: info.taxOwed,\n secondsUntilLiquidation: info.secondsUntilLiquidation,\n insolvent: info.insolvent,\n hasPendingTax: info.hasPendingTax,\n pendingTaxPercentage: info.pendingTaxPercentage,\n hasPendingModule: info.hasPendingModule,\n pendingModule: info.pendingModule.toLowerCase(),\n currencyName: currencyMeta?.name,\n currencySymbol: currencyMeta?.symbol,\n currencyDecimals: currencyMeta?.decimals,\n };\n}\n\n// Block-watching removed — use refetch() for manual refresh to save RPC calls\n\n/**\n * Fetch a single slot's complete state from on-chain via getSlotInfo() + currency metadata.\n *\n * @param slotAddress - The slot contract address\n * @param chainId - The chain ID to read from\n */\nexport function useSlotOnChain(slotAddress: string, chainId: number): {\n data: SlotOnChain | null;\n isLoading: boolean;\n refetch: () => void;\n} {\n // Manual refetch only — no block watching\n const addr = slotAddress as Address;\n\n const {\n data: info,\n isLoading: infoLoading,\n refetch,\n } = useReadContract({\n address: addr,\n abi: slotAbi,\n functionName: \"getSlotInfo\",\n chainId,\n query: { gcTime: 0, staleTime: 0, refetchOnMount: \"always\" },\n });\n\n // Currency metadata — only fetch when we have info (static, can cache)\n const currencyAddr = info\n ? ((info as SlotInfoResult).currency as Address)\n : undefined;\n const { data: currencyMeta, isLoading: metaLoading } = useReadContracts({\n contracts: currencyAddr\n ? [\n { address: currencyAddr, abi: erc20Abi, functionName: \"name\", chainId },\n { address: currencyAddr, abi: erc20Abi, functionName: \"symbol\", chainId },\n { address: currencyAddr, abi: erc20Abi, functionName: \"decimals\", chainId },\n ]\n : [],\n query: { enabled: !!currencyAddr, staleTime: Infinity },\n });\n\n const isLoading = infoLoading || metaLoading;\n\n const slot = info\n ? parseSlotInfo(\n slotAddress,\n info as SlotInfoResult,\n currencyMeta\n ? {\n name: currencyMeta[0]?.result as string | undefined,\n symbol: currencyMeta[1]?.result as string | undefined,\n decimals: currencyMeta[2]?.result as number | undefined,\n }\n : undefined,\n )\n : null;\n\n return { data: slot, isLoading, refetch };\n}\n\n/**\n * Fetch multiple slots' state via multicall getSlotInfo().\n *\n * @param slotAddresses - Array of slot contract addresses\n * @param chainId - The chain ID to read from\n */\nexport function useSlotsOnChain(slotAddresses: string[], chainId: number): {\n data: SlotOnChain[];\n isLoading: boolean;\n refetch: () => void;\n} {\n // Manual refetch only — no block watching\n const contracts = slotAddresses.map((addr) => ({\n address: addr as Address,\n abi: slotAbi,\n functionName: \"getSlotInfo\" as const,\n chainId,\n }));\n\n const {\n data: infos,\n isLoading: infosLoading,\n refetch,\n } = useReadContracts({\n contracts,\n query: {\n enabled: slotAddresses.length > 0,\n gcTime: 0,\n staleTime: 0,\n refetchOnMount: \"always\",\n },\n });\n\n // Get unique currencies to fetch metadata\n const currencies = new Set<string>();\n if (infos) {\n for (const r of infos) {\n if (r.result)\n currencies.add(\n (r.result as SlotInfoResult).currency.toLowerCase(),\n );\n }\n }\n const currencyList = Array.from(currencies);\n\n const { data: metaResults, isLoading: metaLoading } = useReadContracts({\n contracts: currencyList.flatMap((c) => [\n { address: c as Address, abi: erc20Abi, functionName: \"name\" as const, chainId },\n { address: c as Address, abi: erc20Abi, functionName: \"symbol\" as const, chainId },\n {\n address: c as Address,\n abi: erc20Abi,\n functionName: \"decimals\" as const,\n chainId,\n },\n ]),\n query: { enabled: currencyList.length > 0 },\n });\n\n // Build currency metadata map\n const currencyMeta: Record<\n string,\n { name?: string; symbol?: string; decimals?: number }\n > = {};\n if (metaResults) {\n currencyList.forEach((c, i) => {\n currencyMeta[c] = {\n name: metaResults[i * 3]?.result as string | undefined,\n symbol: metaResults[i * 3 + 1]?.result as string | undefined,\n decimals: metaResults[i * 3 + 2]?.result as number | undefined,\n };\n });\n }\n\n const isLoading = infosLoading || metaLoading;\n\n const slots: SlotOnChain[] = [];\n if (infos) {\n for (let i = 0; i < infos.length; i++) {\n const r = infos[i];\n if (r.result) {\n const result = r.result as SlotInfoResult;\n const currency = result.currency.toLowerCase();\n slots.push(\n parseSlotInfo(slotAddresses[i], result, currencyMeta[currency]),\n );\n }\n }\n }\n\n return { data: slots, isLoading, refetch };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xslots/sdk",
3
- "version": "0.10.1",
3
+ "version": "0.11.0",
4
4
  "description": "Type-safe SDK for the 0xSlots protocol — reads (subgraph) + writes (viem)",
5
5
  "author": "Nezz",
6
6
  "license": "MIT",
@@ -27,7 +27,7 @@
27
27
  "graphql": "^16.9.0",
28
28
  "graphql-request": "^7.2.2",
29
29
  "graphql-tag": "^2.12.6",
30
- "@0xslots/contracts": "0.7.1"
30
+ "@0xslots/contracts": "0.8.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@graphql-codegen/cli": "^5.0.4",