@ensdomains/ensjs 3.0.0-alpha.26 → 3.0.0-alpha.28
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/README.md +1 -1
- package/dist/cjs/contracts/getContractAddress.js +1 -1
- package/dist/cjs/functions/batchWrappers.js +41 -8
- package/dist/cjs/functions/getName.js +2 -2
- package/dist/cjs/functions/getNames.js +89 -1
- package/dist/cjs/functions/getOwner.js +4 -4
- package/dist/cjs/functions/getProfile.js +117 -87
- package/dist/cjs/functions/getWrapperData.js +1 -11
- package/dist/cjs/generated/factories/NameWrapper__factory.js +13 -0
- package/dist/cjs/generated/factories/UniversalResolver__factory.js +277 -0
- package/dist/cjs/utils/ccip.js +128 -0
- package/dist/cjs/utils/fuses.js +17 -0
- package/dist/cjs/utils/singleCall.js +1 -1
- package/dist/esm/contracts/getContractAddress.mjs +1 -1
- package/dist/esm/functions/batchWrappers.mjs +35 -8
- package/dist/esm/functions/getName.mjs +2 -2
- package/dist/esm/functions/getNames.mjs +89 -1
- package/dist/esm/functions/getOwner.mjs +4 -4
- package/dist/esm/functions/getProfile.mjs +117 -87
- package/dist/esm/functions/getWrapperData.mjs +2 -12
- package/dist/esm/generated/factories/NameWrapper__factory.mjs +13 -0
- package/dist/esm/generated/factories/UniversalResolver__factory.mjs +277 -0
- package/dist/esm/utils/ccip.mjs +114 -0
- package/dist/esm/utils/fuses.mjs +17 -0
- package/dist/esm/utils/singleCall.mjs +1 -1
- package/dist/types/functions/batchWrappers.d.ts +58 -1
- package/dist/types/functions/getNames.d.ts +9 -3
- package/dist/types/functions/getProfile.d.ts +6 -0
- package/dist/types/functions/getWrapperData.d.ts +1 -2
- package/dist/types/generated/NameWrapper.d.ts +9 -1
- package/dist/types/generated/UniversalResolver.d.ts +123 -21
- package/dist/types/index.d.ts +68 -3
- package/dist/types/utils/ccip.d.ts +3 -0
- package/dist/types/utils/fuses.d.ts +2 -0
- package/package.json +3 -3
- package/src/contracts/getContractAddress.ts +1 -1
- package/src/functions/batchWrappers.ts +40 -9
- package/src/functions/getName.ts +2 -2
- package/src/functions/getNames.test.ts +27 -0
- package/src/functions/getNames.ts +101 -3
- package/src/functions/getOwner.ts +4 -2
- package/src/functions/getProfile-ccip.test.ts +29 -0
- package/src/functions/getProfile.test.ts +1 -1
- package/src/functions/getProfile.ts +160 -100
- package/src/functions/getWrapperData.ts +3 -15
- package/src/functions/setName.test.ts +6 -2
- package/src/functions/setRecord.test.ts +3 -3
- package/src/functions/setRecords.test.ts +2 -2
- package/src/generated/NameWrapper.ts +14 -0
- package/src/generated/UniversalResolver.ts +382 -19
- package/src/generated/factories/NameWrapper__factory.ts +13 -0
- package/src/generated/factories/UniversalResolver__factory.ts +277 -0
- package/src/index.ts +1 -1
- package/src/utils/ccip.ts +148 -0
- package/src/utils/fuses.ts +21 -0
- package/src/utils/singleCall.ts +1 -1
|
@@ -66,7 +66,7 @@ var raw = async ({ contracts, multicallWrapper }, name, contract) => {
|
|
|
66
66
|
};
|
|
67
67
|
var singleContractOwnerDecode = (data) => ethers.utils.defaultAbiCoder.decode(["address"], data)[0];
|
|
68
68
|
var decode = async ({ contracts, multicallWrapper }, data, name, contract) => {
|
|
69
|
-
if (data
|
|
69
|
+
if (!data)
|
|
70
70
|
return;
|
|
71
71
|
const labels = name.split(".");
|
|
72
72
|
if (contract || labels.length === 1) {
|
|
@@ -86,7 +86,7 @@ var decode = async ({ contracts, multicallWrapper }, data, name, contract) => {
|
|
|
86
86
|
};
|
|
87
87
|
}
|
|
88
88
|
const result = await multicallWrapper.decode(data);
|
|
89
|
-
if (result
|
|
89
|
+
if (!result)
|
|
90
90
|
return;
|
|
91
91
|
const nameWrapper = await contracts?.getNameWrapper();
|
|
92
92
|
const decodedData = [result[0][1], result[1][1], result[2]?.[1]].map(
|
|
@@ -110,7 +110,7 @@ var decode = async ({ contracts, multicallWrapper }, data, name, contract) => {
|
|
|
110
110
|
};
|
|
111
111
|
}
|
|
112
112
|
if (labels.length > 2 && ethers.utils.hexStripZeros(registryOwner) !== "0x") {
|
|
113
|
-
if (registryOwner === nameWrapper.address && ethers.utils.hexStripZeros(nameWrapperOwner) !== "0x") {
|
|
113
|
+
if (registryOwner === nameWrapper.address && nameWrapperOwner && ethers.utils.hexStripZeros(nameWrapperOwner) !== "0x") {
|
|
114
114
|
return {
|
|
115
115
|
owner: nameWrapperOwner,
|
|
116
116
|
ownershipLevel: "nameWrapper"
|
|
@@ -123,7 +123,7 @@ var decode = async ({ contracts, multicallWrapper }, data, name, contract) => {
|
|
|
123
123
|
}
|
|
124
124
|
return;
|
|
125
125
|
}
|
|
126
|
-
if (registryOwner === nameWrapper.address && ethers.utils.hexStripZeros(nameWrapperOwner) !== "0x") {
|
|
126
|
+
if (registryOwner === nameWrapper.address && nameWrapperOwner && ethers.utils.hexStripZeros(nameWrapperOwner) !== "0x") {
|
|
127
127
|
return {
|
|
128
128
|
owner: nameWrapperOwner,
|
|
129
129
|
ownershipLevel: "nameWrapper"
|
|
@@ -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: "
|
|
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
|
-
|
|
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
|
-
|
|
60
|
-
|
|
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 === "
|
|
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 "
|
|
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 === "
|
|
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,
|
|
158
|
+
}, name, options, specificResolver) => {
|
|
160
159
|
const universalResolver = await contracts?.getUniversalResolver();
|
|
161
160
|
const { data, calls } = await makeMulticallData(
|
|
162
|
-
{ _getAddr, _getContentHash, _getText
|
|
161
|
+
{ _getAddr, _getContentHash, _getText },
|
|
163
162
|
name,
|
|
164
163
|
options
|
|
165
164
|
);
|
|
166
|
-
let
|
|
167
|
-
let
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
175
|
-
|
|
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
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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
|
-
|
|
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
|
-
|
|
207
|
-
|
|
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
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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
|
|
396
|
-
options.coinTypes
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
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") {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/functions/getWrapperData.ts
|
|
2
2
|
import { BigNumber } from "ethers";
|
|
3
|
-
import {
|
|
3
|
+
import { decodeFuses } from "../utils/fuses.mjs";
|
|
4
4
|
import { namehash } from "../utils/normalise.mjs";
|
|
5
5
|
var raw = async ({ contracts }, name) => {
|
|
6
6
|
const nameWrapper = await contracts?.getNameWrapper();
|
|
@@ -17,17 +17,7 @@ var decode = async ({ contracts }, data) => {
|
|
|
17
17
|
data
|
|
18
18
|
);
|
|
19
19
|
const fuses = BigNumber.from(_fuses);
|
|
20
|
-
const fuseObj =
|
|
21
|
-
Object.keys(fuseEnum).map((fuse) => [
|
|
22
|
-
fuse,
|
|
23
|
-
fuses.and(fuseEnum[fuse]).gt(0)
|
|
24
|
-
])
|
|
25
|
-
);
|
|
26
|
-
if (fuses.eq(0)) {
|
|
27
|
-
fuseObj.CAN_DO_EVERYTHING = true;
|
|
28
|
-
} else {
|
|
29
|
-
fuseObj.CAN_DO_EVERYTHING = false;
|
|
30
|
-
}
|
|
20
|
+
const fuseObj = decodeFuses(fuses);
|
|
31
21
|
const expiryDate = new Date(expiry * 1e3);
|
|
32
22
|
return {
|
|
33
23
|
fuseObj,
|
|
@@ -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
|
{
|