viem 0.0.0-w-20230711215150 → 0.0.0-w-20230720203148

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 (97) hide show
  1. package/dist/cjs/accounts/utils/signTypedData.js +2 -1
  2. package/dist/cjs/accounts/utils/signTypedData.js.map +1 -1
  3. package/dist/cjs/actions/ens/getEnsAddress.js +4 -7
  4. package/dist/cjs/actions/ens/getEnsAddress.js.map +1 -1
  5. package/dist/cjs/actions/ens/getEnsName.js +6 -20
  6. package/dist/cjs/actions/ens/getEnsName.js.map +1 -1
  7. package/dist/cjs/actions/ens/getEnsText.js +31 -23
  8. package/dist/cjs/actions/ens/getEnsText.js.map +1 -1
  9. package/dist/cjs/actions/wallet/signTypedData.js +6 -15
  10. package/dist/cjs/actions/wallet/signTypedData.js.map +1 -1
  11. package/dist/cjs/chains/index.js +5 -2
  12. package/dist/cjs/chains/index.js.map +1 -1
  13. package/dist/cjs/constants/abis.js +30 -2
  14. package/dist/cjs/constants/abis.js.map +1 -1
  15. package/dist/cjs/errors/version.js +1 -1
  16. package/dist/cjs/index.js.map +1 -1
  17. package/dist/cjs/utils/ens/errors.js +24 -0
  18. package/dist/cjs/utils/ens/errors.js.map +1 -0
  19. package/dist/cjs/utils/signature/hashTypedData.js +5 -6
  20. package/dist/cjs/utils/signature/hashTypedData.js.map +1 -1
  21. package/dist/cjs/utils/signature/recoverTypedDataAddress.js +2 -1
  22. package/dist/cjs/utils/signature/recoverTypedDataAddress.js.map +1 -1
  23. package/dist/cjs/utils/signature/verifyTypedData.js +2 -1
  24. package/dist/cjs/utils/signature/verifyTypedData.js.map +1 -1
  25. package/dist/cjs/utils/typedData.js +5 -6
  26. package/dist/cjs/utils/typedData.js.map +1 -1
  27. package/dist/esm/accounts/utils/signTypedData.js +3 -2
  28. package/dist/esm/accounts/utils/signTypedData.js.map +1 -1
  29. package/dist/esm/actions/ens/getEnsAddress.js +5 -8
  30. package/dist/esm/actions/ens/getEnsAddress.js.map +1 -1
  31. package/dist/esm/actions/ens/getEnsName.js +6 -21
  32. package/dist/esm/actions/ens/getEnsName.js.map +1 -1
  33. package/dist/esm/actions/ens/getEnsText.js +32 -24
  34. package/dist/esm/actions/ens/getEnsText.js.map +1 -1
  35. package/dist/esm/actions/wallet/signTypedData.js +6 -15
  36. package/dist/esm/actions/wallet/signTypedData.js.map +1 -1
  37. package/dist/esm/chains/index.js +3 -0
  38. package/dist/esm/chains/index.js.map +1 -1
  39. package/dist/esm/constants/abis.js +29 -1
  40. package/dist/esm/constants/abis.js.map +1 -1
  41. package/dist/esm/errors/version.js +1 -1
  42. package/dist/esm/index.js.map +1 -1
  43. package/dist/esm/utils/ens/errors.js +25 -0
  44. package/dist/esm/utils/ens/errors.js.map +1 -0
  45. package/dist/esm/utils/signature/hashTypedData.js +5 -6
  46. package/dist/esm/utils/signature/hashTypedData.js.map +1 -1
  47. package/dist/esm/utils/signature/recoverTypedDataAddress.js +2 -1
  48. package/dist/esm/utils/signature/recoverTypedDataAddress.js.map +1 -1
  49. package/dist/esm/utils/signature/verifyTypedData.js +2 -1
  50. package/dist/esm/utils/signature/verifyTypedData.js.map +1 -1
  51. package/dist/esm/utils/typedData.js +5 -6
  52. package/dist/esm/utils/typedData.js.map +1 -1
  53. package/dist/types/accounts/types.d.ts +1 -3
  54. package/dist/types/accounts/types.d.ts.map +1 -1
  55. package/dist/types/accounts/utils/signTypedData.d.ts +2 -6
  56. package/dist/types/accounts/utils/signTypedData.d.ts.map +1 -1
  57. package/dist/types/actions/ens/getEnsAddress.d.ts.map +1 -1
  58. package/dist/types/actions/ens/getEnsName.d.ts.map +1 -1
  59. package/dist/types/actions/ens/getEnsText.d.ts.map +1 -1
  60. package/dist/types/actions/wallet/signTypedData.d.ts +2 -6
  61. package/dist/types/actions/wallet/signTypedData.d.ts.map +1 -1
  62. package/dist/types/chains/index.d.ts +160 -37
  63. package/dist/types/chains/index.d.ts.map +1 -1
  64. package/dist/types/constants/abis.d.ts +39 -1
  65. package/dist/types/constants/abis.d.ts.map +1 -1
  66. package/dist/types/errors/version.d.ts +1 -1
  67. package/dist/types/index.d.ts +2 -2
  68. package/dist/types/index.d.ts.map +1 -1
  69. package/dist/types/types/typedData.d.ts +21 -43
  70. package/dist/types/types/typedData.d.ts.map +1 -1
  71. package/dist/types/utils/ens/errors.d.ts +2 -0
  72. package/dist/types/utils/ens/errors.d.ts.map +1 -0
  73. package/dist/types/utils/signature/hashTypedData.d.ts +2 -6
  74. package/dist/types/utils/signature/hashTypedData.d.ts.map +1 -1
  75. package/dist/types/utils/signature/recoverTypedDataAddress.d.ts +2 -6
  76. package/dist/types/utils/signature/recoverTypedDataAddress.d.ts.map +1 -1
  77. package/dist/types/utils/signature/verifyTypedData.d.ts +2 -6
  78. package/dist/types/utils/signature/verifyTypedData.d.ts.map +1 -1
  79. package/dist/types/utils/typedData.d.ts +1 -3
  80. package/dist/types/utils/typedData.d.ts.map +1 -1
  81. package/package.json +3 -3
  82. package/src/accounts/types.ts +3 -4
  83. package/src/accounts/utils/signTypedData.ts +12 -17
  84. package/src/actions/ens/getEnsAddress.ts +4 -13
  85. package/src/actions/ens/getEnsName.ts +6 -27
  86. package/src/actions/ens/getEnsText.ts +32 -23
  87. package/src/actions/wallet/signTypedData.ts +19 -28
  88. package/src/chains/index.ts +3 -0
  89. package/src/constants/abis.ts +31 -1
  90. package/src/errors/version.ts +1 -1
  91. package/src/index.ts +6 -7
  92. package/src/types/typedData.ts +49 -72
  93. package/src/utils/ens/errors.ts +27 -0
  94. package/src/utils/signature/hashTypedData.ts +17 -17
  95. package/src/utils/signature/recoverTypedDataAddress.ts +11 -16
  96. package/src/utils/signature/verifyTypedData.ts +10 -16
  97. package/src/utils/typedData.ts +10 -15
package/src/index.ts CHANGED
@@ -1,5 +1,10 @@
1
1
  export {
2
2
  type Abi,
3
+ type AbiFunction,
4
+ type AbiParameter,
5
+ type AbiStateMutability,
6
+ type AbiParameterKind,
7
+ type AbiParameterToPrimitiveType,
3
8
  type Address,
4
9
  type Narrow,
5
10
  type ParseAbi,
@@ -502,13 +507,7 @@ export type {
502
507
  ExtractFormatterReturnType,
503
508
  } from './types/formatter.js'
504
509
  export type { Serializers } from './types/serializer.js'
505
- export type {
506
- GetTypedDataDomain,
507
- GetTypedDataMessage,
508
- GetTypedDataPrimaryType,
509
- GetTypedDataTypes,
510
- TypedDataDefinition,
511
- } from './types/typedData.js'
510
+ export type { TypedDataDefinition } from './types/typedData.js'
512
511
  export type { GetTransportConfig } from './types/transport.js'
513
512
  export type { HDKey } from '@scure/bip32'
514
513
  export type { Log } from './types/log.js'
@@ -1,81 +1,58 @@
1
+ import type { Prettify } from './utils.js'
1
2
  import type {
2
- Narrow,
3
3
  TypedData,
4
4
  TypedDataDomain,
5
5
  TypedDataToPrimitiveTypes,
6
6
  } from 'abitype'
7
7
 
8
8
  export type TypedDataDefinition<
9
- TTypedData extends TypedData | { [key: string]: unknown } = TypedData,
10
- TPrimaryType extends string = string,
11
- > = {
12
- primaryType: GetTypedDataPrimaryType<TTypedData, TPrimaryType>
13
- } & GetTypedDataMessage<TTypedData, TPrimaryType> &
14
- GetTypedDataTypes<TTypedData, TPrimaryType> &
15
- GetTypedDataDomain<TTypedData, TPrimaryType>
16
-
17
- export type GetTypedDataDomain<
18
- TTypedData extends TypedData | { [key_1: string]: unknown } = TypedData,
19
- TPrimaryType extends string = string,
20
- TSchema = TTypedData extends TypedData
21
- ? TypedDataToPrimitiveTypes<TTypedData>
22
- : { [key_2: string]: any },
23
- TDomain = TSchema extends { EIP712Domain: infer Domain }
24
- ? Domain
25
- : TypedDataDomain,
26
- > = TPrimaryType extends 'EIP712Domain'
27
- ? {
28
- domain: TDomain
29
- }
30
- : {
31
- domain?: TDomain
32
- }
33
-
34
- export type GetTypedDataMessage<
35
- TTypedData extends TypedData | { [key_1: string]: unknown } = TypedData,
36
- TPrimaryType extends string = string,
37
- TSchema = TTypedData extends TypedData
38
- ? TypedDataToPrimitiveTypes<TTypedData>
39
- : { [key_2: string]: any },
40
- TMessage = TSchema[TPrimaryType extends keyof TSchema
41
- ? TPrimaryType
42
- : keyof TSchema],
43
- > = TPrimaryType extends 'EIP712Domain'
44
- ? {}
45
- : { [key_3: string]: any } extends TMessage // Check if we were able to infer the shape of typed data
46
- ? {
47
- /**
48
- * Data to sign
49
- *
50
- * Use a [const assertion](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) on {@link types} for type inference.
51
- */
52
- message: { [key_4: string]: unknown }
53
- }
54
- : {
55
- /** Data to sign */
56
- message: TMessage
57
- }
9
+ typedData extends TypedData | Record<string, unknown> = TypedData,
10
+ primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,
11
+ ///
12
+ > = primaryType extends 'EIP712Domain'
13
+ ? EIP712DomainDefinition<typedData, primaryType>
14
+ : MessageDefinition<typedData, primaryType>
58
15
 
59
- export type GetTypedDataPrimaryType<
60
- TTypedData extends TypedData | { [key: string]: unknown } = TypedData,
61
- TPrimaryType extends string = string,
62
- > = TTypedData extends TypedData
63
- ? keyof TTypedData extends infer AbiFunctionNames
64
- ?
65
- | AbiFunctionNames
66
- | (TPrimaryType extends AbiFunctionNames ? TPrimaryType : never)
67
- | (TypedData extends TTypedData ? string : never)
68
- | 'EIP712Domain'
69
- : never
70
- : TPrimaryType
16
+ type MessageDefinition<
17
+ typedData extends TypedData | Record<string, unknown> = TypedData,
18
+ primaryType extends keyof typedData = keyof typedData,
19
+ ///
20
+ schema extends Record<string, unknown> = typedData extends TypedData
21
+ ? TypedDataToPrimitiveTypes<typedData>
22
+ : Record<string, unknown>,
23
+ message = schema[primaryType extends keyof schema
24
+ ? primaryType
25
+ : keyof schema],
26
+ primaryTypes = typedData extends TypedData ? keyof typedData : string,
27
+ > = {
28
+ types: typedData
29
+ } & {
30
+ primaryType:
31
+ | primaryTypes // show all values
32
+ | (primaryType extends primaryTypes ? primaryType : never) // infer value
33
+ domain?:
34
+ | (schema extends { EIP712Domain: infer domain }
35
+ ? domain
36
+ : Prettify<TypedDataDomain>)
37
+ | undefined
38
+ message: { [_: string]: any } extends message // Check if message was inferred
39
+ ? Record<string, unknown>
40
+ : message
41
+ }
71
42
 
72
- export type GetTypedDataTypes<
73
- TTypedData extends TypedData | { [key: string]: unknown } = TypedData,
74
- TPrimaryType extends string = string,
75
- > = TPrimaryType extends 'EIP712Domain'
76
- ? {
77
- types?: Narrow<TTypedData>
78
- }
79
- : {
80
- types: Narrow<TTypedData>
81
- }
43
+ type EIP712DomainDefinition<
44
+ typedData extends TypedData | Record<string, unknown> = TypedData,
45
+ primaryType extends 'EIP712Domain' = 'EIP712Domain',
46
+ ///
47
+ schema extends Record<string, unknown> = typedData extends TypedData
48
+ ? TypedDataToPrimitiveTypes<typedData>
49
+ : Record<string, unknown>,
50
+ > = {
51
+ types?: typedData | undefined
52
+ } & {
53
+ primaryType: 'EIP712Domain' | primaryType
54
+ domain: schema extends { EIP712Domain: infer domain }
55
+ ? domain
56
+ : Prettify<TypedDataDomain>
57
+ message?: never
58
+ }
@@ -0,0 +1,27 @@
1
+ import { panicReasons } from '../../constants/solidity.js'
2
+ import { BaseError } from '../../errors/base.js'
3
+ import { ContractFunctionRevertedError } from '../../errors/contract.js'
4
+
5
+ /*
6
+ * @description Checks if error is a valid null result UniversalResolver error
7
+ */
8
+ export function isNullUniversalResolverError(
9
+ err: unknown,
10
+ callType: 'resolve' | 'reverse',
11
+ ): boolean {
12
+ if (!(err instanceof BaseError)) return false
13
+ const cause = err.walk((e) => e instanceof ContractFunctionRevertedError)
14
+ if (!(cause instanceof ContractFunctionRevertedError)) return false
15
+ if (cause.data?.errorName === 'ResolverNotFound') return true
16
+ if (cause.data?.errorName === 'ResolverWildcardNotSupported') return true
17
+ // Backwards compatibility for older UniversalResolver contracts
18
+ if (
19
+ cause.reason?.includes(
20
+ 'Wildcard on non-extended resolvers is not supported',
21
+ )
22
+ )
23
+ return true
24
+ // No primary name set for address.
25
+ if (callType === 'reverse' && cause.reason === panicReasons[50]) return true
26
+ return false
27
+ }
@@ -16,22 +16,23 @@ type MessageTypeProperty = {
16
16
  }
17
17
 
18
18
  export type HashTypedDataParameters<
19
- TTypedData extends TypedData | { [key: string]: unknown } = TypedData,
20
- TPrimaryType extends string = string,
21
- > = TypedDataDefinition<TTypedData, TPrimaryType>
19
+ typedData extends TypedData | Record<string, unknown> = TypedData,
20
+ primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,
21
+ > = TypedDataDefinition<typedData, primaryType>
22
22
 
23
23
  export type HashTypedDataReturnType = Hex
24
24
 
25
25
  export function hashTypedData<
26
- TTypedData extends TypedData | { [key: string]: unknown },
27
- TPrimaryType extends string = string,
28
- >({
29
- domain: domain_,
30
- message,
31
- primaryType,
32
- types: types_,
33
- }: HashTypedDataParameters<TTypedData, TPrimaryType>): HashTypedDataReturnType {
34
- const domain: TypedDataDomain = typeof domain_ === 'undefined' ? {} : domain_
26
+ const typedData extends TypedData | Record<string, unknown>,
27
+ primaryType extends keyof typedData | 'EIP712Domain',
28
+ >(
29
+ parameters: HashTypedDataParameters<typedData, primaryType>,
30
+ ): HashTypedDataReturnType {
31
+ const {
32
+ domain = {},
33
+ message,
34
+ primaryType,
35
+ } = parameters as unknown as HashTypedDataParameters
35
36
  const types = {
36
37
  EIP712Domain: [
37
38
  typeof domain?.name === 'string' && { name: 'name', type: 'string' },
@@ -46,7 +47,7 @@ export function hashTypedData<
46
47
  },
47
48
  domain?.salt && { name: 'salt', type: 'bytes32' },
48
49
  ].filter(Boolean),
49
- ...(types_ as TTypedData),
50
+ ...parameters.types,
50
51
  }
51
52
 
52
53
  // Need to do a runtime validation check on addresses, byte ranges, integer ranges, etc
@@ -56,7 +57,7 @@ export function hashTypedData<
56
57
  message,
57
58
  primaryType,
58
59
  types,
59
- } as TypedDataDefinition)
60
+ })
60
61
 
61
62
  const parts: Hex[] = ['0x1901']
62
63
  if (domain)
@@ -67,15 +68,14 @@ export function hashTypedData<
67
68
  }),
68
69
  )
69
70
 
70
- if (primaryType !== 'EIP712Domain') {
71
+ if (primaryType !== 'EIP712Domain')
71
72
  parts.push(
72
73
  hashStruct({
73
74
  data: message,
74
- primaryType: primaryType as string,
75
+ primaryType,
75
76
  types: types as Record<string, MessageTypeProperty[]>,
76
77
  }),
77
78
  )
78
- }
79
79
 
80
80
  return keccak256(concat(parts))
81
81
  }
@@ -7,33 +7,28 @@ import { hashTypedData } from './hashTypedData.js'
7
7
  import { recoverAddress } from './recoverAddress.js'
8
8
 
9
9
  export type RecoverTypedDataAddressParameters<
10
- TTypedData extends TypedData | { [key: string]: unknown } = TypedData,
11
- TPrimaryType extends string = string,
12
- > = TypedDataDefinition<TTypedData, TPrimaryType> & {
10
+ typedData extends TypedData | Record<string, unknown> = TypedData,
11
+ primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,
12
+ > = TypedDataDefinition<typedData, primaryType> & {
13
13
  signature: Hex | ByteArray
14
14
  }
15
15
  export type RecoverTypedDataAddressReturnType = Address
16
16
 
17
17
  export async function recoverTypedDataAddress<
18
- TTypedData extends TypedData | { [key: string]: unknown },
19
- TPrimaryType extends string = string,
20
- >({
21
- domain,
22
- message,
23
- primaryType,
24
- signature,
25
- types,
26
- }: RecoverTypedDataAddressParameters<
27
- TTypedData,
28
- TPrimaryType
29
- >): Promise<RecoverTypedDataAddressReturnType> {
18
+ const typedData extends TypedData | Record<string, unknown>,
19
+ primaryType extends keyof typedData | 'EIP712Domain',
20
+ >(
21
+ parameters: RecoverTypedDataAddressParameters<typedData, primaryType>,
22
+ ): Promise<RecoverTypedDataAddressReturnType> {
23
+ const { domain, message, primaryType, signature, types } =
24
+ parameters as unknown as RecoverTypedDataAddressParameters
30
25
  return recoverAddress({
31
26
  hash: hashTypedData({
32
27
  domain,
33
28
  message,
34
29
  primaryType,
35
30
  types,
36
- } as unknown as RecoverTypedDataAddressParameters),
31
+ }),
37
32
  signature,
38
33
  })
39
34
  }
@@ -11,9 +11,9 @@ import {
11
11
  } from './recoverTypedDataAddress.js'
12
12
 
13
13
  export type VerifyTypedDataParameters<
14
- TTypedData extends TypedData | { [key: string]: unknown } = TypedData,
15
- TPrimaryType extends string = string,
16
- > = TypedDataDefinition<TTypedData, TPrimaryType> & {
14
+ typedData extends TypedData | Record<string, unknown> = TypedData,
15
+ primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,
16
+ > = TypedDataDefinition<typedData, primaryType> & {
17
17
  /** The address to verify the typed data for. */
18
18
  address: Address
19
19
  /** The signature to verify */
@@ -35,19 +35,13 @@ export type VerifyTypedDataReturnType = boolean
35
35
  * @returns Whether or not the signature is valid. {@link VerifyTypedDataReturnType}
36
36
  */
37
37
  export async function verifyTypedData<
38
- TTypedData extends TypedData | { [key: string]: unknown },
39
- TPrimaryType extends string = string,
40
- >({
41
- address,
42
- domain,
43
- message,
44
- primaryType,
45
- signature,
46
- types,
47
- }: VerifyTypedDataParameters<
48
- TTypedData,
49
- TPrimaryType
50
- >): Promise<VerifyTypedDataReturnType> {
38
+ const typedData extends TypedData | Record<string, unknown>,
39
+ primaryType extends keyof typedData | 'EIP712Domain',
40
+ >(
41
+ parameters: VerifyTypedDataParameters<typedData, primaryType>,
42
+ ): Promise<VerifyTypedDataReturnType> {
43
+ const { address, domain, message, primaryType, signature, types } =
44
+ parameters as unknown as VerifyTypedDataParameters
51
45
  return isAddressEqual(
52
46
  getAddress(address),
53
47
  await recoverTypedDataAddress({
@@ -1,4 +1,4 @@
1
- import type { TypedData, TypedDataParameter, TypedDataType } from 'abitype'
1
+ import type { TypedData, TypedDataParameter } from 'abitype'
2
2
 
3
3
  import { BytesSizeMismatchError } from '../errors/abi.js'
4
4
  import { InvalidAddressError } from '../errors/address.js'
@@ -11,24 +11,19 @@ import { numberToHex } from './encoding/toHex.js'
11
11
  import { bytesRegex, integerRegex } from './regex.js'
12
12
 
13
13
  export function validateTypedData<
14
- TTypedData extends TypedData | { [key: string]: unknown },
15
- TPrimaryType extends string = string,
16
- >({
17
- domain,
18
- message,
19
- primaryType,
20
- types: types_,
21
- }: TypedDataDefinition<TTypedData, TPrimaryType>) {
22
- const types = types_ as TypedData
14
+ const typedData extends TypedData | Record<string, unknown>,
15
+ primaryType extends keyof typedData | 'EIP712Domain',
16
+ >(parameters: TypedDataDefinition<typedData, primaryType>) {
17
+ const { domain, message, primaryType, types } =
18
+ parameters as unknown as TypedDataDefinition
23
19
 
24
20
  const validateData = (
25
21
  struct: readonly TypedDataParameter[],
26
- value_: Record<string, unknown>,
22
+ data: Record<string, unknown>,
27
23
  ) => {
28
24
  for (const param of struct) {
29
- const { name, type: type_ } = param
30
- const type = type_ as TypedDataType
31
- const value = value_[name]
25
+ const { name, type } = param
26
+ const value = data[name]
32
27
 
33
28
  const integerMatch = type.match(integerRegex)
34
29
  if (
@@ -69,6 +64,6 @@ export function validateTypedData<
69
64
  if (primaryType !== 'EIP712Domain') {
70
65
  // Validate message types.
71
66
  const type = types[primaryType]
72
- validateData(type, message as Record<string, unknown>)
67
+ validateData(type, message)
73
68
  }
74
69
  }