viem 2.1.1 → 2.3.1

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 (109) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/_cjs/actions/ens/getEnsAddress.js +12 -3
  3. package/_cjs/actions/ens/getEnsAddress.js.map +1 -1
  4. package/_cjs/actions/ens/getEnsAvatar.js +7 -2
  5. package/_cjs/actions/ens/getEnsAvatar.js.map +1 -1
  6. package/_cjs/actions/ens/getEnsName.js +12 -3
  7. package/_cjs/actions/ens/getEnsName.js.map +1 -1
  8. package/_cjs/actions/ens/getEnsText.js +12 -3
  9. package/_cjs/actions/ens/getEnsText.js.map +1 -1
  10. package/_cjs/actions/public/estimateFeesPerGas.js +1 -1
  11. package/_cjs/actions/public/estimateFeesPerGas.js.map +1 -1
  12. package/_cjs/actions/public/watchContractEvent.js.map +1 -1
  13. package/_cjs/actions/public/watchEvent.js.map +1 -1
  14. package/_cjs/actions/wallet/sendTransaction.js.map +1 -1
  15. package/_cjs/chains/definitions/baseSepolia.js +3 -3
  16. package/_cjs/chains/definitions/baseSepolia.js.map +1 -1
  17. package/_cjs/chains/definitions/gnosis.js +3 -2
  18. package/_cjs/chains/definitions/gnosis.js.map +1 -1
  19. package/_cjs/chains/definitions/goerli.js +2 -2
  20. package/_cjs/chains/definitions/goerli.js.map +1 -1
  21. package/_cjs/chains/definitions/mainnet.js +2 -2
  22. package/_cjs/chains/definitions/sepolia.js +2 -2
  23. package/_cjs/chains/definitions/sepolia.js.map +1 -1
  24. package/_cjs/clients/transports/fallback.js.map +1 -1
  25. package/_cjs/constants/abis.js +64 -0
  26. package/_cjs/constants/abis.js.map +1 -1
  27. package/_cjs/errors/contract.js.map +1 -1
  28. package/_cjs/errors/version.js +1 -1
  29. package/_cjs/utils/abi/parseEventLogs.js.map +1 -1
  30. package/_cjs/utils/ccip.js.map +1 -1
  31. package/_cjs/utils/encoding/toHex.js.map +1 -1
  32. package/_cjs/utils/ens/errors.js +6 -0
  33. package/_cjs/utils/ens/errors.js.map +1 -1
  34. package/_cjs/utils/rpc.js.map +1 -1
  35. package/_esm/actions/ens/getEnsAddress.js +12 -3
  36. package/_esm/actions/ens/getEnsAddress.js.map +1 -1
  37. package/_esm/actions/ens/getEnsAvatar.js +7 -2
  38. package/_esm/actions/ens/getEnsAvatar.js.map +1 -1
  39. package/_esm/actions/ens/getEnsName.js +12 -3
  40. package/_esm/actions/ens/getEnsName.js.map +1 -1
  41. package/_esm/actions/ens/getEnsText.js +12 -3
  42. package/_esm/actions/ens/getEnsText.js.map +1 -1
  43. package/_esm/actions/public/estimateFeesPerGas.js +1 -1
  44. package/_esm/actions/public/estimateFeesPerGas.js.map +1 -1
  45. package/_esm/actions/public/watchContractEvent.js.map +1 -1
  46. package/_esm/actions/public/watchEvent.js.map +1 -1
  47. package/_esm/actions/wallet/sendTransaction.js.map +1 -1
  48. package/_esm/chains/definitions/baseSepolia.js +3 -3
  49. package/_esm/chains/definitions/baseSepolia.js.map +1 -1
  50. package/_esm/chains/definitions/gnosis.js +3 -2
  51. package/_esm/chains/definitions/gnosis.js.map +1 -1
  52. package/_esm/chains/definitions/goerli.js +2 -2
  53. package/_esm/chains/definitions/goerli.js.map +1 -1
  54. package/_esm/chains/definitions/mainnet.js +2 -2
  55. package/_esm/chains/definitions/sepolia.js +2 -2
  56. package/_esm/chains/definitions/sepolia.js.map +1 -1
  57. package/_esm/clients/transports/fallback.js.map +1 -1
  58. package/_esm/constants/abis.js +64 -0
  59. package/_esm/constants/abis.js.map +1 -1
  60. package/_esm/errors/contract.js.map +1 -1
  61. package/_esm/errors/version.js +1 -1
  62. package/_esm/utils/abi/parseEventLogs.js.map +1 -1
  63. package/_esm/utils/ccip.js.map +1 -1
  64. package/_esm/utils/encoding/toHex.js.map +1 -1
  65. package/_esm/utils/ens/errors.js +6 -0
  66. package/_esm/utils/ens/errors.js.map +1 -1
  67. package/_esm/utils/rpc.js.map +1 -1
  68. package/_types/actions/ens/getEnsAddress.d.ts +5 -1
  69. package/_types/actions/ens/getEnsAddress.d.ts.map +1 -1
  70. package/_types/actions/ens/getEnsAvatar.d.ts +2 -2
  71. package/_types/actions/ens/getEnsAvatar.d.ts.map +1 -1
  72. package/_types/actions/ens/getEnsName.d.ts +5 -1
  73. package/_types/actions/ens/getEnsName.d.ts.map +1 -1
  74. package/_types/actions/ens/getEnsText.d.ts +5 -1
  75. package/_types/actions/ens/getEnsText.d.ts.map +1 -1
  76. package/_types/actions/public/estimateFeesPerGas.d.ts.map +1 -1
  77. package/_types/chains/definitions/baseSepolia.d.ts +3 -3
  78. package/_types/chains/definitions/gnosis.d.ts +3 -2
  79. package/_types/chains/definitions/gnosis.d.ts.map +1 -1
  80. package/_types/chains/definitions/goerli.d.ts +2 -2
  81. package/_types/chains/definitions/mainnet.d.ts +2 -2
  82. package/_types/chains/definitions/sepolia.d.ts +2 -2
  83. package/_types/constants/abis.d.ts +95 -0
  84. package/_types/constants/abis.d.ts.map +1 -1
  85. package/_types/errors/version.d.ts +1 -1
  86. package/_types/utils/ens/errors.d.ts.map +1 -1
  87. package/actions/ens/getEnsAddress.ts +18 -6
  88. package/actions/ens/getEnsAvatar.ts +10 -3
  89. package/actions/ens/getEnsName.ts +19 -6
  90. package/actions/ens/getEnsText.ts +18 -6
  91. package/actions/public/estimateFeesPerGas.ts +11 -10
  92. package/actions/public/watchContractEvent.ts +2 -2
  93. package/actions/public/watchEvent.ts +2 -2
  94. package/actions/wallet/sendTransaction.ts +1 -1
  95. package/chains/definitions/baseSepolia.ts +3 -3
  96. package/chains/definitions/gnosis.ts +3 -2
  97. package/chains/definitions/goerli.ts +2 -2
  98. package/chains/definitions/mainnet.ts +2 -2
  99. package/chains/definitions/sepolia.ts +2 -2
  100. package/clients/transports/fallback.ts +2 -2
  101. package/constants/abis.ts +64 -0
  102. package/errors/contract.ts +2 -2
  103. package/errors/version.ts +1 -1
  104. package/package.json +2 -2
  105. package/utils/abi/parseEventLogs.ts +2 -2
  106. package/utils/ccip.ts +1 -1
  107. package/utils/encoding/toHex.ts +1 -1
  108. package/utils/ens/errors.ts +3 -0
  109. package/utils/rpc.ts +1 -1
@@ -36,6 +36,49 @@ export declare const universalResolverResolveAbi: readonly [{
36
36
  readonly inputs: readonly [];
37
37
  readonly name: "ResolverWildcardNotSupported";
38
38
  readonly type: "error";
39
+ }, {
40
+ readonly inputs: readonly [];
41
+ readonly name: "ResolverNotContract";
42
+ readonly type: "error";
43
+ }, {
44
+ readonly inputs: readonly [{
45
+ readonly name: "returnData";
46
+ readonly type: "bytes";
47
+ }];
48
+ readonly name: "ResolverError";
49
+ readonly type: "error";
50
+ }, {
51
+ readonly inputs: readonly [{
52
+ readonly components: readonly [{
53
+ readonly name: "status";
54
+ readonly type: "uint16";
55
+ }, {
56
+ readonly name: "message";
57
+ readonly type: "string";
58
+ }];
59
+ readonly name: "errors";
60
+ readonly type: "tuple[]";
61
+ }];
62
+ readonly name: "HttpError";
63
+ readonly type: "error";
64
+ }, {
65
+ readonly name: "resolve";
66
+ readonly type: "function";
67
+ readonly stateMutability: "view";
68
+ readonly inputs: readonly [{
69
+ readonly name: "name";
70
+ readonly type: "bytes";
71
+ }, {
72
+ readonly name: "data";
73
+ readonly type: "bytes";
74
+ }];
75
+ readonly outputs: readonly [{
76
+ readonly name: "";
77
+ readonly type: "bytes";
78
+ }, {
79
+ readonly name: "address";
80
+ readonly type: "address";
81
+ }];
39
82
  }, {
40
83
  readonly name: "resolve";
41
84
  readonly type: "function";
@@ -46,6 +89,9 @@ export declare const universalResolverResolveAbi: readonly [{
46
89
  }, {
47
90
  readonly name: "data";
48
91
  readonly type: "bytes";
92
+ }, {
93
+ readonly name: "gateways";
94
+ readonly type: "string[]";
49
95
  }];
50
96
  readonly outputs: readonly [{
51
97
  readonly name: "";
@@ -63,6 +109,31 @@ export declare const universalResolverReverseAbi: readonly [{
63
109
  readonly inputs: readonly [];
64
110
  readonly name: "ResolverWildcardNotSupported";
65
111
  readonly type: "error";
112
+ }, {
113
+ readonly inputs: readonly [];
114
+ readonly name: "ResolverNotContract";
115
+ readonly type: "error";
116
+ }, {
117
+ readonly inputs: readonly [{
118
+ readonly name: "returnData";
119
+ readonly type: "bytes";
120
+ }];
121
+ readonly name: "ResolverError";
122
+ readonly type: "error";
123
+ }, {
124
+ readonly inputs: readonly [{
125
+ readonly components: readonly [{
126
+ readonly name: "status";
127
+ readonly type: "uint16";
128
+ }, {
129
+ readonly name: "message";
130
+ readonly type: "string";
131
+ }];
132
+ readonly name: "errors";
133
+ readonly type: "tuple[]";
134
+ }];
135
+ readonly name: "HttpError";
136
+ readonly type: "error";
66
137
  }, {
67
138
  readonly name: "reverse";
68
139
  readonly type: "function";
@@ -84,6 +155,30 @@ export declare const universalResolverReverseAbi: readonly [{
84
155
  readonly type: "address";
85
156
  readonly name: "resolver";
86
157
  }];
158
+ }, {
159
+ readonly name: "reverse";
160
+ readonly type: "function";
161
+ readonly stateMutability: "view";
162
+ readonly inputs: readonly [{
163
+ readonly type: "bytes";
164
+ readonly name: "reverseName";
165
+ }, {
166
+ readonly type: "string[]";
167
+ readonly name: "gateways";
168
+ }];
169
+ readonly outputs: readonly [{
170
+ readonly type: "string";
171
+ readonly name: "resolvedName";
172
+ }, {
173
+ readonly type: "address";
174
+ readonly name: "resolvedAddress";
175
+ }, {
176
+ readonly type: "address";
177
+ readonly name: "reverseResolver";
178
+ }, {
179
+ readonly type: "address";
180
+ readonly name: "resolver";
181
+ }];
87
182
  }];
88
183
  export declare const textResolverAbi: readonly [{
89
184
  readonly name: "text";
@@ -1 +1 @@
1
- {"version":3,"file":"abis.d.ts","sourceRoot":"","sources":["../../constants/abis.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0ChB,CAAA;AAeV,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;EAe9B,CAAA;AAEV,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc9B,CAAA;AAEV,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAWlB,CAAA;AAEV,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBrB,CAAA;AAIV,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAWlB,CAAA;AAKV,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;EAsBjC,CAAA;AAEV,+FAA+F;AAC/F,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2LX,CAAA;AAEV;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2LnB,CAAA;AAEV,8GAA8G;AAC9G,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2TZ,CAAA;AAEV,8GAA8G;AAC9G,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqfb,CAAA"}
1
+ {"version":3,"file":"abis.d.ts","sourceRoot":"","sources":["../../constants/abis.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0ChB,CAAA;AAkDV,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6B9B,CAAA;AAEV,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6B9B,CAAA;AAEV,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAWlB,CAAA;AAEV,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBrB,CAAA;AAIV,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAWlB,CAAA;AAKV,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;EAsBjC,CAAA;AAEV,+FAA+F;AAC/F,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2LX,CAAA;AAEV;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2LnB,CAAA;AAEV,8GAA8G;AAC9G,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2TZ,CAAA;AAEV,8GAA8G;AAC9G,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqfb,CAAA"}
@@ -1,2 +1,2 @@
1
- export declare const version = "2.1.1";
1
+ export declare const version = "2.3.1";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../utils/ens/errors.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAEtD,MAAM,MAAM,qCAAqC,GAAG,SAAS,CAAA;AAK7D,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,SAAS,GAAG,SAAS,GAC9B,OAAO,CAgBT"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../utils/ens/errors.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAEtD,MAAM,MAAM,qCAAqC,GAAG,SAAS,CAAA;AAK7D,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,SAAS,GAAG,SAAS,GAC9B,OAAO,CAmBT"}
@@ -39,8 +39,12 @@ export type GetEnsAddressParameters = Prettify<
39
39
  Pick<ReadContractParameters, 'blockNumber' | 'blockTag'> & {
40
40
  /** ENSIP-9 compliant coinType used to resolve addresses for other chains */
41
41
  coinType?: number
42
+ /** Universal Resolver gateway URLs to use for resolving CCIP-read requests. */
43
+ gatewayUrls?: string[]
42
44
  /** Name to get the address for. */
43
45
  name: string
46
+ /** Whether or not to throw errors propagated from the ENS Universal Resolver Contract. */
47
+ strict?: boolean
44
48
  /** Address of ENS Universal Resolver Contract. */
45
49
  universalResolverAddress?: Address
46
50
  }
@@ -93,6 +97,8 @@ export async function getEnsAddress<TChain extends Chain | undefined>(
93
97
  blockTag,
94
98
  coinType,
95
99
  name,
100
+ gatewayUrls,
101
+ strict,
96
102
  universalResolverAddress: universalResolverAddress_,
97
103
  }: GetEnsAddressParameters,
98
104
  ): Promise<GetEnsAddressReturnType> {
@@ -119,18 +125,23 @@ export async function getEnsAddress<TChain extends Chain | undefined>(
119
125
  : { args: [namehash(name)] }),
120
126
  })
121
127
 
122
- const res = await getAction(
123
- client,
124
- readContract,
125
- 'readContract',
126
- )({
128
+ const readContractParameters = {
127
129
  address: universalResolverAddress,
128
130
  abi: universalResolverResolveAbi,
129
131
  functionName: 'resolve',
130
132
  args: [toHex(packetToBytes(name)), functionData],
131
133
  blockNumber,
132
134
  blockTag,
133
- })
135
+ } as const
136
+
137
+ const readContractAction = getAction(client, readContract, 'readContract')
138
+
139
+ const res = gatewayUrls
140
+ ? await readContractAction({
141
+ ...readContractParameters,
142
+ args: [...readContractParameters.args, gatewayUrls],
143
+ })
144
+ : await readContractAction(readContractParameters)
134
145
 
135
146
  if (res[0] === '0x') return null
136
147
 
@@ -145,6 +156,7 @@ export async function getEnsAddress<TChain extends Chain | undefined>(
145
156
  if (trim(address) === '0x00') return null
146
157
  return address
147
158
  } catch (err) {
159
+ if (strict) throw err
148
160
  if (isNullUniversalResolverError(err, 'resolve')) return null
149
161
  throw err
150
162
  }
@@ -19,7 +19,7 @@ import {
19
19
  export type GetEnsAvatarParameters = Prettify<
20
20
  Omit<GetEnsTextParameters, 'key'> & {
21
21
  /** Gateway urls to resolve IPFS and/or Arweave assets. */
22
- gatewayUrls?: AssetGatewayUrls
22
+ assetGatewayUrls?: AssetGatewayUrls
23
23
  }
24
24
  >
25
25
 
@@ -63,8 +63,10 @@ export async function getEnsAvatar<TChain extends Chain | undefined>(
63
63
  {
64
64
  blockNumber,
65
65
  blockTag,
66
- gatewayUrls,
66
+ assetGatewayUrls,
67
67
  name,
68
+ gatewayUrls,
69
+ strict,
68
70
  universalResolverAddress,
69
71
  }: GetEnsAvatarParameters,
70
72
  ): Promise<GetEnsAvatarReturnType> {
@@ -78,10 +80,15 @@ export async function getEnsAvatar<TChain extends Chain | undefined>(
78
80
  key: 'avatar',
79
81
  name,
80
82
  universalResolverAddress,
83
+ gatewayUrls,
84
+ strict,
81
85
  })
82
86
  if (!record) return null
83
87
  try {
84
- return await parseAvatarRecord(client, { record, gatewayUrls })
88
+ return await parseAvatarRecord(client, {
89
+ record,
90
+ gatewayUrls: assetGatewayUrls,
91
+ })
85
92
  } catch {
86
93
  return null
87
94
  }
@@ -27,6 +27,10 @@ export type GetEnsNameParameters = Prettify<
27
27
  Pick<ReadContractParameters, 'blockNumber' | 'blockTag'> & {
28
28
  /** Address to get ENS name for. */
29
29
  address: Address
30
+ /** Universal Resolver gateway URLs to use for resolving CCIP-read requests. */
31
+ gatewayUrls?: string[]
32
+ /** Whether or not to throw errors propagated from the ENS Universal Resolver Contract. */
33
+ strict?: boolean
30
34
  /** Address of ENS Universal Resolver Contract. */
31
35
  universalResolverAddress?: Address
32
36
  }
@@ -73,6 +77,8 @@ export async function getEnsName<TChain extends Chain | undefined>(
73
77
  address,
74
78
  blockNumber,
75
79
  blockTag,
80
+ gatewayUrls,
81
+ strict,
76
82
  universalResolverAddress: universalResolverAddress_,
77
83
  }: GetEnsNameParameters,
78
84
  ): Promise<GetEnsNameReturnType> {
@@ -92,21 +98,28 @@ export async function getEnsName<TChain extends Chain | undefined>(
92
98
 
93
99
  const reverseNode = `${address.toLowerCase().substring(2)}.addr.reverse`
94
100
  try {
95
- const [name, resolvedAddress] = await getAction(
96
- client,
97
- readContract,
98
- 'readContract',
99
- )({
101
+ const readContractParameters = {
100
102
  address: universalResolverAddress,
101
103
  abi: universalResolverReverseAbi,
102
104
  functionName: 'reverse',
103
105
  args: [toHex(packetToBytes(reverseNode))],
104
106
  blockNumber,
105
107
  blockTag,
106
- })
108
+ } as const
109
+
110
+ const readContractAction = getAction(client, readContract, 'readContract')
111
+
112
+ const [name, resolvedAddress] = gatewayUrls
113
+ ? await readContractAction({
114
+ ...readContractParameters,
115
+ args: [...readContractParameters.args, gatewayUrls],
116
+ })
117
+ : await readContractAction(readContractParameters)
118
+
107
119
  if (address.toLowerCase() !== resolvedAddress.toLowerCase()) return null
108
120
  return name
109
121
  } catch (err) {
122
+ if (strict) throw err
110
123
  if (isNullUniversalResolverError(err, 'reverse')) return null
111
124
  throw err
112
125
  }
@@ -38,8 +38,12 @@ export type GetEnsTextParameters = Prettify<
38
38
  Pick<ReadContractParameters, 'blockNumber' | 'blockTag'> & {
39
39
  /** ENS name to get Text for. */
40
40
  name: string
41
+ /** Universal Resolver gateway URLs to use for resolving CCIP-read requests. */
42
+ gatewayUrls?: string[]
41
43
  /** Text record to retrieve. */
42
44
  key: string
45
+ /** Whether or not to throw errors propagated from the ENS Universal Resolver Contract. */
46
+ strict?: boolean
43
47
  /** Address of ENS Universal Resolver Contract. */
44
48
  universalResolverAddress?: Address
45
49
  }
@@ -92,6 +96,8 @@ export async function getEnsText<TChain extends Chain | undefined>(
92
96
  blockTag,
93
97
  name,
94
98
  key,
99
+ gatewayUrls,
100
+ strict,
95
101
  universalResolverAddress: universalResolverAddress_,
96
102
  }: GetEnsTextParameters,
97
103
  ): Promise<GetEnsTextReturnType> {
@@ -110,11 +116,7 @@ export async function getEnsText<TChain extends Chain | undefined>(
110
116
  }
111
117
 
112
118
  try {
113
- const res = await getAction(
114
- client,
115
- readContract,
116
- 'readContract',
117
- )({
119
+ const readContractParameters = {
118
120
  address: universalResolverAddress,
119
121
  abi: universalResolverResolveAbi,
120
122
  functionName: 'resolve',
@@ -128,7 +130,16 @@ export async function getEnsText<TChain extends Chain | undefined>(
128
130
  ],
129
131
  blockNumber,
130
132
  blockTag,
131
- })
133
+ } as const
134
+
135
+ const readContractAction = getAction(client, readContract, 'readContract')
136
+
137
+ const res = gatewayUrls
138
+ ? await readContractAction({
139
+ ...readContractParameters,
140
+ args: [...readContractParameters.args, gatewayUrls],
141
+ })
142
+ : await readContractAction(readContractParameters)
132
143
 
133
144
  if (res[0] === '0x') return null
134
145
 
@@ -140,6 +151,7 @@ export async function getEnsText<TChain extends Chain | undefined>(
140
151
 
141
152
  return record === '' ? null : record
142
153
  } catch (err) {
154
+ if (strict) throw err
143
155
  if (isNullUniversalResolverError(err, 'resolve')) return null
144
156
  throw err
145
157
  }
@@ -143,16 +143,17 @@ export async function internal_estimateFeesPerGas<
143
143
  if (typeof block.baseFeePerGas !== 'bigint')
144
144
  throw new Eip1559FeesNotSupportedError()
145
145
 
146
- const maxPriorityFeePerGas = request?.maxPriorityFeePerGas
147
- ? request.maxPriorityFeePerGas
148
- : await internal_estimateMaxPriorityFeePerGas(
149
- client as Client<Transport, Chain>,
150
- {
151
- block: block as Block,
152
- chain,
153
- request,
154
- },
155
- )
146
+ const maxPriorityFeePerGas =
147
+ typeof request?.maxPriorityFeePerGas === 'bigint'
148
+ ? request.maxPriorityFeePerGas
149
+ : await internal_estimateMaxPriorityFeePerGas(
150
+ client as Client<Transport, Chain>,
151
+ {
152
+ block: block as Block,
153
+ chain,
154
+ request,
155
+ },
156
+ )
156
157
 
157
158
  const baseFeePerGas = multiply(block.baseFeePerGas)
158
159
  const maxFeePerGas =
@@ -292,8 +292,8 @@ export function watchContractEvent<
292
292
  })
293
293
  onLogs([formatted] as any)
294
294
  } catch (err) {
295
- let eventName
296
- let isUnnamed
295
+ let eventName: string | undefined
296
+ let isUnnamed: boolean | undefined
297
297
  if (
298
298
  err instanceof DecodeLogDataMismatch ||
299
299
  err instanceof DecodeLogTopicsMismatch
@@ -317,8 +317,8 @@ export function watchEvent<
317
317
  const formatted = formatLog(log, { args, eventName })
318
318
  onLogs([formatted] as any)
319
319
  } catch (err) {
320
- let eventName
321
- let isUnnamed
320
+ let eventName: string | undefined
321
+ let isUnnamed: boolean | undefined
322
322
  if (
323
323
  err instanceof DecodeLogDataMismatch ||
324
324
  err instanceof DecodeLogTopicsMismatch
@@ -150,7 +150,7 @@ export async function sendTransaction<
150
150
  try {
151
151
  assertRequest(args as AssertRequestParameters)
152
152
 
153
- let chainId
153
+ let chainId: number | undefined
154
154
  if (chain !== null) {
155
155
  chainId = await getAction(client, getChainId, 'getChainId')({})
156
156
  assertCurrentChain({
@@ -16,9 +16,9 @@ export const baseSepolia = /*#__PURE__*/ defineChain({
16
16
  },
17
17
  blockExplorers: {
18
18
  default: {
19
- name: 'Blockscout',
20
- url: 'https://base-sepolia.blockscout.com',
21
- apiUrl: 'https://base-sepolia.blockscout.com/api',
19
+ name: 'Basescan',
20
+ url: 'https://sepolia.basescan.org',
21
+ apiUrl: 'https://api-sepolia.basescan.org/api',
22
22
  },
23
23
  },
24
24
  contracts: {
@@ -16,8 +16,9 @@ export const gnosis = /*#__PURE__*/ defineChain({
16
16
  },
17
17
  blockExplorers: {
18
18
  default: {
19
- name: 'Gnosis Chain Explorer',
20
- url: 'https://blockscout.com/xdai/mainnet',
19
+ name: 'Gnosisscan',
20
+ url: 'https://gnosisscan.io',
21
+ apiUrl: 'https://api.gnosisscan.io/api',
21
22
  },
22
23
  },
23
24
  contracts: {
@@ -21,8 +21,8 @@ export const goerli = /*#__PURE__*/ defineChain({
21
21
  address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',
22
22
  },
23
23
  ensUniversalResolver: {
24
- address: '0x56522D00C410a43BFfDF00a9A569489297385790',
25
- blockCreated: 8765204,
24
+ address: '0xfc4AC75C46C914aF5892d6d3eFFcebD7917293F1',
25
+ blockCreated: 10_339_206,
26
26
  },
27
27
  multicall3: {
28
28
  address: '0xca11bde05977b3631167028862be2a173976ca11',
@@ -21,8 +21,8 @@ export const mainnet = /*#__PURE__*/ defineChain({
21
21
  address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',
22
22
  },
23
23
  ensUniversalResolver: {
24
- address: '0xc0497E381f536Be9ce14B0dD3817cBcAe57d2F62',
25
- blockCreated: 16_966_585,
24
+ address: '0x8cab227b1162f03b8338331adaad7aadc83b895e',
25
+ blockCreated: 18_958_930,
26
26
  },
27
27
  multicall3: {
28
28
  address: '0xca11bde05977b3631167028862be2a173976ca11',
@@ -23,8 +23,8 @@ export const sepolia = /*#__PURE__*/ defineChain({
23
23
  },
24
24
  ensRegistry: { address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e' },
25
25
  ensUniversalResolver: {
26
- address: '0x21B000Fd62a880b2125A61e36a284BB757b76025',
27
- blockCreated: 3914906,
26
+ address: '0xBaBC7678D7A63104f1658c11D6AE9A21cdA09725',
27
+ blockCreated: 5_043_334,
28
28
  },
29
29
  },
30
30
  testnet: true,
@@ -220,8 +220,8 @@ export function rankTransports({
220
220
  const transport_ = transport({ chain, retryCount: 0, timeout })
221
221
 
222
222
  const start = Date.now()
223
- let end
224
- let success
223
+ let end: number
224
+ let success: number
225
225
  try {
226
226
  await transport_.request({ method: 'net_listening' })
227
227
  success = 1
package/constants/abis.ts CHANGED
@@ -54,6 +54,41 @@ const universalResolverErrors = [
54
54
  name: 'ResolverWildcardNotSupported',
55
55
  type: 'error',
56
56
  },
57
+ {
58
+ inputs: [],
59
+ name: 'ResolverNotContract',
60
+ type: 'error',
61
+ },
62
+ {
63
+ inputs: [
64
+ {
65
+ name: 'returnData',
66
+ type: 'bytes',
67
+ },
68
+ ],
69
+ name: 'ResolverError',
70
+ type: 'error',
71
+ },
72
+ {
73
+ inputs: [
74
+ {
75
+ components: [
76
+ {
77
+ name: 'status',
78
+ type: 'uint16',
79
+ },
80
+ {
81
+ name: 'message',
82
+ type: 'string',
83
+ },
84
+ ],
85
+ name: 'errors',
86
+ type: 'tuple[]',
87
+ },
88
+ ],
89
+ name: 'HttpError',
90
+ type: 'error',
91
+ },
57
92
  ] as const
58
93
 
59
94
  export const universalResolverResolveAbi = [
@@ -71,6 +106,20 @@ export const universalResolverResolveAbi = [
71
106
  { name: 'address', type: 'address' },
72
107
  ],
73
108
  },
109
+ {
110
+ name: 'resolve',
111
+ type: 'function',
112
+ stateMutability: 'view',
113
+ inputs: [
114
+ { name: 'name', type: 'bytes' },
115
+ { name: 'data', type: 'bytes' },
116
+ { name: 'gateways', type: 'string[]' },
117
+ ],
118
+ outputs: [
119
+ { name: '', type: 'bytes' },
120
+ { name: 'address', type: 'address' },
121
+ ],
122
+ },
74
123
  ] as const
75
124
 
76
125
  export const universalResolverReverseAbi = [
@@ -87,6 +136,21 @@ export const universalResolverReverseAbi = [
87
136
  { type: 'address', name: 'resolver' },
88
137
  ],
89
138
  },
139
+ {
140
+ name: 'reverse',
141
+ type: 'function',
142
+ stateMutability: 'view',
143
+ inputs: [
144
+ { type: 'bytes', name: 'reverseName' },
145
+ { type: 'string[]', name: 'gateways' },
146
+ ],
147
+ outputs: [
148
+ { type: 'string', name: 'resolvedName' },
149
+ { type: 'address', name: 'resolvedAddress' },
150
+ { type: 'address', name: 'reverseResolver' },
151
+ { type: 'address', name: 'resolver' },
152
+ ],
153
+ },
90
154
  ] as const
91
155
 
92
156
  export const textResolverAbi = [
@@ -176,8 +176,8 @@ export class ContractFunctionRevertedError extends BaseError {
176
176
  }: { abi: Abi; data?: Hex; functionName: string; message?: string }) {
177
177
  let cause: Error | undefined
178
178
  let decodedData: DecodeErrorResultReturnType | undefined = undefined
179
- let metaMessages
180
- let reason
179
+ let metaMessages: string[] | undefined
180
+ let reason: string | undefined
181
181
  if (data && data !== '0x') {
182
182
  try {
183
183
  decodedData = decodeErrorResult({ abi, data })
package/errors/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '2.1.1'
1
+ export const version = '2.3.1'
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "viem",
3
3
  "description": "TypeScript Interface for Ethereum",
4
- "version": "2.1.1",
4
+ "version": "2.3.1",
5
5
  "main": "./_cjs/index.js",
6
6
  "module": "./_esm/index.js",
7
7
  "types": "./_types/index.d.ts",
@@ -122,7 +122,7 @@
122
122
  "@noble/hashes": "1.3.2",
123
123
  "@scure/bip32": "1.3.2",
124
124
  "@scure/bip39": "1.2.1",
125
- "abitype": "0.10.0",
125
+ "abitype": "1.0.0",
126
126
  "isows": "1.0.3",
127
127
  "ws": "8.13.0"
128
128
  },
@@ -103,8 +103,8 @@ export function parseEventLogs<
103
103
  if (eventName && !eventName.includes(event.eventName!)) return null
104
104
  return { ...event, ...log }
105
105
  } catch (err) {
106
- let eventName
107
- let isUnnamed
106
+ let eventName: string | undefined
107
+ let isUnnamed: boolean | undefined
108
108
 
109
109
  if (err instanceof AbiEventSignatureNotFoundError) return null
110
110
  if (
package/utils/ccip.ts CHANGED
@@ -124,7 +124,7 @@ export async function ccipFetch({
124
124
  },
125
125
  )
126
126
 
127
- let result
127
+ let result: any
128
128
  if (
129
129
  response.headers.get('Content-Type')?.startsWith('application/json')
130
130
  ) {
@@ -187,7 +187,7 @@ export function numberToHex(
187
187
 
188
188
  const value = BigInt(value_)
189
189
 
190
- let maxValue
190
+ let maxValue: bigint | number | undefined
191
191
  if (size) {
192
192
  if (signed) maxValue = (1n << (BigInt(size) * 8n - 1n)) - 1n
193
193
  else maxValue = 2n ** (BigInt(size) * 8n) - 1n
@@ -17,6 +17,9 @@ export function isNullUniversalResolverError(
17
17
  if (!(cause instanceof ContractFunctionRevertedError)) return false
18
18
  if (cause.data?.errorName === 'ResolverNotFound') return true
19
19
  if (cause.data?.errorName === 'ResolverWildcardNotSupported') return true
20
+ if (cause.data?.errorName === 'ResolverNotContract') return true
21
+ if (cause.data?.errorName === 'ResolverError') return true
22
+ if (cause.data?.errorName === 'HttpError') return true
20
23
  // Backwards compatibility for older UniversalResolver contracts
21
24
  if (
22
25
  cause.reason?.includes(
package/utils/rpc.ts CHANGED
@@ -117,7 +117,7 @@ async function http<TBody extends RpcRequest | RpcRequest[]>(
117
117
  },
118
118
  )
119
119
 
120
- let data
120
+ let data: any
121
121
  if (response.headers.get('Content-Type')?.startsWith('application/json')) {
122
122
  data = await response.json()
123
123
  } else {