@ensdomains/ensjs 3.0.0-alpha.26 → 3.0.0-alpha.27

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 (43) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/contracts/getContractAddress.js +1 -1
  3. package/dist/cjs/functions/batchWrappers.js +41 -8
  4. package/dist/cjs/functions/getName.js +2 -2
  5. package/dist/cjs/functions/getOwner.js +4 -4
  6. package/dist/cjs/functions/getProfile.js +117 -87
  7. package/dist/cjs/generated/factories/NameWrapper__factory.js +13 -0
  8. package/dist/cjs/generated/factories/UniversalResolver__factory.js +277 -0
  9. package/dist/cjs/utils/ccip.js +128 -0
  10. package/dist/cjs/utils/singleCall.js +1 -1
  11. package/dist/esm/contracts/getContractAddress.mjs +1 -1
  12. package/dist/esm/functions/batchWrappers.mjs +35 -8
  13. package/dist/esm/functions/getName.mjs +2 -2
  14. package/dist/esm/functions/getOwner.mjs +4 -4
  15. package/dist/esm/functions/getProfile.mjs +117 -87
  16. package/dist/esm/generated/factories/NameWrapper__factory.mjs +13 -0
  17. package/dist/esm/generated/factories/UniversalResolver__factory.mjs +277 -0
  18. package/dist/esm/utils/ccip.mjs +114 -0
  19. package/dist/esm/utils/singleCall.mjs +1 -1
  20. package/dist/types/functions/batchWrappers.d.ts +58 -1
  21. package/dist/types/functions/getProfile.d.ts +6 -0
  22. package/dist/types/generated/NameWrapper.d.ts +9 -1
  23. package/dist/types/generated/UniversalResolver.d.ts +123 -21
  24. package/dist/types/index.d.ts +64 -2
  25. package/dist/types/utils/ccip.d.ts +3 -0
  26. package/package.json +3 -3
  27. package/src/contracts/getContractAddress.ts +1 -1
  28. package/src/functions/batchWrappers.ts +40 -9
  29. package/src/functions/getName.ts +2 -2
  30. package/src/functions/getOwner.ts +4 -2
  31. package/src/functions/getProfile-ccip.test.ts +29 -0
  32. package/src/functions/getProfile.test.ts +1 -1
  33. package/src/functions/getProfile.ts +160 -100
  34. package/src/functions/setName.test.ts +6 -2
  35. package/src/functions/setRecord.test.ts +3 -3
  36. package/src/functions/setRecords.test.ts +2 -2
  37. package/src/generated/NameWrapper.ts +14 -0
  38. package/src/generated/UniversalResolver.ts +382 -19
  39. package/src/generated/factories/NameWrapper__factory.ts +13 -0
  40. package/src/generated/factories/UniversalResolver__factory.ts +277 -0
  41. package/src/index.ts +1 -1
  42. package/src/utils/ccip.ts +148 -0
  43. package/src/utils/singleCall.ts +1 -1
@@ -1,6 +1,7 @@
1
1
  // src/functions/getProfile.ts
2
2
  import { formatsByName } from "@ensdomains/address-encoder";
3
3
  import { ethers } from "ethers";
4
+ import { hexStripZeros } from "ethers/lib/utils.js";
4
5
  import { decodeContenthash } from "../utils/contentHash.mjs";
5
6
  import { hexEncodeName } from "../utils/hexEncodedName.mjs";
6
7
  import { namehash } from "../utils/normalise.mjs";
@@ -8,8 +9,7 @@ import { parseInputType } from "../utils/validation.mjs";
8
9
  var makeMulticallData = async ({
9
10
  _getAddr,
10
11
  _getContentHash,
11
- _getText,
12
- resolverMulticallWrapper
12
+ _getText
13
13
  }, name, options) => {
14
14
  let calls = [];
15
15
  if (options.texts)
@@ -38,7 +38,7 @@ var makeMulticallData = async ({
38
38
  calls.push({
39
39
  key: "contentHash",
40
40
  data: await _getContentHash.raw(name),
41
- type: "contenthash"
41
+ type: "contentHash"
42
42
  });
43
43
  }
44
44
  if (!calls.find((x) => x.key === "60")) {
@@ -48,17 +48,17 @@ var makeMulticallData = async ({
48
48
  type: "addr"
49
49
  });
50
50
  }
51
- const prRawData = await resolverMulticallWrapper.raw(calls.map((x) => x.data));
52
- return { data: prRawData.data, calls };
51
+ return { data: calls.map((x) => x.data.data), calls };
53
52
  };
54
53
  var fetchWithoutResolverMulticall = async ({ multicallWrapper }, calls, resolverAddress) => {
55
54
  const callsWithResolver = calls.map((call) => ({
56
55
  to: resolverAddress,
57
56
  data: call.data.data
58
57
  }));
59
- return (await multicallWrapper(callsWithResolver)).map(
60
- (x) => x[1]
61
- );
58
+ const results = await multicallWrapper(callsWithResolver);
59
+ if (!results || !results.length)
60
+ return [];
61
+ return results.map((x) => x[1]);
62
62
  };
63
63
  var formatRecords = async ({
64
64
  _getText,
@@ -72,7 +72,7 @@ var formatRecords = async ({
72
72
  key: calls[i].key,
73
73
  type: calls[i].type
74
74
  };
75
- if (itemRet.type === "contenthash") {
75
+ if (itemRet.type === "contentHash") {
76
76
  ;
77
77
  [decodedFromAbi] = ethers.utils.defaultAbiCoder.decode(
78
78
  ["bytes"],
@@ -106,7 +106,7 @@ var formatRecords = async ({
106
106
  } catch {
107
107
  return;
108
108
  }
109
- case "contenthash":
109
+ case "contentHash":
110
110
  try {
111
111
  itemRet = {
112
112
  ...itemRet,
@@ -133,7 +133,7 @@ var formatRecords = async ({
133
133
  }
134
134
  } else if (options.contentHash) {
135
135
  const foundRecord = returnedRecords.find(
136
- (item) => item.type === "contenthash"
136
+ (item) => item.type === "contentHash"
137
137
  );
138
138
  returnedResponse.contentHash = foundRecord ? foundRecord.value : null;
139
139
  }
@@ -154,57 +154,64 @@ var getDataForName = async ({
154
154
  _getAddr,
155
155
  _getContentHash,
156
156
  _getText,
157
- resolverMulticallWrapper,
158
157
  multicallWrapper
159
- }, name, options, fallbackResolver, specificResolver) => {
158
+ }, name, options, specificResolver) => {
160
159
  const universalResolver = await contracts?.getUniversalResolver();
161
160
  const { data, calls } = await makeMulticallData(
162
- { _getAddr, _getContentHash, _getText, resolverMulticallWrapper },
161
+ { _getAddr, _getContentHash, _getText },
163
162
  name,
164
163
  options
165
164
  );
166
- let resolvedData;
167
- let useFallbackResolver = false;
168
- try {
169
- if (specificResolver) {
165
+ let recordData;
166
+ let resolverAddress = specificResolver;
167
+ if (specificResolver) {
168
+ try {
170
169
  const publicResolver = await contracts?.getPublicResolver(
171
170
  void 0,
172
171
  specificResolver
173
172
  );
174
- resolvedData = await publicResolver?.callStatic.multicall(
175
- calls.map((x) => x.data)
173
+ recordData = await publicResolver?.callStatic.multicall(data);
174
+ } catch (e) {
175
+ console.error("getProfile error:", e);
176
+ recordData = await fetchWithoutResolverMulticall(
177
+ { multicallWrapper },
178
+ calls,
179
+ resolverAddress
176
180
  );
177
- } else {
178
- resolvedData = await universalResolver?.resolve(hexEncodeName(name), data);
179
181
  }
180
- } catch {
181
- useFallbackResolver = true;
182
- }
183
- let resolverAddress;
184
- let recordData;
185
- if (useFallbackResolver) {
186
- resolverAddress = specificResolver || fallbackResolver;
187
- recordData = await fetchWithoutResolverMulticall(
188
- { multicallWrapper },
189
- calls,
190
- resolverAddress
191
- );
192
182
  } else {
193
- resolverAddress = specificResolver || resolvedData["1"];
194
- if (specificResolver) {
195
- recordData = resolvedData;
196
- } else {
197
- ;
198
- [recordData] = await resolverMulticallWrapper.decode(resolvedData["0"]);
183
+ const resolvedData = await universalResolver["resolve(bytes,bytes[])"](
184
+ hexEncodeName(name),
185
+ data,
186
+ {
187
+ ccipReadEnabled: true
188
+ }
189
+ );
190
+ recordData = [...resolvedData["0"]];
191
+ resolverAddress = resolvedData["1"];
192
+ for (let i = 0; i < recordData.length; i += 1) {
193
+ if (recordData[i].startsWith("0x0d1947a9")) {
194
+ calls[i] = null;
195
+ recordData[i] = null;
196
+ }
199
197
  }
200
198
  }
201
- const matchAddress = recordData[calls.findIndex((x) => x.key === "60")];
199
+ if (!resolverAddress || !recordData || hexStripZeros(resolverAddress) === "0x") {
200
+ return {
201
+ address: null,
202
+ records: {},
203
+ resolverAddress: null
204
+ };
205
+ }
206
+ const filteredCalls = calls.filter((x) => x);
207
+ const filteredRecordData = recordData.filter((x) => x);
208
+ const matchAddress = filteredRecordData[filteredCalls.findIndex((x) => x.key === "60")];
202
209
  return {
203
210
  address: matchAddress && await _getAddr.decode(matchAddress),
204
211
  records: await formatRecords(
205
212
  { _getAddr, _getContentHash, _getText },
206
- recordData,
207
- calls,
213
+ filteredRecordData,
214
+ filteredCalls,
208
215
  options
209
216
  ),
210
217
  resolverAddress
@@ -223,7 +230,6 @@ var graphFetch = async ({ gqlInstance }, name, wantedRecords, resolverAddress) =
223
230
  addr {
224
231
  id
225
232
  }
226
- address
227
233
  }
228
234
  }
229
235
  }
@@ -263,14 +269,8 @@ var graphFetch = async ({ gqlInstance }, name, wantedRecords, resolverAddress) =
263
269
  return;
264
270
  const { isMigrated, createdAt } = domain;
265
271
  const returnedRecords = {};
266
- if (!resolverResponse)
272
+ if (!resolverResponse || !wantedRecords)
267
273
  return { isMigrated, createdAt };
268
- if (!wantedRecords)
269
- return {
270
- isMigrated,
271
- createdAt,
272
- graphResolverAddress: resolverResponse.address || resolverAddress
273
- };
274
274
  Object.keys(wantedRecords).forEach((key) => {
275
275
  const data = wantedRecords[key];
276
276
  if (typeof data === "boolean" && data) {
@@ -284,8 +284,7 @@ var graphFetch = async ({ gqlInstance }, name, wantedRecords, resolverAddress) =
284
284
  return {
285
285
  ...returnedRecords,
286
286
  isMigrated,
287
- createdAt,
288
- graphResolverAddress: resolverResponse.address || resolverAddress
287
+ createdAt
289
288
  };
290
289
  };
291
290
  var getProfileFromName = async ({
@@ -297,7 +296,7 @@ var getProfileFromName = async ({
297
296
  resolverMulticallWrapper,
298
297
  multicallWrapper
299
298
  }, name, options) => {
300
- const { resolverAddress, ..._options } = options || {};
299
+ const { resolverAddress, fallback, ..._options } = options || {};
301
300
  const optsLength = Object.keys(_options).length;
302
301
  let usingOptions;
303
302
  if (!optsLength || _options?.texts === true || _options?.coinTypes === true) {
@@ -312,32 +311,57 @@ var getProfileFromName = async ({
312
311
  usingOptions,
313
312
  resolverAddress
314
313
  );
315
- if (!graphResult)
316
- return;
317
- const {
318
- isMigrated,
319
- createdAt,
320
- graphResolverAddress,
321
- ...wantedRecords
322
- } = graphResult;
323
- if (!graphResolverAddress && !options?.resolverAddress)
324
- return { isMigrated, createdAt, message: "Name doesn't have a resolver" };
325
- const result = await getDataForName(
326
- {
327
- contracts,
328
- _getAddr,
329
- _getContentHash,
330
- _getText,
331
- resolverMulticallWrapper,
332
- multicallWrapper
333
- },
334
- name,
335
- usingOptions ? wantedRecords : options,
336
- graphResolverAddress,
337
- options?.resolverAddress
338
- );
339
- if (!result)
340
- return { isMigrated, createdAt, message: "Records fetch didn't complete" };
314
+ let isMigrated = null;
315
+ let createdAt = null;
316
+ let result = null;
317
+ if (!graphResult) {
318
+ if (!fallback)
319
+ return;
320
+ result = await getDataForName(
321
+ {
322
+ contracts,
323
+ _getAddr,
324
+ _getContentHash,
325
+ _getText,
326
+ resolverMulticallWrapper,
327
+ multicallWrapper
328
+ },
329
+ name,
330
+ fallback,
331
+ void 0
332
+ );
333
+ } else {
334
+ const {
335
+ isMigrated: _isMigrated,
336
+ createdAt: _createdAt,
337
+ ...wantedRecords
338
+ } = graphResult;
339
+ isMigrated = _isMigrated;
340
+ createdAt = _createdAt;
341
+ let recordsWithFallback = usingOptions ? wantedRecords : _options;
342
+ if ((Object.keys(recordsWithFallback).length === 0 || !recordsWithFallback.coinTypes && !recordsWithFallback.texts && Object.keys(recordsWithFallback.contentHash || {}).length === 0) && fallback) {
343
+ recordsWithFallback = fallback;
344
+ }
345
+ result = await getDataForName(
346
+ {
347
+ contracts,
348
+ _getAddr,
349
+ _getContentHash,
350
+ _getText,
351
+ resolverMulticallWrapper,
352
+ multicallWrapper
353
+ },
354
+ name,
355
+ recordsWithFallback,
356
+ options?.resolverAddress
357
+ );
358
+ }
359
+ if (!result?.resolverAddress)
360
+ return {
361
+ isMigrated,
362
+ createdAt,
363
+ message: !result ? "Records fetch didn't complete" : "Name doesn't have a resolver"
364
+ };
341
365
  return { ...result, isMigrated, createdAt, message: void 0 };
342
366
  };
343
367
  var getProfileFromAddress = async ({
@@ -382,6 +406,12 @@ var getProfileFromAddress = async ({
382
406
  message: void 0
383
407
  };
384
408
  };
409
+ var mapCoinTypes = (coin) => {
410
+ if (!Number.isNaN(parseInt(coin))) {
411
+ return coin;
412
+ }
413
+ return `${formatsByName[coin.toUpperCase()].coinType}`;
414
+ };
385
415
  async function getProfile_default({
386
416
  contracts,
387
417
  gqlInstance,
@@ -392,13 +422,13 @@ async function getProfile_default({
392
422
  resolverMulticallWrapper,
393
423
  multicallWrapper
394
424
  }, nameOrAddress, options) {
395
- if (options && options.coinTypes && typeof options.coinTypes !== "boolean") {
396
- options.coinTypes = options.coinTypes.map((coin) => {
397
- if (!Number.isNaN(parseInt(coin))) {
398
- return coin;
399
- }
400
- return `${formatsByName[coin.toUpperCase()].coinType}`;
401
- });
425
+ if (options) {
426
+ if (options.coinTypes && typeof options.coinTypes !== "boolean") {
427
+ options.coinTypes = options.coinTypes.map(mapCoinTypes);
428
+ }
429
+ if (options.fallback && options.fallback.coinTypes) {
430
+ options.fallback.coinTypes = options.fallback.coinTypes.map(mapCoinTypes);
431
+ }
402
432
  }
403
433
  const inputType = parseInputType(nameOrAddress);
404
434
  if (inputType.type === "unknown" || inputType.info === "unsupported") {
@@ -583,6 +583,19 @@ var _abi = [
583
583
  stateMutability: "view",
584
584
  type: "function"
585
585
  },
586
+ {
587
+ inputs: [],
588
+ name: "name",
589
+ outputs: [
590
+ {
591
+ internalType: "string",
592
+ name: "",
593
+ type: "string"
594
+ }
595
+ ],
596
+ stateMutability: "view",
597
+ type: "function"
598
+ },
586
599
  {
587
600
  inputs: [
588
601
  {
@@ -14,6 +14,11 @@ var _abi = [
14
14
  internalType: "address",
15
15
  name: "_registry",
16
16
  type: "address"
17
+ },
18
+ {
19
+ internalType: "string[]",
20
+ name: "_urls",
21
+ type: "string[]"
17
22
  }
18
23
  ],
19
24
  stateMutability: "nonpayable",
@@ -50,6 +55,69 @@ var _abi = [
50
55
  name: "OffchainLookup",
51
56
  type: "error"
52
57
  },
58
+ {
59
+ inputs: [
60
+ {
61
+ internalType: "bytes",
62
+ name: "name",
63
+ type: "bytes"
64
+ },
65
+ {
66
+ internalType: "bytes",
67
+ name: "data",
68
+ type: "bytes"
69
+ },
70
+ {
71
+ internalType: "string[]",
72
+ name: "gateways",
73
+ type: "string[]"
74
+ },
75
+ {
76
+ internalType: "bytes4",
77
+ name: "callbackFunction",
78
+ type: "bytes4"
79
+ },
80
+ {
81
+ internalType: "bytes",
82
+ name: "metaData",
83
+ type: "bytes"
84
+ }
85
+ ],
86
+ name: "_resolveSingle",
87
+ outputs: [
88
+ {
89
+ internalType: "bytes",
90
+ name: "",
91
+ type: "bytes"
92
+ },
93
+ {
94
+ internalType: "address",
95
+ name: "",
96
+ type: "address"
97
+ }
98
+ ],
99
+ stateMutability: "view",
100
+ type: "function"
101
+ },
102
+ {
103
+ inputs: [
104
+ {
105
+ internalType: "uint256",
106
+ name: "",
107
+ type: "uint256"
108
+ }
109
+ ],
110
+ name: "batchGatewayURLs",
111
+ outputs: [
112
+ {
113
+ internalType: "string",
114
+ name: "",
115
+ type: "string"
116
+ }
117
+ ],
118
+ stateMutability: "view",
119
+ type: "function"
120
+ },
53
121
  {
54
122
  inputs: [
55
123
  {
@@ -87,6 +155,103 @@ var _abi = [
87
155
  stateMutability: "view",
88
156
  type: "function"
89
157
  },
158
+ {
159
+ inputs: [
160
+ {
161
+ internalType: "bytes",
162
+ name: "name",
163
+ type: "bytes"
164
+ },
165
+ {
166
+ internalType: "bytes",
167
+ name: "data",
168
+ type: "bytes"
169
+ },
170
+ {
171
+ internalType: "string[]",
172
+ name: "gateways",
173
+ type: "string[]"
174
+ }
175
+ ],
176
+ name: "resolve",
177
+ outputs: [
178
+ {
179
+ internalType: "bytes",
180
+ name: "",
181
+ type: "bytes"
182
+ },
183
+ {
184
+ internalType: "address",
185
+ name: "",
186
+ type: "address"
187
+ }
188
+ ],
189
+ stateMutability: "view",
190
+ type: "function"
191
+ },
192
+ {
193
+ inputs: [
194
+ {
195
+ internalType: "bytes",
196
+ name: "name",
197
+ type: "bytes"
198
+ },
199
+ {
200
+ internalType: "bytes[]",
201
+ name: "data",
202
+ type: "bytes[]"
203
+ }
204
+ ],
205
+ name: "resolve",
206
+ outputs: [
207
+ {
208
+ internalType: "bytes[]",
209
+ name: "",
210
+ type: "bytes[]"
211
+ },
212
+ {
213
+ internalType: "address",
214
+ name: "",
215
+ type: "address"
216
+ }
217
+ ],
218
+ stateMutability: "view",
219
+ type: "function"
220
+ },
221
+ {
222
+ inputs: [
223
+ {
224
+ internalType: "bytes",
225
+ name: "name",
226
+ type: "bytes"
227
+ },
228
+ {
229
+ internalType: "bytes[]",
230
+ name: "data",
231
+ type: "bytes[]"
232
+ },
233
+ {
234
+ internalType: "string[]",
235
+ name: "gateways",
236
+ type: "string[]"
237
+ }
238
+ ],
239
+ name: "resolve",
240
+ outputs: [
241
+ {
242
+ internalType: "bytes[]",
243
+ name: "",
244
+ type: "bytes[]"
245
+ },
246
+ {
247
+ internalType: "address",
248
+ name: "",
249
+ type: "address"
250
+ }
251
+ ],
252
+ stateMutability: "view",
253
+ type: "function"
254
+ },
90
255
  {
91
256
  inputs: [
92
257
  {
@@ -130,11 +295,84 @@ var _abi = [
130
295
  }
131
296
  ],
132
297
  name: "resolveCallback",
298
+ outputs: [
299
+ {
300
+ internalType: "bytes[]",
301
+ name: "",
302
+ type: "bytes[]"
303
+ },
304
+ {
305
+ internalType: "address",
306
+ name: "",
307
+ type: "address"
308
+ }
309
+ ],
310
+ stateMutability: "nonpayable",
311
+ type: "function"
312
+ },
313
+ {
314
+ inputs: [
315
+ {
316
+ internalType: "bytes",
317
+ name: "response",
318
+ type: "bytes"
319
+ },
320
+ {
321
+ internalType: "bytes",
322
+ name: "extraData",
323
+ type: "bytes"
324
+ }
325
+ ],
326
+ name: "resolveSingleCallback",
133
327
  outputs: [
134
328
  {
135
329
  internalType: "bytes",
136
330
  name: "",
137
331
  type: "bytes"
332
+ },
333
+ {
334
+ internalType: "address",
335
+ name: "",
336
+ type: "address"
337
+ }
338
+ ],
339
+ stateMutability: "nonpayable",
340
+ type: "function"
341
+ },
342
+ {
343
+ inputs: [
344
+ {
345
+ internalType: "bytes",
346
+ name: "reverseName",
347
+ type: "bytes"
348
+ },
349
+ {
350
+ internalType: "string[]",
351
+ name: "gateways",
352
+ type: "string[]"
353
+ }
354
+ ],
355
+ name: "reverse",
356
+ outputs: [
357
+ {
358
+ internalType: "string",
359
+ name: "",
360
+ type: "string"
361
+ },
362
+ {
363
+ internalType: "address",
364
+ name: "",
365
+ type: "address"
366
+ },
367
+ {
368
+ internalType: "address",
369
+ name: "",
370
+ type: "address"
371
+ },
372
+ {
373
+ internalType: "address",
374
+ name: "",
375
+ type: "address"
138
376
  }
139
377
  ],
140
378
  stateMutability: "view",
@@ -174,6 +412,45 @@ var _abi = [
174
412
  stateMutability: "view",
175
413
  type: "function"
176
414
  },
415
+ {
416
+ inputs: [
417
+ {
418
+ internalType: "bytes",
419
+ name: "response",
420
+ type: "bytes"
421
+ },
422
+ {
423
+ internalType: "bytes",
424
+ name: "extraData",
425
+ type: "bytes"
426
+ }
427
+ ],
428
+ name: "reverseCallback",
429
+ outputs: [
430
+ {
431
+ internalType: "string",
432
+ name: "",
433
+ type: "string"
434
+ },
435
+ {
436
+ internalType: "address",
437
+ name: "",
438
+ type: "address"
439
+ },
440
+ {
441
+ internalType: "address",
442
+ name: "",
443
+ type: "address"
444
+ },
445
+ {
446
+ internalType: "address",
447
+ name: "",
448
+ type: "address"
449
+ }
450
+ ],
451
+ stateMutability: "nonpayable",
452
+ type: "function"
453
+ },
177
454
  {
178
455
  inputs: [
179
456
  {