@snapshot-labs/snapshot.js 0.12.55 → 0.12.56
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/dist/snapshot.cjs.js +67 -2
- package/dist/snapshot.esm.js +67 -2
- package/dist/snapshot.min.js +1 -1
- package/dist/src/utils.d.ts +2 -2
- package/package.json +1 -1
- package/src/utils.spec.js +9 -1
- package/src/utils.ts +78 -4
package/dist/snapshot.cjs.js
CHANGED
|
@@ -4308,6 +4308,13 @@ function fetchData(_a) {
|
|
|
4308
4308
|
});
|
|
4309
4309
|
}
|
|
4310
4310
|
|
|
4311
|
+
const MUTED_ERRORS = [
|
|
4312
|
+
// mute error from coinbase, when the subdomain is not found
|
|
4313
|
+
// most other resolvers just return an empty address
|
|
4314
|
+
'response not found during CCIP fetch',
|
|
4315
|
+
// mute error from missing offchain resolver (mostly for sepolia)
|
|
4316
|
+
'UNSUPPORTED_OPERATION'
|
|
4317
|
+
];
|
|
4311
4318
|
const ENS_REGISTRY = '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e';
|
|
4312
4319
|
const ENS_ABI = [
|
|
4313
4320
|
'function text(bytes32 node, string calldata key) external view returns (string memory)',
|
|
@@ -4482,6 +4489,41 @@ ajv.addFormat('domain', {
|
|
|
4482
4489
|
return !!value.match(/^(https:\/\/)?([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}(\/)?$/);
|
|
4483
4490
|
}
|
|
4484
4491
|
});
|
|
4492
|
+
function getDomainType(domain) {
|
|
4493
|
+
const isEns = domain.endsWith('.eth');
|
|
4494
|
+
const tokens = domain.split('.');
|
|
4495
|
+
if (tokens.length === 1)
|
|
4496
|
+
return 'tld';
|
|
4497
|
+
else if (tokens.length === 2 && !isEns)
|
|
4498
|
+
return 'other-tld';
|
|
4499
|
+
else if (tokens.length > 2)
|
|
4500
|
+
return 'subdomain';
|
|
4501
|
+
else if (isEns)
|
|
4502
|
+
return 'ens';
|
|
4503
|
+
else
|
|
4504
|
+
throw new Error('Invalid domain');
|
|
4505
|
+
}
|
|
4506
|
+
// see https://docs.ens.domains/registry/dns#gasless-import
|
|
4507
|
+
function getDNSOwner(domain) {
|
|
4508
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
4509
|
+
var _a;
|
|
4510
|
+
const response = yield fetch__default['default'](`https://cloudflare-dns.com/dns-query?name=${domain}&type=TXT`, {
|
|
4511
|
+
headers: {
|
|
4512
|
+
accept: 'application/dns-json'
|
|
4513
|
+
}
|
|
4514
|
+
});
|
|
4515
|
+
const data = yield response.json();
|
|
4516
|
+
// Error list: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
|
4517
|
+
if (data.Status === 3)
|
|
4518
|
+
return EMPTY_ADDRESS;
|
|
4519
|
+
if (data.Status !== 0)
|
|
4520
|
+
throw new Error('Failed to fetch DNS Owner');
|
|
4521
|
+
const ownerRecord = (_a = data.Answer) === null || _a === void 0 ? void 0 : _a.find((record) => record.data.includes('ENS1'));
|
|
4522
|
+
if (!ownerRecord)
|
|
4523
|
+
return EMPTY_ADDRESS;
|
|
4524
|
+
return address.getAddress(ownerRecord.data.replace(new RegExp('"', 'g'), '').split(' ').pop());
|
|
4525
|
+
});
|
|
4526
|
+
}
|
|
4485
4527
|
function call(provider, abi, call, options) {
|
|
4486
4528
|
return __awaiter(this, void 0, void 0, function* () {
|
|
4487
4529
|
const contract = new contracts.Contract(call[0], abi, provider);
|
|
@@ -4773,6 +4815,11 @@ function getSpaceUri(id_1) {
|
|
|
4773
4815
|
}
|
|
4774
4816
|
function getEnsOwner(ens_1) {
|
|
4775
4817
|
return __awaiter(this, arguments, void 0, function* (ens, network = '1', options = {}) {
|
|
4818
|
+
var _a, _b;
|
|
4819
|
+
if (!((_b = (_a = networks[network]) === null || _a === void 0 ? void 0 : _a.ensResolvers) === null || _b === void 0 ? void 0 : _b.length)) {
|
|
4820
|
+
throw new Error('Network not supported');
|
|
4821
|
+
}
|
|
4822
|
+
const domainType = getDomainType(ens);
|
|
4776
4823
|
const provider = getProvider(network, options);
|
|
4777
4824
|
const ensRegistry = new contracts.Contract(ENS_REGISTRY, ['function owner(bytes32) view returns (address)'], provider);
|
|
4778
4825
|
let ensHash;
|
|
@@ -4780,7 +4827,7 @@ function getEnsOwner(ens_1) {
|
|
|
4780
4827
|
ensHash = hash.namehash(hash.ensNormalize(ens));
|
|
4781
4828
|
}
|
|
4782
4829
|
catch (e) {
|
|
4783
|
-
return
|
|
4830
|
+
return EMPTY_ADDRESS;
|
|
4784
4831
|
}
|
|
4785
4832
|
const ensNameWrapper = options.ensNameWrapper || networks[network].ensNameWrapper;
|
|
4786
4833
|
let owner = yield ensRegistry.owner(ensHash);
|
|
@@ -4789,7 +4836,25 @@ function getEnsOwner(ens_1) {
|
|
|
4789
4836
|
const ensNameWrapperContract = new contracts.Contract(ensNameWrapper, ['function ownerOf(uint256) view returns (address)'], provider);
|
|
4790
4837
|
owner = yield ensNameWrapperContract.ownerOf(ensHash);
|
|
4791
4838
|
}
|
|
4792
|
-
|
|
4839
|
+
if (owner === EMPTY_ADDRESS && domainType === 'other-tld') {
|
|
4840
|
+
const resolvedAddress = yield provider.resolveName(ens);
|
|
4841
|
+
// Filter out domains with valid TXT records, but not imported
|
|
4842
|
+
if (resolvedAddress) {
|
|
4843
|
+
owner = yield getDNSOwner(ens);
|
|
4844
|
+
}
|
|
4845
|
+
}
|
|
4846
|
+
if (owner === EMPTY_ADDRESS && domainType === 'subdomain') {
|
|
4847
|
+
try {
|
|
4848
|
+
owner = yield provider.resolveName(ens);
|
|
4849
|
+
}
|
|
4850
|
+
catch (e) {
|
|
4851
|
+
if (MUTED_ERRORS.every((error) => !e.message.includes(error))) {
|
|
4852
|
+
throw e;
|
|
4853
|
+
}
|
|
4854
|
+
owner = EMPTY_ADDRESS;
|
|
4855
|
+
}
|
|
4856
|
+
}
|
|
4857
|
+
return owner || EMPTY_ADDRESS;
|
|
4793
4858
|
});
|
|
4794
4859
|
}
|
|
4795
4860
|
function getSpaceController(id_1) {
|
package/dist/snapshot.esm.js
CHANGED
|
@@ -4298,6 +4298,13 @@ function fetchData(_a) {
|
|
|
4298
4298
|
});
|
|
4299
4299
|
}
|
|
4300
4300
|
|
|
4301
|
+
const MUTED_ERRORS = [
|
|
4302
|
+
// mute error from coinbase, when the subdomain is not found
|
|
4303
|
+
// most other resolvers just return an empty address
|
|
4304
|
+
'response not found during CCIP fetch',
|
|
4305
|
+
// mute error from missing offchain resolver (mostly for sepolia)
|
|
4306
|
+
'UNSUPPORTED_OPERATION'
|
|
4307
|
+
];
|
|
4301
4308
|
const ENS_REGISTRY = '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e';
|
|
4302
4309
|
const ENS_ABI = [
|
|
4303
4310
|
'function text(bytes32 node, string calldata key) external view returns (string memory)',
|
|
@@ -4472,6 +4479,41 @@ ajv.addFormat('domain', {
|
|
|
4472
4479
|
return !!value.match(/^(https:\/\/)?([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}(\/)?$/);
|
|
4473
4480
|
}
|
|
4474
4481
|
});
|
|
4482
|
+
function getDomainType(domain) {
|
|
4483
|
+
const isEns = domain.endsWith('.eth');
|
|
4484
|
+
const tokens = domain.split('.');
|
|
4485
|
+
if (tokens.length === 1)
|
|
4486
|
+
return 'tld';
|
|
4487
|
+
else if (tokens.length === 2 && !isEns)
|
|
4488
|
+
return 'other-tld';
|
|
4489
|
+
else if (tokens.length > 2)
|
|
4490
|
+
return 'subdomain';
|
|
4491
|
+
else if (isEns)
|
|
4492
|
+
return 'ens';
|
|
4493
|
+
else
|
|
4494
|
+
throw new Error('Invalid domain');
|
|
4495
|
+
}
|
|
4496
|
+
// see https://docs.ens.domains/registry/dns#gasless-import
|
|
4497
|
+
function getDNSOwner(domain) {
|
|
4498
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
4499
|
+
var _a;
|
|
4500
|
+
const response = yield fetch(`https://cloudflare-dns.com/dns-query?name=${domain}&type=TXT`, {
|
|
4501
|
+
headers: {
|
|
4502
|
+
accept: 'application/dns-json'
|
|
4503
|
+
}
|
|
4504
|
+
});
|
|
4505
|
+
const data = yield response.json();
|
|
4506
|
+
// Error list: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
|
4507
|
+
if (data.Status === 3)
|
|
4508
|
+
return EMPTY_ADDRESS;
|
|
4509
|
+
if (data.Status !== 0)
|
|
4510
|
+
throw new Error('Failed to fetch DNS Owner');
|
|
4511
|
+
const ownerRecord = (_a = data.Answer) === null || _a === void 0 ? void 0 : _a.find((record) => record.data.includes('ENS1'));
|
|
4512
|
+
if (!ownerRecord)
|
|
4513
|
+
return EMPTY_ADDRESS;
|
|
4514
|
+
return getAddress(ownerRecord.data.replace(new RegExp('"', 'g'), '').split(' ').pop());
|
|
4515
|
+
});
|
|
4516
|
+
}
|
|
4475
4517
|
function call(provider, abi, call, options) {
|
|
4476
4518
|
return __awaiter(this, void 0, void 0, function* () {
|
|
4477
4519
|
const contract = new Contract$1(call[0], abi, provider);
|
|
@@ -4763,6 +4805,11 @@ function getSpaceUri(id_1) {
|
|
|
4763
4805
|
}
|
|
4764
4806
|
function getEnsOwner(ens_1) {
|
|
4765
4807
|
return __awaiter(this, arguments, void 0, function* (ens, network = '1', options = {}) {
|
|
4808
|
+
var _a, _b;
|
|
4809
|
+
if (!((_b = (_a = networks[network]) === null || _a === void 0 ? void 0 : _a.ensResolvers) === null || _b === void 0 ? void 0 : _b.length)) {
|
|
4810
|
+
throw new Error('Network not supported');
|
|
4811
|
+
}
|
|
4812
|
+
const domainType = getDomainType(ens);
|
|
4766
4813
|
const provider = getProvider(network, options);
|
|
4767
4814
|
const ensRegistry = new Contract$1(ENS_REGISTRY, ['function owner(bytes32) view returns (address)'], provider);
|
|
4768
4815
|
let ensHash;
|
|
@@ -4770,7 +4817,7 @@ function getEnsOwner(ens_1) {
|
|
|
4770
4817
|
ensHash = namehash(ensNormalize(ens));
|
|
4771
4818
|
}
|
|
4772
4819
|
catch (e) {
|
|
4773
|
-
return
|
|
4820
|
+
return EMPTY_ADDRESS;
|
|
4774
4821
|
}
|
|
4775
4822
|
const ensNameWrapper = options.ensNameWrapper || networks[network].ensNameWrapper;
|
|
4776
4823
|
let owner = yield ensRegistry.owner(ensHash);
|
|
@@ -4779,7 +4826,25 @@ function getEnsOwner(ens_1) {
|
|
|
4779
4826
|
const ensNameWrapperContract = new Contract$1(ensNameWrapper, ['function ownerOf(uint256) view returns (address)'], provider);
|
|
4780
4827
|
owner = yield ensNameWrapperContract.ownerOf(ensHash);
|
|
4781
4828
|
}
|
|
4782
|
-
|
|
4829
|
+
if (owner === EMPTY_ADDRESS && domainType === 'other-tld') {
|
|
4830
|
+
const resolvedAddress = yield provider.resolveName(ens);
|
|
4831
|
+
// Filter out domains with valid TXT records, but not imported
|
|
4832
|
+
if (resolvedAddress) {
|
|
4833
|
+
owner = yield getDNSOwner(ens);
|
|
4834
|
+
}
|
|
4835
|
+
}
|
|
4836
|
+
if (owner === EMPTY_ADDRESS && domainType === 'subdomain') {
|
|
4837
|
+
try {
|
|
4838
|
+
owner = yield provider.resolveName(ens);
|
|
4839
|
+
}
|
|
4840
|
+
catch (e) {
|
|
4841
|
+
if (MUTED_ERRORS.every((error) => !e.message.includes(error))) {
|
|
4842
|
+
throw e;
|
|
4843
|
+
}
|
|
4844
|
+
owner = EMPTY_ADDRESS;
|
|
4845
|
+
}
|
|
4846
|
+
}
|
|
4847
|
+
return owner || EMPTY_ADDRESS;
|
|
4783
4848
|
});
|
|
4784
4849
|
}
|
|
4785
4850
|
function getSpaceController(id_1) {
|