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.
- package/CHANGELOG.md +18 -0
- package/_cjs/actions/ens/getEnsAddress.js +12 -3
- package/_cjs/actions/ens/getEnsAddress.js.map +1 -1
- package/_cjs/actions/ens/getEnsAvatar.js +7 -2
- package/_cjs/actions/ens/getEnsAvatar.js.map +1 -1
- package/_cjs/actions/ens/getEnsName.js +12 -3
- package/_cjs/actions/ens/getEnsName.js.map +1 -1
- package/_cjs/actions/ens/getEnsText.js +12 -3
- package/_cjs/actions/ens/getEnsText.js.map +1 -1
- package/_cjs/actions/public/estimateFeesPerGas.js +1 -1
- package/_cjs/actions/public/estimateFeesPerGas.js.map +1 -1
- package/_cjs/chains/definitions/baseSepolia.js +3 -3
- package/_cjs/chains/definitions/baseSepolia.js.map +1 -1
- package/_cjs/chains/definitions/gnosis.js +3 -2
- package/_cjs/chains/definitions/gnosis.js.map +1 -1
- package/_cjs/chains/definitions/goerli.js +2 -2
- package/_cjs/chains/definitions/goerli.js.map +1 -1
- package/_cjs/chains/definitions/mainnet.js +2 -2
- package/_cjs/chains/definitions/sepolia.js +2 -2
- package/_cjs/chains/definitions/sepolia.js.map +1 -1
- package/_cjs/constants/abis.js +64 -0
- package/_cjs/constants/abis.js.map +1 -1
- package/_cjs/errors/version.js +1 -1
- package/_cjs/utils/ens/errors.js +6 -0
- package/_cjs/utils/ens/errors.js.map +1 -1
- package/_esm/actions/ens/getEnsAddress.js +12 -3
- package/_esm/actions/ens/getEnsAddress.js.map +1 -1
- package/_esm/actions/ens/getEnsAvatar.js +7 -2
- package/_esm/actions/ens/getEnsAvatar.js.map +1 -1
- package/_esm/actions/ens/getEnsName.js +12 -3
- package/_esm/actions/ens/getEnsName.js.map +1 -1
- package/_esm/actions/ens/getEnsText.js +12 -3
- package/_esm/actions/ens/getEnsText.js.map +1 -1
- package/_esm/actions/public/estimateFeesPerGas.js +1 -1
- package/_esm/actions/public/estimateFeesPerGas.js.map +1 -1
- package/_esm/chains/definitions/baseSepolia.js +3 -3
- package/_esm/chains/definitions/baseSepolia.js.map +1 -1
- package/_esm/chains/definitions/gnosis.js +3 -2
- package/_esm/chains/definitions/gnosis.js.map +1 -1
- package/_esm/chains/definitions/goerli.js +2 -2
- package/_esm/chains/definitions/goerli.js.map +1 -1
- package/_esm/chains/definitions/mainnet.js +2 -2
- package/_esm/chains/definitions/sepolia.js +2 -2
- package/_esm/chains/definitions/sepolia.js.map +1 -1
- package/_esm/constants/abis.js +64 -0
- package/_esm/constants/abis.js.map +1 -1
- package/_esm/errors/version.js +1 -1
- package/_esm/utils/ens/errors.js +6 -0
- package/_esm/utils/ens/errors.js.map +1 -1
- package/_types/actions/ens/getEnsAddress.d.ts +5 -1
- package/_types/actions/ens/getEnsAddress.d.ts.map +1 -1
- package/_types/actions/ens/getEnsAvatar.d.ts +2 -2
- package/_types/actions/ens/getEnsAvatar.d.ts.map +1 -1
- package/_types/actions/ens/getEnsName.d.ts +5 -1
- package/_types/actions/ens/getEnsName.d.ts.map +1 -1
- package/_types/actions/ens/getEnsText.d.ts +5 -1
- package/_types/actions/ens/getEnsText.d.ts.map +1 -1
- package/_types/actions/public/estimateFeesPerGas.d.ts.map +1 -1
- package/_types/chains/definitions/baseSepolia.d.ts +3 -3
- package/_types/chains/definitions/gnosis.d.ts +3 -2
- package/_types/chains/definitions/gnosis.d.ts.map +1 -1
- package/_types/chains/definitions/goerli.d.ts +2 -2
- package/_types/chains/definitions/mainnet.d.ts +2 -2
- package/_types/chains/definitions/sepolia.d.ts +2 -2
- package/_types/constants/abis.d.ts +95 -0
- package/_types/constants/abis.d.ts.map +1 -1
- package/_types/errors/version.d.ts +1 -1
- package/_types/utils/ens/errors.d.ts.map +1 -1
- package/actions/ens/getEnsAddress.ts +18 -6
- package/actions/ens/getEnsAvatar.ts +10 -3
- package/actions/ens/getEnsName.ts +19 -6
- package/actions/ens/getEnsText.ts +18 -6
- package/actions/public/estimateFeesPerGas.ts +11 -10
- package/chains/definitions/baseSepolia.ts +3 -3
- package/chains/definitions/gnosis.ts +3 -2
- package/chains/definitions/goerli.ts +2 -2
- package/chains/definitions/mainnet.ts +2 -2
- package/chains/definitions/sepolia.ts +2 -2
- package/constants/abis.ts +64 -0
- package/errors/version.ts +1 -1
- package/package.json +1 -1
- 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: "
|
5
|
-
readonly url: "https://
|
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
|
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: "
|
15
|
-
readonly blockCreated:
|
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: "
|
15
|
-
readonly blockCreated:
|
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: "
|
19
|
-
readonly blockCreated:
|
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;
|
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
|
+
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,
|
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
|
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
|
-
|
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
|
-
|
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, {
|
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
|
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
|
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 =
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
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: '
|
20
|
-
url: 'https://
|
21
|
-
apiUrl: 'https://
|
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: '
|
20
|
-
url: 'https://
|
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: '
|
25
|
-
blockCreated:
|
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: '
|
25
|
-
blockCreated:
|
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: '
|
27
|
-
blockCreated:
|
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.
|
1
|
+
export const version = '2.3.1'
|
package/package.json
CHANGED
package/utils/ens/errors.ts
CHANGED
@@ -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(
|