Skip to content

Commit 1c5326f

Browse files
dgcajxom
andauthored
fix: ENS batch gateway function signatures (#3603)
* fix: ENS batch gateway function signatures * Use ABI that's currently on mainnet * Add changeset * chore: tweaks * chore: tweaks * Update tiny-rabbits-watch.md --------- Co-authored-by: jxom <[email protected]>
1 parent ce10625 commit 1c5326f

File tree

7 files changed

+74
-17
lines changed

7 files changed

+74
-17
lines changed

.changeset/tiny-rabbits-watch.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"viem": patch
3+
---
4+
5+
Fixed ENS batch gateway signatures, and made Local Batch Gateway opt-in.

pnpm-lock.yaml

Lines changed: 10 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/actions/ens/getEnsAddress.test.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,11 @@ test('name with resolver that does not support addr', async () => {
7878

7979
test('name with resolver that does not support addr - strict', async () => {
8080
await expect(
81-
getEnsAddress(client, { name: 'vitalik.eth', strict: true }),
81+
getEnsAddress(client, {
82+
name: 'vitalik.eth',
83+
strict: true,
84+
gatewayUrls: ['x-batch-gateway:true'],
85+
}),
8286
).rejects.toMatchInlineSnapshot(`
8387
[ContractFunctionExecutionError: The contract function "resolve" reverted.
8488
@@ -161,6 +165,34 @@ test('offchain: aggregated', async () => {
161165
)
162166
})
163167

168+
test('behavior: x-batch-gateway:true', async () => {
169+
const client = createClient({
170+
chain: mainnet,
171+
batch: { multicall: true },
172+
transport: http(process.env.VITE_ANVIL_FORK_URL),
173+
})
174+
175+
const names = await Promise.all([
176+
getEnsAddress(client, {
177+
name: '1.offchainexample.eth',
178+
gatewayUrls: ['x-batch-gateway:true'],
179+
}),
180+
getEnsAddress(client, {
181+
name: '2.offchainexample.eth',
182+
gatewayUrls: ['x-batch-gateway:true'],
183+
}),
184+
])
185+
186+
expect(names).toMatchInlineSnapshot(
187+
`
188+
[
189+
"0x41563129cDbbD0c5D3e1c86cf9563926b243834d",
190+
"0x41563129cDbbD0c5D3e1c86cf9563926b243834d",
191+
]
192+
`,
193+
)
194+
})
195+
164196
test('custom universal resolver address', async () => {
165197
await expect(
166198
getEnsAddress(client, {
@@ -241,6 +273,7 @@ test('invalid universal resolver address', async () => {
241273
getEnsAddress(client, {
242274
name: 'awkweb.eth',
243275
universalResolverAddress: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',
276+
gatewayUrls: ['x-batch-gateway:true'],
244277
}),
245278
).rejects.toThrowErrorMatchingInlineSnapshot(`
246279
[ContractFunctionExecutionError: The contract function "resolve" reverted.

src/actions/ens/getEnsAddress.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import {
2424
import { type TrimErrorType, trim } from '../../utils/data/trim.js'
2525
import { type ToHexErrorType, toHex } from '../../utils/encoding/toHex.js'
2626
import { isNullUniversalResolverError } from '../../utils/ens/errors.js'
27-
import { localBatchGatewayUrl } from '../../utils/ens/localBatchGatewayRequest.js'
2827
import { type NamehashErrorType, namehash } from '../../utils/ens/namehash.js'
2928
import {
3029
type PacketToBytesErrorType,
@@ -128,19 +127,20 @@ export async function getEnsAddress<chain extends Chain | undefined>(
128127
const readContractParameters = {
129128
address: universalResolverAddress,
130129
abi: universalResolverResolveAbi,
131-
functionName: 'resolve',
132-
args: [
133-
toHex(packetToBytes(name)),
134-
functionData,
135-
gatewayUrls ?? [localBatchGatewayUrl],
136-
],
130+
args: [toHex(packetToBytes(name)), functionData],
137131
blockNumber,
138132
blockTag,
133+
functionName: 'resolve',
139134
} as const
140135

141136
const readContractAction = getAction(client, readContract, 'readContract')
142137

143-
const res = await readContractAction(readContractParameters)
138+
const res = gatewayUrls
139+
? await readContractAction({
140+
...readContractParameters,
141+
args: [...readContractParameters.args, gatewayUrls],
142+
})
143+
: await readContractAction(readContractParameters)
144144

145145
if (res[0] === '0x') return null
146146

src/actions/ens/getEnsName.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ export async function getEnsName<chain extends Chain | undefined>(
101101
const readContractParameters = {
102102
address: universalResolverAddress,
103103
abi: universalResolverReverseAbi,
104-
functionName: 'reverse',
105104
args: [toHex(packetToBytes(reverseNode))],
106105
blockNumber,
107106
blockTag,
@@ -112,9 +111,13 @@ export async function getEnsName<chain extends Chain | undefined>(
112111
const [name, resolvedAddress] = gatewayUrls
113112
? await readContractAction({
114113
...readContractParameters,
114+
functionName: 'reverse',
115115
args: [...readContractParameters.args, gatewayUrls],
116116
})
117-
: await readContractAction(readContractParameters)
117+
: await readContractAction({
118+
...readContractParameters,
119+
functionName: 'reverse',
120+
})
118121

119122
if (address.toLowerCase() !== resolvedAddress.toLowerCase()) return null
120123
return name

src/actions/ens/getEnsText.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ test('name with resolver that does not support text() - strict', async () => {
7272
name: 'vitalik.eth',
7373
key: 'com.twitter',
7474
strict: true,
75+
gatewayUrls: ['x-batch-gateway:true'],
7576
}),
7677
).rejects.toMatchInlineSnapshot(`
7778
[ContractFunctionExecutionError: The contract function "resolve" reverted.
@@ -104,6 +105,7 @@ test('name without resolver - strict', async () => {
104105
name: 'random1223232222.eth',
105106
key: 'com.twitter',
106107
strict: true,
108+
gatewayUrls: ['x-batch-gateway:true'],
107109
}),
108110
).rejects.toMatchInlineSnapshot(`
109111
[ContractFunctionExecutionError: The contract function "resolve" reverted.
@@ -134,6 +136,7 @@ test('name with non-contract resolver - strict', async () => {
134136
name: 'vbuterin.eth',
135137
key: 'com.twitter',
136138
strict: true,
139+
gatewayUrls: ['x-batch-gateway:true'],
137140
}),
138141
).rejects.toMatchInlineSnapshot(`
139142
[ContractFunctionExecutionError: The contract function "resolve" reverted.
@@ -232,6 +235,7 @@ describe('universal resolver with generic errors', () => {
232235
key: 'com.twitter',
233236
strict: true,
234237
universalResolverAddress: '0xc0497E381f536Be9ce14B0dD3817cBcAe57d2F62',
238+
gatewayUrls: ['x-batch-gateway:true'],
235239
}),
236240
).rejects.toThrowErrorMatchingInlineSnapshot(`
237241
[ContractFunctionExecutionError: The contract function "resolve" reverted with the following reason:
@@ -309,6 +313,7 @@ test('invalid universal resolver address', async () => {
309313
name: 'wagmi-dev.eth',
310314
key: 'com.twitter',
311315
universalResolverAddress: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',
316+
gatewayUrls: ['x-batch-gateway:true'],
312317
}),
313318
).rejects.toThrowErrorMatchingInlineSnapshot(`
314319
[ContractFunctionExecutionError: The contract function "resolve" reverted.

src/actions/ens/getEnsText.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import {
2222
} from '../../utils/chain/getChainContractAddress.js'
2323
import { type ToHexErrorType, toHex } from '../../utils/encoding/toHex.js'
2424
import { isNullUniversalResolverError } from '../../utils/ens/errors.js'
25-
import { localBatchGatewayUrl } from '../../utils/ens/localBatchGatewayRequest.js'
2625
import { type NamehashErrorType, namehash } from '../../utils/ens/namehash.js'
2726
import {
2827
type PacketToBytesErrorType,
@@ -118,23 +117,27 @@ export async function getEnsText<chain extends Chain | undefined>(
118117
const readContractParameters = {
119118
address: universalResolverAddress,
120119
abi: universalResolverResolveAbi,
121-
functionName: 'resolve',
122120
args: [
123121
toHex(packetToBytes(name)),
124122
encodeFunctionData({
125123
abi: textResolverAbi,
126124
functionName: 'text',
127125
args: [namehash(name), key],
128126
}),
129-
gatewayUrls ?? [localBatchGatewayUrl],
130127
],
131128
blockNumber,
132129
blockTag,
130+
functionName: 'resolve',
133131
} as const
134132

135133
const readContractAction = getAction(client, readContract, 'readContract')
136134

137-
const res = await readContractAction(readContractParameters)
135+
const res = gatewayUrls
136+
? await readContractAction({
137+
...readContractParameters,
138+
args: [...readContractParameters.args, gatewayUrls],
139+
})
140+
: await readContractAction(readContractParameters)
138141

139142
if (res[0] === '0x') return null
140143

0 commit comments

Comments
 (0)