Skip to content

Commit ae45dfd

Browse files
authored
feat: introduce concrete signer / provider split (#268)
1 parent 964bd5d commit ae45dfd

139 files changed

Lines changed: 2477 additions & 1685 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/llm/corpus-manifest.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,7 +1280,7 @@
12801280
"source_type": "api-report",
12811281
"category": "api-reports",
12821282
"logical_path": "packages/react-sdk/etc/react-sdk.api",
1283-
"description": "import * as _$_tanstack_react_query0 from '@tanstack/react-query'; import * as _$_zama_fhe_relayer_sdk_web0 from '@zama-fhe/relayer-sdk/web'; import * as _$_zama_fhe_sdk0 from '@zama-fhe/sdk'; import * as _$react_jsx_runtime0 from 'react/jsx-runtime'; import { Address } from '@zama-fhe/sdk'; import { ApproveUnderlyingParams } from '@zama-fhe/sdk/query'; import { BatchBalancesResult } from '@zama-fhe/sdk'; import { BatchDecryptBalancesAsParams } from '@zama-fhe/sdk/query'; import { ClearValueType } from '@zama-fhe/sdk'; import { ConfidentialApproveParams } from '@zama-fhe/sdk/query'; import { ConfidentialTransferFromParams } from '@zama-fhe/sdk/query'; import { ConfidentialTransferParams } from '@zama-fhe/sdk/query'; import { CreateDelegatedUserDecryptEIP712Params } from '@zama-fhe/sdk/query'; import { CreateEIP712Params } from '@zama-fhe/sdk/query'; import { DecryptBalanceAsParams } from '@zama-fhe/sdk/query'; import { DecryptResult } from '@zama-fhe/sdk/query'; import { DelegateDecryptionParams } from '@zama-fhe/sdk/query'; import { DelegatedUserDecryptParams } from '@zama-fhe/sdk'; import { DelegationStatusData } from '@zama-fhe/sdk/query'; import { EIP712TypedData } from '@zama-fhe/sdk'; import { EncryptParams } from '@zama-fhe/sdk'; import { FinalizeUnwrapParams } from '@zama-fhe/sdk/query'; import { GenericSigner } from '@zama-fhe/sdk'; import { GenericStorage } from '@zama-fhe/sdk'; import { PaginatedResult } from '@zama-fhe/sdk'; import { PropsWithChildren } from 'react'; import { PublicKeyData } from '@zama-fhe/sdk'; import { ReadonlyToken } from '@zama-fhe/sdk'; import { RelayerSDK } from '@zama-fhe/sdk'; import { ResumeUnshieldParams } from '@zama-fhe/sdk/query'; import { RevokeDelegationParams } from '@zama-fhe/sdk/query'; import { ShieldParams } from '@zama-fhe/sdk/query'; import { TokenMetadata } from '@zama-fhe/sdk/query'; import { TokenWrapperPair } from '@zama-fhe/sdk'; import { TokenWrapperPairWithMetadata } from '@zama-fhe/sdk'; import { TransactionResult } from '@zama-fhe/sdk'; import { UnshieldAllParams } from '@zama-fhe/sdk/query'; import { UnshieldParams } from '@zama-fhe/sdk/query'; import { UnwrapParams } from '@zama-fhe/sdk/query'; import { UseMutationOptions } from '@tanstack/react-query'; import { UseMutationResult } from '@tanstack/react-query'; import { UseQueryOptions } from '@tanstack/react-query'; import { UserDecryptQueryConfig } from '@zama-fhe/sdk/query'; import { ZamaSDK } from '@zama-fhe/sdk'; import { ZamaSDKEventListener } from '@zama-fhe/sdk'; import { ZKProofLike } from '@zama-fhe/sdk';",
1283+
"description": "import * as _$_tanstack_react_query0 from '@tanstack/react-query'; import * as _$_zama_fhe_relayer_sdk_web0 from '@zama-fhe/relayer-sdk/web'; import * as _$_zama_fhe_sdk0 from '@zama-fhe/sdk'; import * as _$react_jsx_runtime0 from 'react/jsx-runtime'; import { Address } from '@zama-fhe/sdk'; import { ApproveUnderlyingParams } from '@zama-fhe/sdk/query'; import { BatchBalancesResult } from '@zama-fhe/sdk'; import { BatchDecryptBalancesAsParams } from '@zama-fhe/sdk/query'; import { ClearValueType } from '@zama-fhe/sdk'; import { ConfidentialApproveParams } from '@zama-fhe/sdk/query'; import { ConfidentialTransferFromParams } from '@zama-fhe/sdk/query'; import { ConfidentialTransferParams } from '@zama-fhe/sdk/query'; import { CreateDelegatedUserDecryptEIP712Params } from '@zama-fhe/sdk/query'; import { CreateEIP712Params } from '@zama-fhe/sdk/query'; import { DecryptBalanceAsParams } from '@zama-fhe/sdk/query'; import { DecryptResult } from '@zama-fhe/sdk/query'; import { DelegateDecryptionParams } from '@zama-fhe/sdk/query'; import { DelegatedUserDecryptParams } from '@zama-fhe/sdk'; import { DelegationStatusData } from '@zama-fhe/sdk/query'; import { EIP712TypedData } from '@zama-fhe/sdk'; import { EncryptParams } from '@zama-fhe/sdk'; import { FinalizeUnwrapParams } from '@zama-fhe/sdk/query'; import { GenericProvider } from '@zama-fhe/sdk'; import { GenericSigner } from '@zama-fhe/sdk'; import { GenericStorage } from '@zama-fhe/sdk'; import { PaginatedResult } from '@zama-fhe/sdk'; import { PropsWithChildren } from 'react'; import { PublicKeyData } from '@zama-fhe/sdk'; import { ReadonlyToken } from '@zama-fhe/sdk'; import { RelayerSDK } from '@zama-fhe/sdk'; import { ResumeUnshieldParams } from '@zama-fhe/sdk/query'; import { RevokeDelegationParams } from '@zama-fhe/sdk/query'; import { ShieldParams } from '@zama-fhe/sdk/query'; import { Token } from '@zama-fhe/sdk'; import { TokenMetadata } from '@zama-fhe/sdk/query'; import { TokenWrapperPair } from '@zama-fhe/sdk'; import { TokenWrapperPairWithMetadata } from '@zama-fhe/sdk'; import { TransactionResult } from '@zama-fhe/sdk'; import { UnshieldAllParams } from '@zama-fhe/sdk/query'; import { UnshieldParams } from '@zama-fhe/sdk/query'; import { UnwrapParams } from '@zama-fhe/sdk/query'; import { UseMutationOptions } from '@tanstack/react-query'; import { UseMutationResult } from '@tanstack/react-query'; import { UseQueryOptions } from '@tanstack/react-query'; import { UseQueryResult } from '@tanstack/react-query'; import { UserDecryptQueryConfig } from '@zama-fhe/sdk/query'; import { ZamaSDK } from '@zama-fhe/sdk'; import { ZamaSDKEventListener } from '@zama-fhe/sdk'; import { ZKProofLike } from '@zama-fhe/sdk';",
12841284
"include_in_llms_txt": false,
12851285
"include_in_llms_full": false
12861286
},
@@ -1292,7 +1292,7 @@
12921292
"source_type": "api-report",
12931293
"category": "api-reports",
12941294
"logical_path": "packages/react-sdk/etc/react-sdk-wagmi.api",
1295-
"description": "import { Address } from '@zama-fhe/sdk'; import { Config } from 'wagmi'; import { ContractAbi } from '@zama-fhe/sdk'; import { EIP712TypedData } from '@zama-fhe/sdk'; import { GenericSigner } from '@zama-fhe/sdk'; import { Hex } from '@zama-fhe/sdk'; import { ReadContractArgs } from '@zama-fhe/sdk'; import { ReadContractConfig } from '@zama-fhe/sdk'; import { ReadContractReturnType } from '@zama-fhe/sdk'; import { ReadFunctionName } from '@zama-fhe/sdk'; import { SignerLifecycleCallbacks } from '@zama-fhe/sdk'; import { TransactionReceipt } from '@zama-fhe/sdk'; import { WriteContractArgs } from '@zama-fhe/sdk'; import { WriteContractConfig } from '@zama-fhe/sdk'; import { WriteFunctionName } from '@zama-fhe/sdk';",
1295+
"description": "import { Address } from '@zama-fhe/sdk'; import { Config } from 'wagmi'; import { ContractAbi } from '@zama-fhe/sdk'; import { EIP712TypedData } from '@zama-fhe/sdk'; import { GenericProvider } from '@zama-fhe/sdk'; import { GenericSigner } from '@zama-fhe/sdk'; import { Hex } from '@zama-fhe/sdk'; import { ReadContractArgs } from '@zama-fhe/sdk'; import { ReadContractConfig } from '@zama-fhe/sdk'; import { ReadContractReturnType } from '@zama-fhe/sdk'; import { ReadFunctionName } from '@zama-fhe/sdk'; import { SignerLifecycleCallbacks } from '@zama-fhe/sdk'; import { TransactionReceipt } from '@zama-fhe/sdk'; import { WriteContractArgs } from '@zama-fhe/sdk'; import { WriteContractConfig } from '@zama-fhe/sdk'; import { WriteFunctionName } from '@zama-fhe/sdk';",
12961296
"include_in_llms_txt": false,
12971297
"include_in_llms_full": false
12981298
}

packages/react-sdk/etc/react-sdk-wagmi.api.md

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { Address } from '@zama-fhe/sdk';
88
import { Config } from 'wagmi';
99
import { ContractAbi } from '@zama-fhe/sdk';
1010
import { EIP712TypedData } from '@zama-fhe/sdk';
11+
import { GenericProvider } from '@zama-fhe/sdk';
1112
import { GenericSigner } from '@zama-fhe/sdk';
1213
import { Hex } from '@zama-fhe/sdk';
1314
import { ReadContractArgs } from '@zama-fhe/sdk';
@@ -21,29 +22,39 @@ import { WriteContractConfig } from '@zama-fhe/sdk';
2122
import { WriteFunctionName } from '@zama-fhe/sdk';
2223

2324
// @public
24-
export class WagmiSigner implements GenericSigner {
25-
constructor(signerConfig: WagmiSignerConfig);
26-
// (undocumented)
27-
getAddress(): Promise<Address>;
25+
export class WagmiProvider implements GenericProvider {
26+
constructor(providerConfig: WagmiProviderConfig);
2827
// (undocumented)
2928
getBlockTimestamp(): Promise<bigint>;
3029
// (undocumented)
3130
getChainId(): Promise<number>;
3231
// (undocumented)
3332
readContract<const TAbi extends ContractAbi, TFunctionName extends ReadFunctionName<TAbi>, const TArgs extends ReadContractArgs<TAbi, TFunctionName>>(config: ReadContractConfig<TAbi, TFunctionName, TArgs>): Promise<ReadContractReturnType<TAbi, TFunctionName, TArgs>>;
33+
waitForTransactionReceipt(hash: Hex): Promise<TransactionReceipt>;
34+
}
35+
36+
// @public
37+
export interface WagmiProviderConfig {
38+
config: Config;
39+
}
40+
41+
// @public
42+
export class WagmiSigner implements GenericSigner {
43+
constructor(signerConfig: WagmiSignerConfig);
44+
// (undocumented)
45+
getAddress(): Promise<Address>;
46+
// (undocumented)
47+
getChainId(): Promise<number>;
3448
// (undocumented)
3549
signTypedData(typedData: EIP712TypedData): Promise<Hex>;
3650
// (undocumented)
3751
subscribe(input: SignerLifecycleCallbacks): () => void;
3852
// (undocumented)
39-
waitForTransactionReceipt(hash: Hex): Promise<TransactionReceipt>;
40-
// (undocumented)
4153
writeContract<const TAbi extends ContractAbi, TFunctionName extends WriteFunctionName<TAbi>, const TArgs extends WriteContractArgs<TAbi, TFunctionName>>(config: WriteContractConfig<TAbi, TFunctionName, TArgs>): Promise<Hex>;
4254
}
4355

4456
// @public
4557
export interface WagmiSignerConfig {
46-
// (undocumented)
4758
config: Config;
4859
}
4960

packages/react-sdk/etc/react-sdk.api.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { DelegationStatusData } from '@zama-fhe/sdk/query';
2626
import { EIP712TypedData } from '@zama-fhe/sdk';
2727
import { EncryptParams } from '@zama-fhe/sdk';
2828
import { FinalizeUnwrapParams } from '@zama-fhe/sdk/query';
29+
import { GenericProvider } from '@zama-fhe/sdk';
2930
import { GenericSigner } from '@zama-fhe/sdk';
3031
import { GenericStorage } from '@zama-fhe/sdk';
3132
import { PaginatedResult } from '@zama-fhe/sdk';
@@ -36,6 +37,7 @@ import { RelayerSDK } from '@zama-fhe/sdk';
3637
import { ResumeUnshieldParams } from '@zama-fhe/sdk/query';
3738
import { RevokeDelegationParams } from '@zama-fhe/sdk/query';
3839
import { ShieldParams } from '@zama-fhe/sdk/query';
40+
import { Token } from '@zama-fhe/sdk';
3941
import { TokenMetadata } from '@zama-fhe/sdk/query';
4042
import { TokenWrapperPair } from '@zama-fhe/sdk';
4143
import { TokenWrapperPairWithMetadata } from '@zama-fhe/sdk';
@@ -46,6 +48,7 @@ import { UnwrapParams } from '@zama-fhe/sdk/query';
4648
import { UseMutationOptions } from '@tanstack/react-query';
4749
import { UseMutationResult } from '@tanstack/react-query';
4850
import { UseQueryOptions } from '@tanstack/react-query';
51+
import { UseQueryResult } from '@tanstack/react-query';
4952
import { UserDecryptQueryConfig } from '@zama-fhe/sdk/query';
5053
import { ZamaSDK } from '@zama-fhe/sdk';
5154
import { ZamaSDKEventListener } from '@zama-fhe/sdk';
@@ -250,7 +253,13 @@ export interface UseShieldConfig extends UseZamaConfig {
250253
}
251254

252255
// @public
253-
export function useToken(config: UseZamaConfig): _$_zama_fhe_sdk0.Token;
256+
export function useSignerAddress(): UseQueryResult<Address>;
257+
258+
// @public
259+
export function useSignerAddressSuspense(): _$_tanstack_react_query0.UseSuspenseQueryResult<`0x${string}`, Error>;
260+
261+
// @public
262+
export function useToken(config: UseZamaConfig): Token;
254263

255264
// @public
256265
export function useTokenAddress(input: {
@@ -347,6 +356,7 @@ export function ZamaProvider(input: ZamaProviderProps): _$react_jsx_runtime0.JSX
347356
export interface ZamaProviderProps extends PropsWithChildren {
348357
keypairTTL?: number;
349358
onEvent?: ZamaSDKEventListener;
359+
provider: GenericProvider;
350360
registryAddresses?: Record<number, Address>;
351361
registryTTL?: number;
352362
relayer: RelayerSDK;

packages/react-sdk/src/__tests__/provider-hooks-extended.test.tsx

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,23 @@ import { waitFor } from "@testing-library/react";
33
import { ERC7984_WRAPPER_INTERFACE_ID } from "@zama-fhe/sdk";
44
import type { Address } from "@zama-fhe/sdk";
55
import { useUnderlyingAllowance } from "../shield/use-underlying-allowance";
6+
import { useSignerAddress, useSignerAddressSuspense } from "../use-signer-address";
67
import { useUnshield } from "../unshield/use-unshield";
78
import { useUnshieldAll } from "../unshield/use-unshield-all";
89
import { useMetadataSuspense } from "../token/use-metadata";
910
import { useTotalSupplySuspense } from "../token/use-total-supply";
1011
import { useWrapperDiscoverySuspense } from "../token/use-wrapper-discovery";
12+
import { USER } from "./mutation-test-helpers";
1113

1214
describe("useUnderlyingAllowance", () => {
1315
it("returns allowance value", async ({
1416
signer,
1517
tokenAddress,
1618
wrapperAddress,
1719
renderWithProviders,
20+
provider,
1821
}) => {
19-
vi.mocked(signer.readContract)
22+
vi.mocked(provider.readContract)
2023
.mockResolvedValueOnce("0x5e5E5e5e5E5e5E5E5e5E5E5e5e5E5E5E5e5E5E5e")
2124
.mockResolvedValueOnce(5000n);
2225

@@ -31,7 +34,23 @@ describe("useUnderlyingAllowance", () => {
3134

3235
await waitFor(() => expect(result.current.isSuccess).toBe(true));
3336
expect(result.current.data).toBe(5000n);
34-
expect(signer.readContract).toHaveBeenCalled();
37+
expect(provider.readContract).toHaveBeenCalled();
38+
});
39+
});
40+
41+
describe("useSignerAddress", () => {
42+
it("returns the connected signer address", async ({ renderWithProviders }) => {
43+
const { result } = renderWithProviders(() => useSignerAddress());
44+
45+
await waitFor(() => expect(result.current.data).toBe(USER));
46+
});
47+
});
48+
49+
describe("useSignerAddressSuspense", () => {
50+
it("returns the connected signer address", async ({ renderWithProviders }) => {
51+
const { result } = renderWithProviders(() => useSignerAddressSuspense());
52+
53+
await waitFor(() => expect(result.current.data).toBe(USER));
3554
});
3655
});
3756

@@ -54,8 +73,13 @@ describe("useUnshieldAll", () => {
5473
});
5574

5675
describe("useMetadataSuspense", () => {
57-
it("returns metadata via suspense", async ({ signer, tokenAddress, renderWithProviders }) => {
58-
vi.mocked(signer.readContract)
76+
it("returns metadata via suspense", async ({
77+
signer,
78+
tokenAddress,
79+
renderWithProviders,
80+
provider,
81+
}) => {
82+
vi.mocked(provider.readContract)
5983
.mockResolvedValueOnce("TestToken")
6084
.mockResolvedValueOnce("TT")
6185
.mockResolvedValueOnce(18);
@@ -70,8 +94,13 @@ describe("useMetadataSuspense", () => {
7094
});
7195

7296
describe("useTotalSupplySuspense", () => {
73-
it("returns total supply via suspense", async ({ signer, tokenAddress, renderWithProviders }) => {
74-
vi.mocked(signer.readContract).mockImplementation(async (config) => {
97+
it("returns total supply via suspense", async ({
98+
signer,
99+
tokenAddress,
100+
renderWithProviders,
101+
provider,
102+
}) => {
103+
vi.mocked(provider.readContract).mockImplementation(async (config) => {
75104
if (config.functionName === "supportsInterface") {
76105
return config.args[0] === ERC7984_WRAPPER_INTERFACE_ID;
77106
}
@@ -92,10 +121,11 @@ describe("useWrapperDiscoverySuspense", () => {
92121
signer,
93122
tokenAddress,
94123
renderWithProviders,
124+
provider,
95125
}) => {
96126
const wrapperAddr = "0x4D4d4D4d4d4D4D4d4D4D4D4d4d4d4d4D4D4d4d4D" as Address;
97-
vi.mocked(signer.getChainId).mockResolvedValue(1);
98-
vi.mocked(signer.readContract)
127+
vi.mocked(provider.getChainId).mockResolvedValue(1);
128+
vi.mocked(provider.readContract)
99129
.mockResolvedValueOnce([true, wrapperAddr])
100130
.mockResolvedValueOnce(true);
101131

packages/react-sdk/src/__tests__/provider.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ describe("ZamaProvider & useZamaSDK", () => {
5252
const { Wrapper, queryClient } = createWrapper({ signer });
5353
renderHook(() => useZamaSDK(), { wrapper: Wrapper });
5454

55-
const lifecycle = vi.mocked(signer.subscribe!).mock.calls.at(-1)?.[0];
55+
const lifecycle = vi.mocked(signer.subscribe!).mock.calls.at(0)?.[0];
5656
const signerKey = zamaQueryKeys.signerAddress.all;
5757
const balanceKey = zamaQueryKeys.confidentialBalance.token(
5858
"0x1a1A1A1A1a1A1A1a1A1a1a1a1a1a1a1A1A1a1a1a",

packages/react-sdk/src/__tests__/wagmi-signer-subscribe.test.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,26 @@ vi.mock(import("wagmi/actions"), () => ({
2727
}));
2828

2929
import { WagmiSigner } from "../wagmi/wagmi-signer";
30+
import { WagmiProvider } from "../wagmi/wagmi-provider";
3031

3132
interface WagmiFixtures {
33+
wagmiConfig: Config;
3234
wagmiSigner: WagmiSigner;
35+
wagmiProvider: WagmiProvider;
3336
}
3437

3538
const wit = base.extend<WagmiFixtures>({
3639
// eslint-disable-next-line no-empty-pattern
37-
wagmiSigner: async ({}, use) => {
40+
wagmiConfig: async ({}, use) => {
41+
await use({} as unknown as Config);
42+
},
43+
wagmiSigner: async ({ wagmiConfig }, use) => {
3844
capturedOnChange = undefined;
3945
mockUnsubscribe.mockClear();
40-
await use(new WagmiSigner({ config: {} as unknown as Config }));
46+
await use(new WagmiSigner({ config: wagmiConfig }));
47+
},
48+
wagmiProvider: async ({ wagmiConfig }, use) => {
49+
await use(new WagmiProvider({ config: wagmiConfig }));
4150
},
4251
});
4352

@@ -106,9 +115,9 @@ describe("WagmiSigner.subscribe", () => {
106115
});
107116
});
108117

109-
describe("WagmiSigner.getBlockTimestamp", () => {
110-
wit("returns block timestamp from getBlock", async ({ wagmiSigner }) => {
111-
const timestamp = await wagmiSigner.getBlockTimestamp();
118+
describe("WagmiProvider.getBlockTimestamp", () => {
119+
wit("returns block timestamp from getBlock", async ({ wagmiProvider }) => {
120+
const timestamp = await wagmiProvider.getBlockTimestamp();
112121
expect(timestamp).toBe(1700000000n);
113122
});
114123
});
Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,42 @@
11
import { useQuery } from "@tanstack/react-query";
2+
import { waitFor } from "@testing-library/react";
23
import { hashFn, zamaQueryKeys } from "@zama-fhe/sdk/query";
34
import type { Address } from "@zama-fhe/sdk";
45
import { describe, expect, test } from "../../test-fixtures";
56

67
import { useIsAllowed } from "../use-is-allowed";
78

9+
const CONTRACT_A = "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa" as Address;
10+
// Matches the USER constant in sdk/src/test-fixtures.ts used by createMockSigner
11+
const USER_ADDRESS = "0x2b2B2B2b2B2b2B2b2B2b2b2b2B2B2b2b2B2b2B2B" as Address;
12+
813
vi.mock(import("@tanstack/react-query"), async () => {
914
const actual =
1015
await vi.importActual<typeof import("@tanstack/react-query")>("@tanstack/react-query"); // oxlint-disable-line typescript-eslint/consistent-type-imports
1116
return { ...actual, useQuery: vi.fn(() => ({ data: true })) };
1217
});
1318

14-
const CONTRACT_A = "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa" as Address;
19+
vi.mock("../../use-signer-address", () => ({
20+
useSignerAddress: vi.fn(() => ({ data: USER_ADDRESS })),
21+
}));
1522

1623
describe("useIsAllowed", () => {
17-
test("passes the shared queryKeyHashFn", ({ renderWithProviders }) => {
18-
vi.mocked(useQuery)
19-
.mockReturnValueOnce({ data: "0x1a1A1A1A1a1A1A1a1A1a1a1a1a1a1a1A1A1a1a1a" } as never)
20-
.mockReturnValueOnce({ data: true } as never);
24+
test("passes the shared queryKeyHashFn and scopes by signer address", async ({
25+
renderWithProviders,
26+
}) => {
27+
vi.mocked(useQuery).mockReturnValue({ data: true } as never);
2128

2229
renderWithProviders(() => useIsAllowed({ contractAddresses: [CONTRACT_A] }));
2330

24-
expect(vi.mocked(useQuery)).toHaveBeenNthCalledWith(
25-
1,
26-
expect.objectContaining({ queryKeyHashFn: hashFn }),
27-
);
28-
expect(vi.mocked(useQuery)).toHaveBeenNthCalledWith(
29-
2,
30-
expect.objectContaining({
31-
queryKeyHashFn: hashFn,
32-
queryKey: zamaQueryKeys.isAllowed.scope("0x1a1A1A1A1a1A1A1a1A1a1a1a1a1a1a1A1A1a1a1a", [
33-
CONTRACT_A,
34-
]),
35-
}),
36-
);
31+
// After ZamaProvider resolves signer.getAddress() the hook re-renders with the
32+
// signer address in the query key.
33+
await waitFor(() => {
34+
expect(vi.mocked(useQuery)).toHaveBeenCalledWith(
35+
expect.objectContaining({
36+
queryKeyHashFn: hashFn,
37+
queryKey: zamaQueryKeys.isAllowed.scope(USER_ADDRESS, [CONTRACT_A]),
38+
}),
39+
);
40+
});
3741
});
3842
});

0 commit comments

Comments
 (0)