viem 2.2.0 → 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 (82) hide show
  1. package/CHANGELOG.md +18 -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/chains/definitions/baseSepolia.js +3 -3
  13. package/_cjs/chains/definitions/baseSepolia.js.map +1 -1
  14. package/_cjs/chains/definitions/gnosis.js +3 -2
  15. package/_cjs/chains/definitions/gnosis.js.map +1 -1
  16. package/_cjs/chains/definitions/goerli.js +2 -2
  17. package/_cjs/chains/definitions/goerli.js.map +1 -1
  18. package/_cjs/chains/definitions/mainnet.js +2 -2
  19. package/_cjs/chains/definitions/sepolia.js +2 -2
  20. package/_cjs/chains/definitions/sepolia.js.map +1 -1
  21. package/_cjs/constants/abis.js +64 -0
  22. package/_cjs/constants/abis.js.map +1 -1
  23. package/_cjs/errors/version.js +1 -1
  24. package/_cjs/utils/ens/errors.js +6 -0
  25. package/_cjs/utils/ens/errors.js.map +1 -1
  26. package/_esm/actions/ens/getEnsAddress.js +12 -3
  27. package/_esm/actions/ens/getEnsAddress.js.map +1 -1
  28. package/_esm/actions/ens/getEnsAvatar.js +7 -2
  29. package/_esm/actions/ens/getEnsAvatar.js.map +1 -1
  30. package/_esm/actions/ens/getEnsName.js +12 -3
  31. package/_esm/actions/ens/getEnsName.js.map +1 -1
  32. package/_esm/actions/ens/getEnsText.js +12 -3
  33. package/_esm/actions/ens/getEnsText.js.map +1 -1
  34. package/_esm/actions/public/estimateFeesPerGas.js +1 -1
  35. package/_esm/actions/public/estimateFeesPerGas.js.map +1 -1
  36. package/_esm/chains/definitions/baseSepolia.js +3 -3
  37. package/_esm/chains/definitions/baseSepolia.js.map +1 -1
  38. package/_esm/chains/definitions/gnosis.js +3 -2
  39. package/_esm/chains/definitions/gnosis.js.map +1 -1
  40. package/_esm/chains/definitions/goerli.js +2 -2
  41. package/_esm/chains/definitions/goerli.js.map +1 -1
  42. package/_esm/chains/definitions/mainnet.js +2 -2
  43. package/_esm/chains/definitions/sepolia.js +2 -2
  44. package/_esm/chains/definitions/sepolia.js.map +1 -1
  45. package/_esm/constants/abis.js +64 -0
  46. package/_esm/constants/abis.js.map +1 -1
  47. package/_esm/errors/version.js +1 -1
  48. package/_esm/utils/ens/errors.js +6 -0
  49. package/_esm/utils/ens/errors.js.map +1 -1
  50. package/_types/actions/ens/getEnsAddress.d.ts +5 -1
  51. package/_types/actions/ens/getEnsAddress.d.ts.map +1 -1
  52. package/_types/actions/ens/getEnsAvatar.d.ts +2 -2
  53. package/_types/actions/ens/getEnsAvatar.d.ts.map +1 -1
  54. package/_types/actions/ens/getEnsName.d.ts +5 -1
  55. package/_types/actions/ens/getEnsName.d.ts.map +1 -1
  56. package/_types/actions/ens/getEnsText.d.ts +5 -1
  57. package/_types/actions/ens/getEnsText.d.ts.map +1 -1
  58. package/_types/actions/public/estimateFeesPerGas.d.ts.map +1 -1
  59. package/_types/chains/definitions/baseSepolia.d.ts +3 -3
  60. package/_types/chains/definitions/gnosis.d.ts +3 -2
  61. package/_types/chains/definitions/gnosis.d.ts.map +1 -1
  62. package/_types/chains/definitions/goerli.d.ts +2 -2
  63. package/_types/chains/definitions/mainnet.d.ts +2 -2
  64. package/_types/chains/definitions/sepolia.d.ts +2 -2
  65. package/_types/constants/abis.d.ts +95 -0
  66. package/_types/constants/abis.d.ts.map +1 -1
  67. package/_types/errors/version.d.ts +1 -1
  68. package/_types/utils/ens/errors.d.ts.map +1 -1
  69. package/actions/ens/getEnsAddress.ts +18 -6
  70. package/actions/ens/getEnsAvatar.ts +10 -3
  71. package/actions/ens/getEnsName.ts +19 -6
  72. package/actions/ens/getEnsText.ts +18 -6
  73. package/actions/public/estimateFeesPerGas.ts +11 -10
  74. package/chains/definitions/baseSepolia.ts +3 -3
  75. package/chains/definitions/gnosis.ts +3 -2
  76. package/chains/definitions/goerli.ts +2 -2
  77. package/chains/definitions/mainnet.ts +2 -2
  78. package/chains/definitions/sepolia.ts +2 -2
  79. package/constants/abis.ts +64 -0
  80. package/errors/version.ts +1 -1
  81. package/package.json +1 -1
  82. package/utils/ens/errors.ts +3 -0
@@ -1,8 +1,9 @@
1
1
  export declare const gnosis: {
2
2
  blockExplorers: {
3
3
  readonly default: {
4
- readonly name: "Gnosis Chain Explorer";
5
- readonly url: "https://blockscout.com/xdai/mainnet";
4
+ readonly name: "Gnosisscan";
5
+ readonly url: "https://gnosisscan.io";
6
+ readonly apiUrl: "https://api.gnosisscan.io/api";
6
7
  };
7
8
  };
8
9
  contracts: {
@@ -1 +1 @@
1
- {"version":3,"file":"gnosis.d.ts","sourceRoot":"","sources":["../../../chains/definitions/gnosis.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BjB,CAAA"}
1
+ {"version":3,"file":"gnosis.d.ts","sourceRoot":"","sources":["../../../chains/definitions/gnosis.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BjB,CAAA"}
@@ -11,8 +11,8 @@ export declare const goerli: {
11
11
  readonly address: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e";
12
12
  };
13
13
  readonly ensUniversalResolver: {
14
- readonly address: "0x56522D00C410a43BFfDF00a9A569489297385790";
15
- readonly blockCreated: 8765204;
14
+ readonly address: "0xfc4AC75C46C914aF5892d6d3eFFcebD7917293F1";
15
+ readonly blockCreated: 10339206;
16
16
  };
17
17
  readonly multicall3: {
18
18
  readonly address: "0xca11bde05977b3631167028862be2a173976ca11";
@@ -11,8 +11,8 @@ export declare const mainnet: {
11
11
  readonly address: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e";
12
12
  };
13
13
  readonly ensUniversalResolver: {
14
- readonly address: "0xc0497E381f536Be9ce14B0dD3817cBcAe57d2F62";
15
- readonly blockCreated: 16966585;
14
+ readonly address: "0x8cab227b1162f03b8338331adaad7aadc83b895e";
15
+ readonly blockCreated: 18958930;
16
16
  };
17
17
  readonly multicall3: {
18
18
  readonly address: "0xca11bde05977b3631167028862be2a173976ca11";
@@ -15,8 +15,8 @@ export declare const sepolia: {
15
15
  readonly address: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e";
16
16
  };
17
17
  readonly ensUniversalResolver: {
18
- readonly address: "0x21B000Fd62a880b2125A61e36a284BB757b76025";
19
- readonly blockCreated: 3914906;
18
+ readonly address: "0xBaBC7678D7A63104f1658c11D6AE9A21cdA09725";
19
+ readonly blockCreated: 5043334;
20
20
  };
21
21
  };
22
22
  id: 11155111;
@@ -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.2.0";
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 =
@@ -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,
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 = [
package/errors/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '2.2.0'
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.2.0",
4
+ "version": "2.3.1",
5
5
  "main": "./_cjs/index.js",
6
6
  "module": "./_esm/index.js",
7
7
  "types": "./_types/index.d.ts",
@@ -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(