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.
- package/dist/cjs/accounts/utils/signTypedData.js +2 -1
- package/dist/cjs/accounts/utils/signTypedData.js.map +1 -1
- package/dist/cjs/actions/ens/getEnsAddress.js +4 -7
- package/dist/cjs/actions/ens/getEnsAddress.js.map +1 -1
- package/dist/cjs/actions/ens/getEnsName.js +6 -20
- package/dist/cjs/actions/ens/getEnsName.js.map +1 -1
- package/dist/cjs/actions/ens/getEnsText.js +31 -23
- package/dist/cjs/actions/ens/getEnsText.js.map +1 -1
- package/dist/cjs/actions/wallet/signTypedData.js +6 -15
- package/dist/cjs/actions/wallet/signTypedData.js.map +1 -1
- package/dist/cjs/chains/index.js +5 -2
- package/dist/cjs/chains/index.js.map +1 -1
- package/dist/cjs/constants/abis.js +30 -2
- package/dist/cjs/constants/abis.js.map +1 -1
- package/dist/cjs/errors/version.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/utils/ens/errors.js +24 -0
- package/dist/cjs/utils/ens/errors.js.map +1 -0
- package/dist/cjs/utils/signature/hashTypedData.js +5 -6
- package/dist/cjs/utils/signature/hashTypedData.js.map +1 -1
- package/dist/cjs/utils/signature/recoverTypedDataAddress.js +2 -1
- package/dist/cjs/utils/signature/recoverTypedDataAddress.js.map +1 -1
- package/dist/cjs/utils/signature/verifyTypedData.js +2 -1
- package/dist/cjs/utils/signature/verifyTypedData.js.map +1 -1
- package/dist/cjs/utils/typedData.js +5 -6
- package/dist/cjs/utils/typedData.js.map +1 -1
- package/dist/esm/accounts/utils/signTypedData.js +3 -2
- package/dist/esm/accounts/utils/signTypedData.js.map +1 -1
- package/dist/esm/actions/ens/getEnsAddress.js +5 -8
- package/dist/esm/actions/ens/getEnsAddress.js.map +1 -1
- package/dist/esm/actions/ens/getEnsName.js +6 -21
- package/dist/esm/actions/ens/getEnsName.js.map +1 -1
- package/dist/esm/actions/ens/getEnsText.js +32 -24
- package/dist/esm/actions/ens/getEnsText.js.map +1 -1
- package/dist/esm/actions/wallet/signTypedData.js +6 -15
- package/dist/esm/actions/wallet/signTypedData.js.map +1 -1
- package/dist/esm/chains/index.js +3 -0
- package/dist/esm/chains/index.js.map +1 -1
- package/dist/esm/constants/abis.js +29 -1
- package/dist/esm/constants/abis.js.map +1 -1
- package/dist/esm/errors/version.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/utils/ens/errors.js +25 -0
- package/dist/esm/utils/ens/errors.js.map +1 -0
- package/dist/esm/utils/signature/hashTypedData.js +5 -6
- package/dist/esm/utils/signature/hashTypedData.js.map +1 -1
- package/dist/esm/utils/signature/recoverTypedDataAddress.js +2 -1
- package/dist/esm/utils/signature/recoverTypedDataAddress.js.map +1 -1
- package/dist/esm/utils/signature/verifyTypedData.js +2 -1
- package/dist/esm/utils/signature/verifyTypedData.js.map +1 -1
- package/dist/esm/utils/typedData.js +5 -6
- package/dist/esm/utils/typedData.js.map +1 -1
- package/dist/types/accounts/types.d.ts +1 -3
- package/dist/types/accounts/types.d.ts.map +1 -1
- package/dist/types/accounts/utils/signTypedData.d.ts +2 -6
- package/dist/types/accounts/utils/signTypedData.d.ts.map +1 -1
- package/dist/types/actions/ens/getEnsAddress.d.ts.map +1 -1
- package/dist/types/actions/ens/getEnsName.d.ts.map +1 -1
- package/dist/types/actions/ens/getEnsText.d.ts.map +1 -1
- package/dist/types/actions/wallet/signTypedData.d.ts +2 -6
- package/dist/types/actions/wallet/signTypedData.d.ts.map +1 -1
- package/dist/types/chains/index.d.ts +160 -37
- package/dist/types/chains/index.d.ts.map +1 -1
- package/dist/types/constants/abis.d.ts +39 -1
- package/dist/types/constants/abis.d.ts.map +1 -1
- package/dist/types/errors/version.d.ts +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types/typedData.d.ts +21 -43
- package/dist/types/types/typedData.d.ts.map +1 -1
- package/dist/types/utils/ens/errors.d.ts +2 -0
- package/dist/types/utils/ens/errors.d.ts.map +1 -0
- package/dist/types/utils/signature/hashTypedData.d.ts +2 -6
- package/dist/types/utils/signature/hashTypedData.d.ts.map +1 -1
- package/dist/types/utils/signature/recoverTypedDataAddress.d.ts +2 -6
- package/dist/types/utils/signature/recoverTypedDataAddress.d.ts.map +1 -1
- package/dist/types/utils/signature/verifyTypedData.d.ts +2 -6
- package/dist/types/utils/signature/verifyTypedData.d.ts.map +1 -1
- package/dist/types/utils/typedData.d.ts +1 -3
- package/dist/types/utils/typedData.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/accounts/types.ts +3 -4
- package/src/accounts/utils/signTypedData.ts +12 -17
- package/src/actions/ens/getEnsAddress.ts +4 -13
- package/src/actions/ens/getEnsName.ts +6 -27
- package/src/actions/ens/getEnsText.ts +32 -23
- package/src/actions/wallet/signTypedData.ts +19 -28
- package/src/chains/index.ts +3 -0
- package/src/constants/abis.ts +31 -1
- package/src/errors/version.ts +1 -1
- package/src/index.ts +6 -7
- package/src/types/typedData.ts +49 -72
- package/src/utils/ens/errors.ts +27 -0
- package/src/utils/signature/hashTypedData.ts +17 -17
- package/src/utils/signature/recoverTypedDataAddress.ts +11 -16
- package/src/utils/signature/verifyTypedData.ts +10 -16
- 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'
|
package/src/types/typedData.ts
CHANGED
@@ -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
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
?
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
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
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
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
|
-
|
20
|
-
|
21
|
-
> = TypedDataDefinition<
|
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
|
-
|
27
|
-
|
28
|
-
>(
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
-
...
|
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
|
-
}
|
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
|
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
|
-
|
11
|
-
|
12
|
-
> = TypedDataDefinition<
|
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
|
-
|
19
|
-
|
20
|
-
>(
|
21
|
-
|
22
|
-
|
23
|
-
primaryType,
|
24
|
-
|
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
|
-
}
|
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
|
-
|
15
|
-
|
16
|
-
> = TypedDataDefinition<
|
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
|
-
|
39
|
-
|
40
|
-
>(
|
41
|
-
|
42
|
-
|
43
|
-
message,
|
44
|
-
|
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({
|
package/src/utils/typedData.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import type { TypedData, TypedDataParameter
|
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
|
-
|
15
|
-
|
16
|
-
>({
|
17
|
-
domain,
|
18
|
-
|
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
|
-
|
22
|
+
data: Record<string, unknown>,
|
27
23
|
) => {
|
28
24
|
for (const param of struct) {
|
29
|
-
const { name, type
|
30
|
-
const
|
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
|
67
|
+
validateData(type, message)
|
73
68
|
}
|
74
69
|
}
|