viem 2.13.9 → 2.14.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.
Files changed (70) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/_cjs/actions/index.js +4 -2
  3. package/_cjs/actions/index.js.map +1 -1
  4. package/_cjs/actions/public/call.js +24 -2
  5. package/_cjs/actions/public/call.js.map +1 -1
  6. package/_cjs/actions/public/getEip712Domain.js +56 -0
  7. package/_cjs/actions/public/getEip712Domain.js.map +1 -0
  8. package/_cjs/actions/public/readContract.js.map +1 -1
  9. package/_cjs/clients/decorators/public.js +2 -0
  10. package/_cjs/clients/decorators/public.js.map +1 -1
  11. package/_cjs/constants/contracts.js +2 -1
  12. package/_cjs/constants/contracts.js.map +1 -1
  13. package/_cjs/errors/contract.js +19 -1
  14. package/_cjs/errors/contract.js.map +1 -1
  15. package/_cjs/errors/eip712.js +24 -0
  16. package/_cjs/errors/eip712.js.map +1 -0
  17. package/_cjs/errors/version.js +1 -1
  18. package/_cjs/index.js +6 -5
  19. package/_cjs/index.js.map +1 -1
  20. package/_esm/actions/index.js +1 -0
  21. package/_esm/actions/index.js.map +1 -1
  22. package/_esm/actions/public/call.js +31 -3
  23. package/_esm/actions/public/call.js.map +1 -1
  24. package/_esm/actions/public/getEip712Domain.js +84 -0
  25. package/_esm/actions/public/getEip712Domain.js.map +1 -0
  26. package/_esm/actions/public/readContract.js.map +1 -1
  27. package/_esm/clients/decorators/public.js +2 -0
  28. package/_esm/clients/decorators/public.js.map +1 -1
  29. package/_esm/constants/contracts.js +1 -0
  30. package/_esm/constants/contracts.js.map +1 -1
  31. package/_esm/errors/contract.js +17 -0
  32. package/_esm/errors/contract.js.map +1 -1
  33. package/_esm/errors/eip712.js +20 -0
  34. package/_esm/errors/eip712.js.map +1 -0
  35. package/_esm/errors/version.js +1 -1
  36. package/_esm/index.js +2 -1
  37. package/_esm/index.js.map +1 -1
  38. package/_types/actions/index.d.ts +1 -0
  39. package/_types/actions/index.d.ts.map +1 -1
  40. package/_types/actions/public/call.d.ts +8 -2
  41. package/_types/actions/public/call.d.ts.map +1 -1
  42. package/_types/actions/public/getEip712Domain.d.ts +51 -0
  43. package/_types/actions/public/getEip712Domain.d.ts.map +1 -0
  44. package/_types/actions/public/readContract.d.ts +1 -1
  45. package/_types/actions/public/readContract.d.ts.map +1 -1
  46. package/_types/actions/public/simulateContract.d.ts +1 -1
  47. package/_types/actions/public/simulateContract.d.ts.map +1 -1
  48. package/_types/clients/decorators/public.d.ts +34 -0
  49. package/_types/clients/decorators/public.d.ts.map +1 -1
  50. package/_types/constants/contracts.d.ts +1 -0
  51. package/_types/constants/contracts.d.ts.map +1 -1
  52. package/_types/errors/contract.d.ts +9 -0
  53. package/_types/errors/contract.d.ts.map +1 -1
  54. package/_types/errors/eip712.d.ts +12 -0
  55. package/_types/errors/eip712.d.ts.map +1 -0
  56. package/_types/errors/version.d.ts +1 -1
  57. package/_types/index.d.ts +2 -1
  58. package/_types/index.d.ts.map +1 -1
  59. package/actions/index.ts +6 -0
  60. package/actions/public/call.ts +53 -3
  61. package/actions/public/getEip712Domain.ts +134 -0
  62. package/actions/public/readContract.ts +9 -1
  63. package/actions/public/simulateContract.ts +1 -1
  64. package/clients/decorators/public.ts +41 -0
  65. package/constants/contracts.ts +3 -0
  66. package/errors/contract.ts +20 -0
  67. package/errors/eip712.ts +19 -0
  68. package/errors/version.ts +1 -1
  69. package/index.ts +7 -0
  70. package/package.json +1 -1
@@ -0,0 +1,134 @@
1
+ import type { Address, TypedDataDomain } from 'abitype'
2
+ import type { Client } from '../../clients/createClient.js'
3
+ import type { Transport } from '../../clients/transports/createTransport.js'
4
+ import {
5
+ Eip712DomainNotFoundError,
6
+ type Eip712DomainNotFoundErrorType,
7
+ } from '../../errors/eip712.js'
8
+ import type { ErrorType } from '../../errors/utils.js'
9
+ import type { Hex } from '../../types/misc.js'
10
+ import type { RequiredBy } from '../../types/utils.js'
11
+ import { getAction } from '../../utils/getAction.js'
12
+ import {
13
+ type ReadContractErrorType,
14
+ type ReadContractParameters,
15
+ readContract,
16
+ } from './readContract.js'
17
+
18
+ export type GetEip712DomainParameters = {
19
+ address: Address
20
+ } & Pick<ReadContractParameters, 'factory' | 'factoryData'>
21
+
22
+ export type GetEip712DomainReturnType = {
23
+ domain: RequiredBy<
24
+ TypedDataDomain,
25
+ 'chainId' | 'name' | 'verifyingContract' | 'version'
26
+ >
27
+ fields: Hex
28
+ extensions: readonly bigint[]
29
+ }
30
+
31
+ export type GetEip712DomainErrorType =
32
+ | Eip712DomainNotFoundErrorType
33
+ | ReadContractErrorType
34
+ | ErrorType
35
+
36
+ /**
37
+ * Reads the EIP-712 domain from a contract, based on the ERC-5267 specification.
38
+ *
39
+ * @param client - A {@link Client} instance.
40
+ * @param parameters - The parameters of the action. {@link GetEip712DomainParameters}
41
+ * @returns The EIP-712 domain, fields, and extensions. {@link GetEip712DomainReturnType}
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * import { createPublicClient, http, getEip712Domain } from 'viem'
46
+ * import { mainnet } from 'viem/chains'
47
+ *
48
+ * const client = createPublicClient({
49
+ * chain: mainnet,
50
+ * transport: http(),
51
+ * })
52
+ *
53
+ * const domain = await getEip712Domain(client, {
54
+ * address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
55
+ * })
56
+ * // {
57
+ * // domain: {
58
+ * // name: 'ExampleContract',
59
+ * // version: '1',
60
+ * // chainId: 1,
61
+ * // verifyingContract: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
62
+ * // },
63
+ * // fields: '0x0f',
64
+ * // extensions: [],
65
+ * // }
66
+ * ```
67
+ */
68
+ export async function getEip712Domain(
69
+ client: Client<Transport>,
70
+ parameters: GetEip712DomainParameters,
71
+ ): Promise<GetEip712DomainReturnType> {
72
+ const { address, factory, factoryData } = parameters
73
+
74
+ try {
75
+ const [
76
+ fields,
77
+ name,
78
+ version,
79
+ chainId,
80
+ verifyingContract,
81
+ salt,
82
+ extensions,
83
+ ] = await getAction(
84
+ client,
85
+ readContract,
86
+ 'readContract',
87
+ )({
88
+ abi,
89
+ address,
90
+ functionName: 'eip712Domain',
91
+ factory,
92
+ factoryData,
93
+ })
94
+
95
+ return {
96
+ domain: {
97
+ name,
98
+ version,
99
+ chainId: Number(chainId),
100
+ verifyingContract,
101
+ salt,
102
+ },
103
+ extensions,
104
+ fields,
105
+ }
106
+ } catch (e) {
107
+ const error = e as ReadContractErrorType
108
+ if (
109
+ error.name === 'ContractFunctionExecutionError' &&
110
+ error.cause.name === 'ContractFunctionZeroDataError'
111
+ ) {
112
+ throw new Eip712DomainNotFoundError({ address })
113
+ }
114
+ throw error
115
+ }
116
+ }
117
+
118
+ const abi = [
119
+ {
120
+ inputs: [],
121
+ name: 'eip712Domain',
122
+ outputs: [
123
+ { name: 'fields', type: 'bytes1' },
124
+ { name: 'name', type: 'string' },
125
+ { name: 'version', type: 'string' },
126
+ { name: 'chainId', type: 'uint256' },
127
+ { name: 'verifyingContract', type: 'address' },
128
+ { name: 'salt', type: 'bytes32' },
129
+ { name: 'extensions', type: 'uint256[]' },
130
+ ],
131
+ stateMutability: 'view',
132
+ type: 'function',
133
+ },
134
+ ] as const
@@ -40,7 +40,15 @@ export type ReadContractParameters<
40
40
  functionName
41
41
  > = ContractFunctionArgs<abi, 'pure' | 'view', functionName>,
42
42
  > = UnionEvaluate<
43
- Pick<CallParameters, 'account' | 'blockNumber' | 'blockTag' | 'stateOverride'>
43
+ Pick<
44
+ CallParameters,
45
+ | 'account'
46
+ | 'blockNumber'
47
+ | 'blockTag'
48
+ | 'factory'
49
+ | 'factoryData'
50
+ | 'stateOverride'
51
+ >
44
52
  > &
45
53
  ContractFunctionParameters<abi, 'pure' | 'view', functionName, args>
46
54
 
@@ -66,7 +66,7 @@ export type SimulateContractParameters<
66
66
  > &
67
67
  UnionOmit<
68
68
  CallParameters<derivedChain>,
69
- 'account' | 'batch' | 'to' | 'data' | 'value'
69
+ 'account' | 'batch' | 'to' | 'data' | 'factory' | 'factoryData' | 'value'
70
70
  > &
71
71
  GetValue<
72
72
  abi,
@@ -106,6 +106,11 @@ import {
106
106
  type GetContractEventsReturnType,
107
107
  getContractEvents,
108
108
  } from '../../actions/public/getContractEvents.js'
109
+ import {
110
+ type GetEip712DomainParameters,
111
+ type GetEip712DomainReturnType,
112
+ getEip712Domain,
113
+ } from '../../actions/public/getEip712Domain.js'
109
114
  import {
110
115
  type GetFeeHistoryParameters,
111
116
  type GetFeeHistoryReturnType,
@@ -703,6 +708,41 @@ export type PublicActions<
703
708
  ) => Promise<
704
709
  GetContractEventsReturnType<abi, eventName, strict, fromBlock, toBlock>
705
710
  >
711
+ /**
712
+ * Reads the EIP-712 domain from a contract, based on the ERC-5267 specification.
713
+ *
714
+ * @param client - A {@link Client} instance.
715
+ * @param parameters - The parameters of the action. {@link GetEip712DomainParameters}
716
+ * @returns The EIP-712 domain, fields, and extensions. {@link GetEip712DomainReturnType}
717
+ *
718
+ * @example
719
+ * ```ts
720
+ * import { createPublicClient, http } from 'viem'
721
+ * import { mainnet } from 'viem/chains'
722
+ *
723
+ * const client = createPublicClient({
724
+ * chain: mainnet,
725
+ * transport: http(),
726
+ * })
727
+ *
728
+ * const domain = await client.getEip712Domain({
729
+ * address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
730
+ * })
731
+ * // {
732
+ * // domain: {
733
+ * // name: 'ExampleContract',
734
+ * // version: '1',
735
+ * // chainId: 1,
736
+ * // verifyingContract: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
737
+ * // },
738
+ * // fields: '0x0f',
739
+ * // extensions: [],
740
+ * // }
741
+ * ```
742
+ */
743
+ getEip712Domain: (
744
+ args: GetEip712DomainParameters,
745
+ ) => Promise<GetEip712DomainReturnType>
706
746
  /**
707
747
  * Gets address for ENS name.
708
748
  *
@@ -1816,6 +1856,7 @@ export function publicActions<
1816
1856
  getBytecode: (args) => getBytecode(client, args),
1817
1857
  getChainId: () => getChainId(client),
1818
1858
  getContractEvents: (args) => getContractEvents(client, args),
1859
+ getEip712Domain: (args) => getEip712Domain(client, args),
1819
1860
  getEnsAddress: (args) => getEnsAddress(client, args),
1820
1861
  getEnsAvatar: (args) => getEnsAvatar(client, args),
1821
1862
  getEnsName: (args) => getEnsName(client, args),
@@ -1,2 +1,5 @@
1
+ export const counterfactualContractCallByteCode =
2
+ '0x608060405234801561001057600080fd5b506040516102c03803806102c083398101604081905261002f916101e6565b836001600160a01b03163b6000036100e457600080836001600160a01b03168360405161005c9190610270565b6000604051808303816000865af19150503d8060008114610099576040519150601f19603f3d011682016040523d82523d6000602084013e61009e565b606091505b50915091508115806100b857506001600160a01b0386163b155b156100e1578060405163101bb98d60e01b81526004016100d8919061028c565b60405180910390fd5b50505b6000808451602086016000885af16040513d6000823e81610103573d81fd5b3d81f35b80516001600160a01b038116811461011e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561015457818101518382015260200161013c565b50506000910152565b600082601f83011261016e57600080fd5b81516001600160401b0381111561018757610187610123565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101b5576101b5610123565b6040528181528382016020018510156101cd57600080fd5b6101de826020830160208701610139565b949350505050565b600080600080608085870312156101fc57600080fd5b61020585610107565b60208601519094506001600160401b0381111561022157600080fd5b61022d8782880161015d565b93505061023c60408601610107565b60608601519092506001600160401b0381111561025857600080fd5b6102648782880161015d565b91505092959194509250565b60008251610282818460208701610139565b9190910192915050565b60208152600082518060208401526102ab816040850160208701610139565b601f01601f1916919091016040019291505056fe'
3
+
1
4
  export const universalSignatureValidatorByteCode =
2
5
  '0x60806040523480156200001157600080fd5b50604051620007003803806200070083398101604081905262000034916200056f565b6000620000438484846200004f565b9050806000526001601ff35b600080846001600160a01b0316803b806020016040519081016040528181526000908060200190933c90507f6492649264926492649264926492649264926492649264926492649264926492620000a68462000451565b036200021f57600060608085806020019051810190620000c79190620005ce565b8651929550909350915060000362000192576000836001600160a01b031683604051620000f5919062000643565b6000604051808303816000865af19150503d806000811462000134576040519150601f19603f3d011682016040523d82523d6000602084013e62000139565b606091505b5050905080620001905760405162461bcd60e51b815260206004820152601e60248201527f5369676e617475726556616c696461746f723a206465706c6f796d656e74000060448201526064015b60405180910390fd5b505b604051630b135d3f60e11b808252906001600160a01b038a1690631626ba7e90620001c4908b90869060040162000661565b602060405180830381865afa158015620001e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020891906200069d565b6001600160e01b031916149450505050506200044a565b805115620002b157604051630b135d3f60e11b808252906001600160a01b03871690631626ba7e9062000259908890889060040162000661565b602060405180830381865afa15801562000277573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029d91906200069d565b6001600160e01b031916149150506200044a565b8251604114620003195760405162461bcd60e51b815260206004820152603a6024820152600080516020620006e083398151915260448201527f3a20696e76616c6964207369676e6174757265206c656e677468000000000000606482015260840162000187565b620003236200046b565b506020830151604080850151855186939260009185919081106200034b576200034b620006c9565b016020015160f81c9050601b81148015906200036b57508060ff16601c14155b15620003cf5760405162461bcd60e51b815260206004820152603b6024820152600080516020620006e083398151915260448201527f3a20696e76616c6964207369676e617475726520762076616c75650000000000606482015260840162000187565b6040805160008152602081018083528a905260ff83169181019190915260608101849052608081018390526001600160a01b038a169060019060a0016020604051602081039080840390855afa1580156200042e573d6000803e3d6000fd5b505050602060405103516001600160a01b031614955050505050505b9392505050565b60006020825110156200046357600080fd5b508051015190565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b03811681146200049f57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004d5578181015183820152602001620004bb565b50506000910152565b600082601f830112620004f057600080fd5b81516001600160401b03808211156200050d576200050d620004a2565b604051601f8301601f19908116603f01168101908282118183101715620005385762000538620004a2565b816040528381528660208588010111156200055257600080fd5b62000565846020830160208901620004b8565b9695505050505050565b6000806000606084860312156200058557600080fd5b8351620005928162000489565b6020850151604086015191945092506001600160401b03811115620005b657600080fd5b620005c486828701620004de565b9150509250925092565b600080600060608486031215620005e457600080fd5b8351620005f18162000489565b60208501519093506001600160401b03808211156200060f57600080fd5b6200061d87838801620004de565b935060408601519150808211156200063457600080fd5b50620005c486828701620004de565b6000825162000657818460208701620004b8565b9190910192915050565b828152604060208201526000825180604084015262000688816060850160208701620004b8565b601f01601f1916919091016060019392505050565b600060208284031215620006b057600080fd5b81516001600160e01b0319811681146200044a57600080fd5b634e487b7160e01b600052603260045260246000fdfe5369676e617475726556616c696461746f72237265636f7665725369676e6572'
@@ -278,6 +278,26 @@ export class ContractFunctionZeroDataError extends BaseError {
278
278
  }
279
279
  }
280
280
 
281
+ export type CounterfactualDeploymentFailedErrorType =
282
+ CounterfactualDeploymentFailedError & {
283
+ name: 'CounterfactualDeploymentFailedError'
284
+ }
285
+ export class CounterfactualDeploymentFailedError extends BaseError {
286
+ override name = 'CounterfactualDeploymentFailedError'
287
+ constructor({ factory }: { factory: Address }) {
288
+ super(
289
+ `Deployment for counterfactual contract call failed for factory "${factory}".`,
290
+ {
291
+ metaMessages: [
292
+ 'Please ensure:',
293
+ '- The `factory` is a valid contract deployment factory (ie. Create2 Factory, ERC-4337 Factory, etc).',
294
+ '- The `factoryData` is a valid encoded function call for contract deployment function on the factory.',
295
+ ],
296
+ },
297
+ )
298
+ }
299
+ }
300
+
281
301
  export type RawContractErrorType = RawContractError & {
282
302
  name: 'RawContractError'
283
303
  }
@@ -0,0 +1,19 @@
1
+ import type { Address } from 'abitype'
2
+ import { BaseError } from './base.js'
3
+
4
+ export type Eip712DomainNotFoundErrorType = Eip712DomainNotFoundError & {
5
+ name: 'Eip712DomainNotFoundError'
6
+ }
7
+ export class Eip712DomainNotFoundError extends BaseError {
8
+ override name = 'Eip712DomainNotFoundError'
9
+ constructor({ address }: { address: Address }) {
10
+ super(`No EIP-712 domain found on contract "${address}".`, {
11
+ metaMessages: [
12
+ 'Ensure that:',
13
+ `- The contract is deployed at the address "${address}".`,
14
+ '- `eip712Domain()` function exists on the contract.',
15
+ '- `eip712Domain()` function matches signature to ERC-5267 specification.',
16
+ ],
17
+ })
18
+ }
19
+ }
package/errors/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '2.13.9'
1
+ export const version = '2.14.0'
package/index.ts CHANGED
@@ -48,6 +48,11 @@ export {
48
48
  type GetContractEventsParameters,
49
49
  type GetContractEventsReturnType,
50
50
  } from './actions/public/getContractEvents.js'
51
+ export {
52
+ type GetEip712DomainErrorType,
53
+ type GetEip712DomainParameters,
54
+ type GetEip712DomainReturnType,
55
+ } from './actions/public/getEip712Domain.js'
51
56
  export {
52
57
  type AddChainErrorType,
53
58
  type AddChainParameters,
@@ -715,6 +720,8 @@ export {
715
720
  type ContractFunctionZeroDataErrorType,
716
721
  RawContractError,
717
722
  type RawContractErrorType,
723
+ CounterfactualDeploymentFailedError,
724
+ type CounterfactualDeploymentFailedErrorType,
718
725
  } from './errors/contract.js'
719
726
  export {
720
727
  BaseFeeScalarError,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "viem",
3
3
  "description": "TypeScript Interface for Ethereum",
4
- "version": "2.13.9",
4
+ "version": "2.14.0",
5
5
  "main": "./_cjs/index.js",
6
6
  "module": "./_esm/index.js",
7
7
  "types": "./_types/index.d.ts",