Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/old-foxes-grow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@wagmi/core": minor
---

Added `prepareAuthorization` and `signAuthorization` actions.
5 changes: 5 additions & 0 deletions .changeset/shy-schools-think.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"wagmi": minor
---

Added `usePrepareAuthorization` and `useSignAuthorization` hooks.
19 changes: 19 additions & 0 deletions packages/core/src/actions/prepareAuthorization.test-d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { address, config, privateKey } from '@wagmi/test'
import { privateKeyToAccount } from 'viem/accounts'
import { expectTypeOf, test } from 'vitest'

import { prepareAuthorization } from './prepareAuthorization.js'

const account = privateKeyToAccount(privateKey)

test('default', async () => {
const result = await prepareAuthorization(config, {
account,
contractAddress: address.wagmiMintExample,
chainId: 1,
nonce: 0,
})

expectTypeOf(result.chainId).toEqualTypeOf<number>()
expectTypeOf(result.address).toEqualTypeOf<`0x${string}`>()
})
46 changes: 46 additions & 0 deletions packages/core/src/actions/prepareAuthorization.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { address, config, privateKey } from '@wagmi/test'
import { privateKeyToAccount } from 'viem/accounts'
import { expect, test } from 'vitest'
import { connect } from './connect.js'
import { disconnect } from './disconnect.js'
import { prepareAuthorization } from './prepareAuthorization.js'

const account = privateKeyToAccount(privateKey)
const connector = config.connectors[0]!

test('default', async () => {
await expect(
prepareAuthorization(config, {
account,
contractAddress: address.wagmiMintExample,
chainId: config.chains[0].id,
nonce: 0,
}),
).resolves.toMatchInlineSnapshot(`
{
"address": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2",
"chainId": 1,
"nonce": 0,
}
`)
})

test('behavior: account from connection', async () => {
await connect(config, { connector })

await expect(
prepareAuthorization(config, {
contractAddress: address.wagmiMintExample,
chainId: config.chains[0].id,
nonce: 0,
}),
).resolves.toMatchInlineSnapshot(`
{
"address": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2",
"chainId": 1,
"nonce": 0,
}
`)

await disconnect(config, { connector })
})
44 changes: 44 additions & 0 deletions packages/core/src/actions/prepareAuthorization.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import type { Account } from 'viem'
import {
type PrepareAuthorizationErrorType as viem_PrepareAuthorizationErrorType,
type PrepareAuthorizationParameters as viem_PrepareAuthorizationParameters,
type PrepareAuthorizationReturnType as viem_PrepareAuthorizationReturnType,
prepareAuthorization as viem_prepareAuthorization,
} from 'viem/actions'

import type { Config } from '../createConfig.js'
import type { ChainIdParameter } from '../types/properties.js'
import type { Compute } from '../types/utils.js'
import { getAction } from '../utils/getAction.js'
import { getConnection } from './getConnection.js'

export type PrepareAuthorizationParameters<config extends Config = Config> =
Compute<
ChainIdParameter<config> & viem_PrepareAuthorizationParameters<Account>
>

export type PrepareAuthorizationReturnType = viem_PrepareAuthorizationReturnType

export type PrepareAuthorizationErrorType = viem_PrepareAuthorizationErrorType

/** https://wagmi.sh/core/api/actions/prepareAuthorization */
export async function prepareAuthorization<config extends Config>(
config: config,
parameters: PrepareAuthorizationParameters<config>,
): Promise<PrepareAuthorizationReturnType> {
const { chainId, account: account_, ...rest } = parameters

const account = account_ ?? getConnection(config).address
const client = config.getClient({ chainId })

const action = getAction(
client,
viem_prepareAuthorization,
'prepareAuthorization',
)
return action({
...rest,
...(account ? { account } : {}),
chainId,
} as viem_PrepareAuthorizationParameters<Account>)
}
67 changes: 67 additions & 0 deletions packages/core/src/actions/signAuthorization.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { address, config, privateKey } from '@wagmi/test'
import { privateKeyToAccount } from 'viem/accounts'
import { expect, test } from 'vitest'
import { connect } from './connect.js'
import { disconnect } from './disconnect.js'
import { signAuthorization } from './signAuthorization.js'

const account = privateKeyToAccount(privateKey)
const connector = config.connectors[0]!

test('default', async () => {
await connect(config, { connector })
await expect(
signAuthorization(config, {
account,
contractAddress: address.wagmiMintExample,
chainId: config.chains[0].id,
nonce: 0,
}),
).resolves.toMatchInlineSnapshot(
`
{
"chainId": 1,
"contractAddress": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2",
"nonce": 0,
"r": "0xff5d79daa56d5aae2657e8950af71377f8c2860255a9c915948c071ef9286def",
"s": "0x17318a10ff56f0000a350a210fdb312ba22260a64f38dddc135912a6c4795c1d",
"v": 27n,
"yParity": 0,
}`,
)
await disconnect(config, { connector })
})

test('behavior: not connected', async () => {
await expect(
signAuthorization(config, {
account,
contractAddress: address.wagmiMintExample,
chainId: config.chains[0].id,
nonce: 0,
}),
).rejects.toThrowErrorMatchingInlineSnapshot(`
[ConnectorNotConnectedError: Connector not connected.

Version: @wagmi/core@x.y.z]
`)
})

test('behavior: unsupported account type', async () => {
await connect(config, { connector })
await expect(
signAuthorization(config, {
contractAddress: address.wagmiMintExample,
chainId: config.chains[0].id,
nonce: 0,
}),
).rejects.toThrowErrorMatchingInlineSnapshot(`
[AccountTypeNotSupportedError: Account type "json-rpc" is not supported.

The \`signAuthorization\` Action does not support JSON-RPC Accounts.

Docs: https://viem.sh/experimental/eip7702/signAuthorization
Version: viem@2.21.40]
`)
await disconnect(config, { connector })
})
51 changes: 51 additions & 0 deletions packages/core/src/actions/signAuthorization.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import type { Account } from 'viem'
import {
type SignAuthorizationErrorType as viem_SignAuthorizationErrorType,
type SignAuthorizationParameters as viem_SignAuthorizationParameters,
type SignAuthorizationReturnType as viem_SignAuthorizationReturnType,
signAuthorization as viem_signAuthorization,
} 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 {
type GetConnectorClientErrorType,
getConnectorClient,
} from './getConnectorClient.js'

export type SignAuthorizationParameters = Compute<
viem_SignAuthorizationParameters<Account> & ConnectorParameter
>

export type SignAuthorizationReturnType = viem_SignAuthorizationReturnType

export type SignAuthorizationErrorType =
// getConnectorClient()
| GetConnectorClientErrorType
// base
| BaseErrorType
| ErrorType
// viem
| viem_SignAuthorizationErrorType

/** https://wagmi.sh/core/api/actions/signAuthorization */
export async function signAuthorization<config extends Config>(
config: config,
parameters: SignAuthorizationParameters,
): Promise<SignAuthorizationReturnType> {
const { account, chainId, connector, ...rest } = parameters

const client = await getConnectorClient(config, {
account,
chainId,
connector,
})

return viem_signAuthorization(client, {
...rest,
account,
chainId,
})
}
2 changes: 2 additions & 0 deletions packages/core/src/exports/actions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,15 @@ test('exports', () => {
"getTransactionReceipt",
"getWalletClient",
"multicall",
"prepareAuthorization",
"prepareTransactionRequest",
"readContract",
"readContracts",
"reconnect",
"sendCalls",
"sendTransaction",
"showCallsStatus",
"signAuthorization",
"signMessage",
"signTypedData",
"simulateContract",
Expand Down
14 changes: 14 additions & 0 deletions packages/core/src/exports/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,13 @@ export {
multicall,
} from '../actions/multicall.js'

export {
type PrepareAuthorizationErrorType,
type PrepareAuthorizationParameters,
type PrepareAuthorizationReturnType,
prepareAuthorization,
} from '../actions/prepareAuthorization.js'

export {
type PrepareTransactionRequestErrorType,
type PrepareTransactionRequestParameters,
Expand Down Expand Up @@ -314,6 +321,13 @@ export {
showCallsStatus,
} from '../actions/showCallsStatus.js'

export {
type SignAuthorizationErrorType,
type SignAuthorizationParameters,
type SignAuthorizationReturnType,
signAuthorization,
} from '../actions/signAuthorization.js'

export {
type SignMessageErrorType,
type SignMessageParameters,
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/exports/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ test('exports', () => {
"getTransactionReceipt",
"getWalletClient",
"multicall",
"prepareAuthorization",
"prepareTransactionRequest",
"readContract",
"readContracts",
Expand All @@ -54,6 +55,7 @@ test('exports', () => {
"sendTransaction",
"sendTransactionSync",
"showCallsStatus",
"signAuthorization",
"signMessage",
"signTypedData",
"simulateContract",
Expand Down
14 changes: 14 additions & 0 deletions packages/core/src/exports/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,13 @@ export {
multicall,
} from '../actions/multicall.js'

export {
type PrepareAuthorizationErrorType,
type PrepareAuthorizationParameters,
type PrepareAuthorizationReturnType,
prepareAuthorization,
} from '../actions/prepareAuthorization.js'

export {
type PrepareTransactionRequestErrorType,
type PrepareTransactionRequestParameters,
Expand Down Expand Up @@ -330,6 +337,13 @@ export {
showCallsStatus,
} from '../actions/showCallsStatus.js'

export {
type SignAuthorizationErrorType,
type SignAuthorizationParameters,
type SignAuthorizationReturnType,
signAuthorization,
} from '../actions/signAuthorization.js'

export {
type SignMessageErrorType,
type SignMessageParameters,
Expand Down
3 changes: 3 additions & 0 deletions packages/core/src/exports/query.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ test('exports', () => {
"getWalletClientQueryOptions",
"infiniteReadContractsQueryKey",
"infiniteReadContractsQueryOptions",
"prepareAuthorizationQueryKey",
"prepareAuthorizationQueryOptions",
"prepareTransactionRequestQueryKey",
"prepareTransactionRequestQueryOptions",
"readContractQueryKey",
Expand All @@ -78,6 +80,7 @@ test('exports', () => {
"sendTransactionMutationOptions",
"sendTransactionSyncMutationOptions",
"showCallsStatusMutationOptions",
"signAuthorizationMutationOptions",
"signMessageMutationOptions",
"signTypedDataMutationOptions",
"simulateContractQueryKey",
Expand Down
20 changes: 20 additions & 0 deletions packages/core/src/exports/query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,16 @@ export {
infiniteReadContractsQueryOptions,
} from '../query/infiniteReadContracts.js'

export {
type PrepareAuthorizationData,
type PrepareAuthorizationOptions,
type PrepareAuthorizationQueryFnData,
type PrepareAuthorizationQueryKey,
type PrepareAuthorizationQueryOptions,
prepareAuthorizationQueryKey,
prepareAuthorizationQueryOptions,
} from '../query/prepareAuthorization.js'

export {
type PrepareTransactionRequestData,
type PrepareTransactionRequestOptions,
Expand Down Expand Up @@ -412,6 +422,16 @@ export {
showCallsStatusMutationOptions,
} from '../query/showCallsStatus.js'

export {
type SignAuthorizationData,
type SignAuthorizationMutate,
type SignAuthorizationMutateAsync,
type SignAuthorizationMutationOptions,
type SignAuthorizationOptions,
type SignAuthorizationVariables,
signAuthorizationMutationOptions,
} from '../query/signAuthorization.js'

export {
type SignMessageData,
type SignMessageMutate,
Expand Down
Loading
Loading