diff --git a/.changeset/four-pants-notice.md b/.changeset/four-pants-notice.md new file mode 100644 index 0000000000..f3f51bf6a9 --- /dev/null +++ b/.changeset/four-pants-notice.md @@ -0,0 +1,5 @@ +--- +"wagmi": minor +--- + +Added `useRequestPermissions` hook. diff --git a/.changeset/seven-terms-guess.md b/.changeset/seven-terms-guess.md new file mode 100644 index 0000000000..44a4436c3c --- /dev/null +++ b/.changeset/seven-terms-guess.md @@ -0,0 +1,5 @@ +--- +"@wagmi/core": minor +--- + +Added `requestPermissions` action. diff --git a/packages/core/src/actions/requestPermissions.test.ts b/packages/core/src/actions/requestPermissions.test.ts new file mode 100644 index 0000000000..bf3d5f1b83 --- /dev/null +++ b/packages/core/src/actions/requestPermissions.test.ts @@ -0,0 +1,30 @@ +import { accounts, config } from '@wagmi/test' +import { expect, test } from 'vitest' + +import { connect } from './connect.js' +import { disconnect } from './disconnect.js' +import { requestPermissions } from './requestPermissions.js' + +const connector = config.connectors[0]! + +test('default', async () => { + await connect(config, { connector }) + try { + await expect( + requestPermissions(config, { eth_accounts: {} }), + ).resolves.toEqual([ + { + caveats: [ + { + type: 'filterResponse', + value: accounts, + }, + ], + invoker: 'https://example.com', + parentCapability: 'eth_accounts', + }, + ]) + } finally { + await disconnect(config, { connector }) + } +}) diff --git a/packages/core/src/actions/requestPermissions.ts b/packages/core/src/actions/requestPermissions.ts new file mode 100644 index 0000000000..e856ac0cf5 --- /dev/null +++ b/packages/core/src/actions/requestPermissions.ts @@ -0,0 +1,46 @@ +import { + type RequestPermissionsErrorType as viem_RequestPermissionsErrorType, + type RequestPermissionsParameters as viem_RequestPermissionsParameters, + type RequestPermissionsReturnType as viem_RequestPermissionsReturnType, + requestPermissions as viem_requestPermissions, +} from 'viem/actions' +import type { Config } from '../createConfig.js' +import type { BaseErrorType, ErrorType } from '../errors/base.js' +import type { ConnectorParameter } from '../types/properties.js' +import type { Compute } from '../types/utils.js' +import { getAction } from '../utils/getAction.js' +import { + type GetConnectorClientErrorType, + getConnectorClient, +} from './getConnectorClient.js' + +export type RequestPermissionsParameters = Compute< + viem_RequestPermissionsParameters & ConnectorParameter +> + +export type RequestPermissionsReturnType = viem_RequestPermissionsReturnType + +export type RequestPermissionsErrorType = + // getConnectorClient() + | GetConnectorClientErrorType + // base + | BaseErrorType + | ErrorType + // viem + | viem_RequestPermissionsErrorType + +/** https://wagmi.sh/core/api/actions/requestPermissions */ +export async function requestPermissions( + config: Config, + parameters: RequestPermissionsParameters, +): Promise { + const { connector, ...rest } = parameters + const client = await getConnectorClient(config, { connector }) + + const action = getAction( + client, + viem_requestPermissions, + 'requestPermissions', + ) + return action(rest) +} diff --git a/packages/core/src/connectors/mock.test.ts b/packages/core/src/connectors/mock.test.ts index 90e9d6f8b9..45386156e3 100644 --- a/packages/core/src/connectors/mock.test.ts +++ b/packages/core/src/connectors/mock.test.ts @@ -72,6 +72,7 @@ test('behavior: connector.getProvider request errors', async () => { const connectorFn = mock({ accounts, features: { + requestPermissionsError: true, signMessageError: true, signTypedDataError: true, switchChainError: true, @@ -83,6 +84,18 @@ test('behavior: connector.getProvider request errors', async () => { ) as ReturnType const provider = await connector.getProvider() + await expect( + provider.request({ + method: 'wallet_requestPermissions', + params: [{ eth_accounts: {} }], + }), + ).rejects.toThrowErrorMatchingInlineSnapshot(` + [UserRejectedRequestError: User rejected the request. + + Details: Failed to request permissions. + Version: viem@2.55.7] + `) + await expect( provider.request({ method: 'eth_signTypedData_v4', diff --git a/packages/core/src/connectors/mock.ts b/packages/core/src/connectors/mock.ts index b8ba0b2a4d..a5b201e48e 100644 --- a/packages/core/src/connectors/mock.ts +++ b/packages/core/src/connectors/mock.ts @@ -34,6 +34,7 @@ export type MockParameters = { signMessageError?: boolean | Error | undefined signTypedDataError?: boolean | Error | undefined reconnect?: boolean | undefined + requestPermissionsError?: boolean | Error | undefined watchAssetError?: boolean | Error | undefined } | undefined @@ -176,6 +177,28 @@ export function mock(parameters: MockParameters) { } // wallet methods + if (method === 'wallet_requestPermissions') { + if (features.requestPermissionsError) { + if (typeof features.requestPermissionsError === 'boolean') + throw new UserRejectedRequestError( + new Error('Failed to request permissions.'), + ) + throw features.requestPermissionsError + } + return [ + { + invoker: 'https://example.com', + parentCapability: 'eth_accounts', + caveats: [ + { + type: 'filterResponse', + value: parameters.accounts, + }, + ], + }, + ] + } + if (method === 'wallet_switchEthereumChain') { if (features.switchChainError) { if (typeof features.switchChainError === 'boolean') diff --git a/packages/core/src/exports/actions.test.ts b/packages/core/src/exports/actions.test.ts index 059fa6ea6c..accc838a71 100644 --- a/packages/core/src/exports/actions.test.ts +++ b/packages/core/src/exports/actions.test.ts @@ -49,6 +49,7 @@ test('exports', () => { "readContract", "readContracts", "reconnect", + "requestPermissions", "sendCalls", "sendTransaction", "showCallsStatus", diff --git a/packages/core/src/exports/actions.ts b/packages/core/src/exports/actions.ts index 66d04c3d7d..9ee46ab955 100644 --- a/packages/core/src/exports/actions.ts +++ b/packages/core/src/exports/actions.ts @@ -293,6 +293,13 @@ export { reconnect, } from '../actions/reconnect.js' +export { + type RequestPermissionsErrorType, + type RequestPermissionsParameters, + type RequestPermissionsReturnType, + requestPermissions, +} from '../actions/requestPermissions.js' + export { type SendCallsErrorType, type SendCallsParameters, diff --git a/packages/core/src/exports/index.test.ts b/packages/core/src/exports/index.test.ts index d39172ec31..c9aaebc8b0 100644 --- a/packages/core/src/exports/index.test.ts +++ b/packages/core/src/exports/index.test.ts @@ -49,6 +49,7 @@ test('exports', () => { "readContract", "readContracts", "reconnect", + "requestPermissions", "sendCalls", "sendCallsSync", "sendTransaction", diff --git a/packages/core/src/exports/index.ts b/packages/core/src/exports/index.ts index 87e3158302..d67a41cdbd 100644 --- a/packages/core/src/exports/index.ts +++ b/packages/core/src/exports/index.ts @@ -295,6 +295,13 @@ export { reconnect, } from '../actions/reconnect.js' +export { + type RequestPermissionsErrorType, + type RequestPermissionsParameters, + type RequestPermissionsReturnType, + requestPermissions, +} from '../actions/requestPermissions.js' + export { type SendCallsErrorType, type SendCallsParameters, diff --git a/packages/core/src/exports/query.test.ts b/packages/core/src/exports/query.test.ts index a411bf1a81..6cce635159 100644 --- a/packages/core/src/exports/query.test.ts +++ b/packages/core/src/exports/query.test.ts @@ -73,6 +73,7 @@ test('exports', () => { "readContractsQueryKey", "readContractsQueryOptions", "reconnectMutationOptions", + "requestPermissionsMutationOptions", "sendCallsMutationOptions", "sendCallsSyncMutationOptions", "sendTransactionMutationOptions", diff --git a/packages/core/src/exports/query.ts b/packages/core/src/exports/query.ts index 6fcb8616ff..8e65942b1b 100644 --- a/packages/core/src/exports/query.ts +++ b/packages/core/src/exports/query.ts @@ -362,6 +362,16 @@ export { reconnectMutationOptions, } from '../query/reconnect.js' +export { + type RequestPermissionsData, + type RequestPermissionsMutate, + type RequestPermissionsMutateAsync, + type RequestPermissionsMutationOptions, + type RequestPermissionsOptions, + type RequestPermissionsVariables, + requestPermissionsMutationOptions, +} from '../query/requestPermissions.js' + export { type SendCallsData, type SendCallsMutate, diff --git a/packages/core/src/query/requestPermissions.test.ts b/packages/core/src/query/requestPermissions.test.ts new file mode 100644 index 0000000000..a0181ee2aa --- /dev/null +++ b/packages/core/src/query/requestPermissions.test.ts @@ -0,0 +1,45 @@ +import { accounts, config } from '@wagmi/test' +import { expect, test } from 'vitest' + +import { connect } from '../actions/connect.js' +import { disconnect } from '../actions/disconnect.js' +import { requestPermissionsMutationOptions } from './requestPermissions.js' + +const connector = config.connectors[0]! + +test('default', () => { + expect(requestPermissionsMutationOptions(config)).toMatchInlineSnapshot(` + { + "mutationFn": [Function], + "mutationKey": [ + "requestPermissions", + ], + } + `) +}) + +test('behavior: mutationFn', async () => { + await connect(config, { connector }) + try { + const options = requestPermissionsMutationOptions(config) + await expect( + options.mutationFn?.({ + connector, + eth_accounts: {}, + }), + ).resolves.toEqual([ + { + caveats: [ + { + type: 'filterResponse', + value: accounts, + }, + ], + invoker: 'https://example.com', + parentCapability: 'eth_accounts', + }, + ]) + } finally { + await disconnect(config, { connector }) + } +}) diff --git a/packages/core/src/query/requestPermissions.ts b/packages/core/src/query/requestPermissions.ts new file mode 100644 index 0000000000..35b648f72a --- /dev/null +++ b/packages/core/src/query/requestPermissions.ts @@ -0,0 +1,55 @@ +import type { MutationOptions } from '@tanstack/query-core' +import { + type RequestPermissionsErrorType, + type RequestPermissionsParameters, + type RequestPermissionsReturnType, + requestPermissions, +} from '../actions/requestPermissions.js' +import type { Config } from '../createConfig.js' +import type { MutationParameter } from '../types/query.js' +import type { Compute } from '../types/utils.js' +import type { Mutate, MutateAsync } from './types.js' + +export type RequestPermissionsOptions = MutationParameter< + RequestPermissionsData, + RequestPermissionsErrorType, + RequestPermissionsVariables, + context +> + +export function requestPermissionsMutationOptions( + config: Config, + options: RequestPermissionsOptions = {}, +): RequestPermissionsMutationOptions { + return { + ...(options.mutation as any), + mutationFn(variables) { + return requestPermissions(config, variables) + }, + mutationKey: ['requestPermissions'], + } +} + +export type RequestPermissionsMutationOptions = MutationOptions< + RequestPermissionsData, + RequestPermissionsErrorType, + RequestPermissionsVariables +> + +export type RequestPermissionsData = RequestPermissionsReturnType + +export type RequestPermissionsVariables = Compute + +export type RequestPermissionsMutate = Mutate< + RequestPermissionsData, + RequestPermissionsErrorType, + RequestPermissionsVariables, + context +> + +export type RequestPermissionsMutateAsync = MutateAsync< + RequestPermissionsData, + RequestPermissionsErrorType, + RequestPermissionsVariables, + context +> diff --git a/packages/react/src/exports/actions.test.ts b/packages/react/src/exports/actions.test.ts index 729cf85da3..377ca6f2bb 100644 --- a/packages/react/src/exports/actions.test.ts +++ b/packages/react/src/exports/actions.test.ts @@ -49,6 +49,7 @@ test('exports', () => { "readContract", "readContracts", "reconnect", + "requestPermissions", "sendCalls", "sendTransaction", "showCallsStatus", diff --git a/packages/react/src/exports/index.test.ts b/packages/react/src/exports/index.test.ts index c70ebf9930..3781b03e38 100644 --- a/packages/react/src/exports/index.test.ts +++ b/packages/react/src/exports/index.test.ts @@ -75,6 +75,7 @@ test('exports', () => { "useReadContract", "useReadContracts", "useReconnect", + "useRequestPermissions", "useSendCalls", "useSendCallsSync", "useSendTransaction", diff --git a/packages/react/src/exports/index.ts b/packages/react/src/exports/index.ts index e0be24aab3..c9faa4cc65 100644 --- a/packages/react/src/exports/index.ts +++ b/packages/react/src/exports/index.ts @@ -267,6 +267,12 @@ export { useReconnect, } from '../hooks/useReconnect.js' +export { + type UseRequestPermissionsParameters, + type UseRequestPermissionsReturnType, + useRequestPermissions, +} from '../hooks/useRequestPermissions.js' + export { type UseSendCallsParameters, type UseSendCallsReturnType, diff --git a/packages/react/src/exports/query.test.ts b/packages/react/src/exports/query.test.ts index c56974316c..e865e1bc18 100644 --- a/packages/react/src/exports/query.test.ts +++ b/packages/react/src/exports/query.test.ts @@ -74,6 +74,7 @@ test('exports', () => { "readContractsQueryKey", "readContractsQueryOptions", "reconnectMutationOptions", + "requestPermissionsMutationOptions", "sendCallsMutationOptions", "sendCallsSyncMutationOptions", "sendTransactionMutationOptions", diff --git a/packages/react/src/hooks/useRequestPermissions.test-d.ts b/packages/react/src/hooks/useRequestPermissions.test-d.ts new file mode 100644 index 0000000000..175f4cd070 --- /dev/null +++ b/packages/react/src/hooks/useRequestPermissions.test-d.ts @@ -0,0 +1,66 @@ +import type { RequestPermissionsErrorType } from '@wagmi/core' +import type { RequestPermissionsVariables } from '@wagmi/core/query' +import type { WalletPermission } from 'viem' +import { expectTypeOf, test } from 'vitest' +import { useRequestPermissions } from './useRequestPermissions.js' + +const contextValue = { foo: 'bar' } as const + +test('context', () => { + const { context, data, error, requestPermissions, variables } = + useRequestPermissions({ + mutation: { + onMutate(variables) { + expectTypeOf(variables).toEqualTypeOf() + return contextValue + }, + onError(error, variables, context) { + expectTypeOf(variables).toEqualTypeOf() + expectTypeOf(error).toEqualTypeOf() + expectTypeOf(context).toEqualTypeOf() + }, + onSuccess(data, variables, context) { + expectTypeOf(variables).toEqualTypeOf() + expectTypeOf(data).toEqualTypeOf() + expectTypeOf(context).toEqualTypeOf() + }, + onSettled(data, error, variables, context) { + expectTypeOf(data).toEqualTypeOf() + expectTypeOf( + error, + ).toEqualTypeOf() + expectTypeOf(variables).toEqualTypeOf() + expectTypeOf(context).toEqualTypeOf() + }, + }, + }) + + expectTypeOf(data).toEqualTypeOf() + expectTypeOf(error).toEqualTypeOf() + expectTypeOf(variables).toEqualTypeOf< + RequestPermissionsVariables | undefined + >() + expectTypeOf(context).toEqualTypeOf() + + requestPermissions( + { eth_accounts: {} }, + { + onError(error, variables, context) { + expectTypeOf(variables).toEqualTypeOf() + expectTypeOf(error).toEqualTypeOf() + expectTypeOf(context).toEqualTypeOf() + }, + onSuccess(data, variables, context) { + expectTypeOf(variables).toEqualTypeOf() + expectTypeOf(data).toEqualTypeOf() + expectTypeOf(context).toEqualTypeOf() + }, + onSettled(data, error, variables, context) { + expectTypeOf(data).toEqualTypeOf() + expectTypeOf(error).toEqualTypeOf() + expectTypeOf(variables).toEqualTypeOf() + expectTypeOf(context).toEqualTypeOf() + }, + }, + ) +}) diff --git a/packages/react/src/hooks/useRequestPermissions.test.ts b/packages/react/src/hooks/useRequestPermissions.test.ts new file mode 100644 index 0000000000..003115ef01 --- /dev/null +++ b/packages/react/src/hooks/useRequestPermissions.test.ts @@ -0,0 +1,36 @@ +import { connect, disconnect } from '@wagmi/core' +import { config } from '@wagmi/test' +import { renderHook } from '@wagmi/test/react' +import { expect, test, vi } from 'vitest' + +import { useRequestPermissions } from './useRequestPermissions.js' + +const connector = config.connectors[0]! + +test('default', async () => { + await connect(config, { connector }) + + const { result } = await renderHook(() => useRequestPermissions()) + + result.current.mutate({ eth_accounts: {} }) + await vi.waitUntil(() => result.current.isSuccess, { timeout: 5_000 }) + + expect(result.current.data).toMatchInlineSnapshot(` + [ + { + "caveats": [ + { + "type": "filterResponse", + "value": [ + "0x0c54fccd2e384b4bb6f2e405bf5cbc15a017aafb", + ], + }, + ], + "invoker": "https://example.com", + "parentCapability": "eth_accounts", + }, + ] + `) + + await disconnect(config, { connector }) +}) diff --git a/packages/react/src/hooks/useRequestPermissions.ts b/packages/react/src/hooks/useRequestPermissions.ts new file mode 100644 index 0000000000..1a62c2c905 --- /dev/null +++ b/packages/react/src/hooks/useRequestPermissions.ts @@ -0,0 +1,49 @@ +'use client' +import { useMutation } from '@tanstack/react-query' +import type { RequestPermissionsErrorType } from '@wagmi/core' +import type { Compute, ConfigParameter } from '@wagmi/core/internal' +import { + type RequestPermissionsData, + type RequestPermissionsMutate, + type RequestPermissionsMutateAsync, + type RequestPermissionsOptions, + type RequestPermissionsVariables, + requestPermissionsMutationOptions, +} from '@wagmi/core/query' +import type { UseMutationReturnType } from '../utils/query.js' +import { useConfig } from './useConfig.js' + +export type UseRequestPermissionsParameters = Compute< + ConfigParameter & RequestPermissionsOptions +> + +export type UseRequestPermissionsReturnType = Compute< + UseMutationReturnType< + RequestPermissionsData, + RequestPermissionsErrorType, + RequestPermissionsVariables, + context, + RequestPermissionsMutate, + RequestPermissionsMutateAsync + > & { + /** @deprecated use `mutate` instead */ + requestPermissions: RequestPermissionsMutate + /** @deprecated use `mutateAsync` instead */ + requestPermissionsAsync: RequestPermissionsMutateAsync + } +> + +/** https://wagmi.sh/react/api/hooks/useRequestPermissions */ +export function useRequestPermissions( + parameters: UseRequestPermissionsParameters = {}, +): UseRequestPermissionsReturnType { + const config = useConfig(parameters) + const options = requestPermissionsMutationOptions(config, parameters) + const mutation = useMutation(options) + type Return = UseRequestPermissionsReturnType + return { + ...(mutation as Return), + requestPermissions: mutation.mutate as Return['mutate'], + requestPermissionsAsync: mutation.mutateAsync as Return['mutateAsync'], + } +} diff --git a/packages/solid/src/exports/actions.test.ts b/packages/solid/src/exports/actions.test.ts index 729cf85da3..377ca6f2bb 100644 --- a/packages/solid/src/exports/actions.test.ts +++ b/packages/solid/src/exports/actions.test.ts @@ -49,6 +49,7 @@ test('exports', () => { "readContract", "readContracts", "reconnect", + "requestPermissions", "sendCalls", "sendTransaction", "showCallsStatus", diff --git a/packages/solid/src/exports/query.test.ts b/packages/solid/src/exports/query.test.ts index c56974316c..e865e1bc18 100644 --- a/packages/solid/src/exports/query.test.ts +++ b/packages/solid/src/exports/query.test.ts @@ -74,6 +74,7 @@ test('exports', () => { "readContractsQueryKey", "readContractsQueryOptions", "reconnectMutationOptions", + "requestPermissionsMutationOptions", "sendCallsMutationOptions", "sendCallsSyncMutationOptions", "sendTransactionMutationOptions", diff --git a/packages/vue/src/exports/actions.test.ts b/packages/vue/src/exports/actions.test.ts index 059fa6ea6c..accc838a71 100644 --- a/packages/vue/src/exports/actions.test.ts +++ b/packages/vue/src/exports/actions.test.ts @@ -49,6 +49,7 @@ test('exports', () => { "readContract", "readContracts", "reconnect", + "requestPermissions", "sendCalls", "sendTransaction", "showCallsStatus", diff --git a/packages/vue/src/exports/query.test.ts b/packages/vue/src/exports/query.test.ts index c5e492a7e7..32f4a675c4 100644 --- a/packages/vue/src/exports/query.test.ts +++ b/packages/vue/src/exports/query.test.ts @@ -75,6 +75,7 @@ test('exports', () => { "readContractsQueryKey", "readContractsQueryOptions", "reconnectMutationOptions", + "requestPermissionsMutationOptions", "sendCallsMutationOptions", "sendCallsSyncMutationOptions", "sendTransactionMutationOptions", diff --git a/site/.vitepress/sidebar.ts b/site/.vitepress/sidebar.ts index ff646dfe25..ecef1820c4 100644 --- a/site/.vitepress/sidebar.ts +++ b/site/.vitepress/sidebar.ts @@ -267,6 +267,10 @@ export function getSidebar() { link: '/react/api/hooks/useReadContracts', }, { text: 'useReconnect', link: '/react/api/hooks/useReconnect' }, + { + text: 'useRequestPermissions', + link: '/react/api/hooks/useRequestPermissions', + }, { text: 'useSendCalls', link: '/react/api/hooks/useSendCalls', @@ -918,6 +922,10 @@ export function getSidebar() { text: 'readContracts', link: '/core/api/actions/readContracts', }, + { + text: 'requestPermissions', + link: '/core/api/actions/requestPermissions', + }, { text: 'sendCalls', link: '/core/api/actions/sendCalls', diff --git a/site/core/api/actions/requestPermissions.md b/site/core/api/actions/requestPermissions.md new file mode 100644 index 0000000000..0fb6cdc5c9 --- /dev/null +++ b/site/core/api/actions/requestPermissions.md @@ -0,0 +1,89 @@ + + +# requestPermissions + +Action for requesting permissions for a wallet. + +## Import + +```ts +import { requestPermissions } from '@wagmi/core' +``` + +## Usage + +::: code-group +```ts [index.ts] +import { requestPermissions } from '@wagmi/core' +import { config } from './config' + +const permissions = await requestPermissions(config, { + eth_accounts: {}, +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +## Parameters + +```ts +import { type RequestPermissionsParameters } from '@wagmi/core' +``` + +### eth_accounts + +`Record` + +Account permissions to request from the wallet. + +```ts +const permissions = await requestPermissions(config, { + eth_accounts: {}, // [!code focus] +}) +``` + +### connector + +`Connector | undefined` + +[Connector](/core/api/connectors) to request permissions from. + +::: code-group +```ts [index.ts] +import { getConnection, requestPermissions } from '@wagmi/core' +import { config } from './config' + +const { connector } = getConnection(config) +const permissions = await requestPermissions(config, { + connector, // [!code focus] + eth_accounts: {}, +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +## Return Type + +```ts +import { type RequestPermissionsReturnType } from '@wagmi/core' +``` + +[`WalletPermission[]`](https://viem.sh/docs/glossary/types#walletpermission) + +The wallet permissions. + +## Error + +```ts +import { type RequestPermissionsErrorType } from '@wagmi/core' +``` + + + +## Viem + +- [`requestPermissions`](https://viem.sh/docs/actions/wallet/requestPermissions.html) diff --git a/site/react/api/hooks/useRequestPermissions.md b/site/react/api/hooks/useRequestPermissions.md new file mode 100644 index 0000000000..5e843fc07c --- /dev/null +++ b/site/react/api/hooks/useRequestPermissions.md @@ -0,0 +1,89 @@ +--- +title: useRequestPermissions +description: Hook for requesting permissions for a wallet. +--- + + + +# useRequestPermissions + +Hook for requesting permissions for a wallet. + +## Import + +```ts +import { useRequestPermissions } from 'wagmi' +``` + +## Usage + +::: code-group +```tsx [index.tsx] +import { useRequestPermissions } from 'wagmi' + +function App() { + const { requestPermissions } = useRequestPermissions() + + return ( + + ) +} +``` +<<< @/snippets/react/config.ts[config.ts] +::: + +## Parameters + +```ts +import { type UseRequestPermissionsParameters } from 'wagmi' +``` + +### config + +`Config | undefined` + +[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider). + +::: code-group +```tsx [index.tsx] +import { useRequestPermissions } from 'wagmi' +import { config } from './config' // [!code focus] + +function App() { + const result = useRequestPermissions({ + config, // [!code focus] + }) +} +``` +<<< @/snippets/react/config.ts[config.ts] +::: + + + +## Return Type + +```ts +import { type UseRequestPermissionsReturnType } from 'wagmi' +``` + + + + + +## Action + +- [`requestPermissions`](/core/api/actions/requestPermissions)