@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.
@@ -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 null;
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
- return owner;
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) {
@@ -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 null;
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
- return owner;
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) {