@snapshot-labs/snapshot.js 0.12.55 → 0.12.57

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.
@@ -2284,6 +2284,22 @@ var networks = {
2284
2284
  },
2285
2285
  start: 13960096,
2286
2286
  logo: "ipfs://QmU7f1MyRz8rLELFfypnWZQjGbDGYgZtC9rjw47jYMYrnu"
2287
+ },
2288
+ "296": {
2289
+ key: "296",
2290
+ name: "Hedera Testnet",
2291
+ shortName: "testnet",
2292
+ chainId: 296,
2293
+ network: "testnet",
2294
+ multicall: "0xADE3166b0afA89b2CDB64870D70ADeD330Eab015",
2295
+ rpc: [
2296
+ ],
2297
+ explorer: {
2298
+ url: "https://hashscan.io/testnet"
2299
+ },
2300
+ start: 17561901,
2301
+ logo: "ipfs://bafkreia5gpitwgo4sspvvtwqcxosq2krrqo5dbrnvylgibvmypzotfmbuu",
2302
+ testnet: true
2287
2303
  },
2288
2304
  "300": {
2289
2305
  key: "300",
@@ -4308,6 +4324,13 @@ function fetchData(_a) {
4308
4324
  });
4309
4325
  }
4310
4326
 
4327
+ const MUTED_ERRORS = [
4328
+ // mute error from coinbase, when the subdomain is not found
4329
+ // most other resolvers just return an empty address
4330
+ 'response not found during CCIP fetch',
4331
+ // mute error from missing offchain resolver (mostly for sepolia)
4332
+ 'UNSUPPORTED_OPERATION'
4333
+ ];
4311
4334
  const ENS_REGISTRY = '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e';
4312
4335
  const ENS_ABI = [
4313
4336
  'function text(bytes32 node, string calldata key) external view returns (string memory)',
@@ -4482,6 +4505,41 @@ ajv.addFormat('domain', {
4482
4505
  return !!value.match(/^(https:\/\/)?([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}(\/)?$/);
4483
4506
  }
4484
4507
  });
4508
+ function getDomainType(domain) {
4509
+ const isEns = domain.endsWith('.eth');
4510
+ const tokens = domain.split('.');
4511
+ if (tokens.length === 1)
4512
+ return 'tld';
4513
+ else if (tokens.length === 2 && !isEns)
4514
+ return 'other-tld';
4515
+ else if (tokens.length > 2)
4516
+ return 'subdomain';
4517
+ else if (isEns)
4518
+ return 'ens';
4519
+ else
4520
+ throw new Error('Invalid domain');
4521
+ }
4522
+ // see https://docs.ens.domains/registry/dns#gasless-import
4523
+ function getDNSOwner(domain) {
4524
+ return __awaiter(this, void 0, void 0, function* () {
4525
+ var _a;
4526
+ const response = yield fetch__default['default'](`https://cloudflare-dns.com/dns-query?name=${domain}&type=TXT`, {
4527
+ headers: {
4528
+ accept: 'application/dns-json'
4529
+ }
4530
+ });
4531
+ const data = yield response.json();
4532
+ // Error list: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
4533
+ if (data.Status === 3)
4534
+ return EMPTY_ADDRESS;
4535
+ if (data.Status !== 0)
4536
+ throw new Error('Failed to fetch DNS Owner');
4537
+ const ownerRecord = (_a = data.Answer) === null || _a === void 0 ? void 0 : _a.find((record) => record.data.includes('ENS1'));
4538
+ if (!ownerRecord)
4539
+ return EMPTY_ADDRESS;
4540
+ return address.getAddress(ownerRecord.data.replace(new RegExp('"', 'g'), '').split(' ').pop());
4541
+ });
4542
+ }
4485
4543
  function call(provider, abi, call, options) {
4486
4544
  return __awaiter(this, void 0, void 0, function* () {
4487
4545
  const contract = new contracts.Contract(call[0], abi, provider);
@@ -4773,6 +4831,11 @@ function getSpaceUri(id_1) {
4773
4831
  }
4774
4832
  function getEnsOwner(ens_1) {
4775
4833
  return __awaiter(this, arguments, void 0, function* (ens, network = '1', options = {}) {
4834
+ var _a, _b;
4835
+ if (!((_b = (_a = networks[network]) === null || _a === void 0 ? void 0 : _a.ensResolvers) === null || _b === void 0 ? void 0 : _b.length)) {
4836
+ throw new Error('Network not supported');
4837
+ }
4838
+ const domainType = getDomainType(ens);
4776
4839
  const provider = getProvider(network, options);
4777
4840
  const ensRegistry = new contracts.Contract(ENS_REGISTRY, ['function owner(bytes32) view returns (address)'], provider);
4778
4841
  let ensHash;
@@ -4780,7 +4843,7 @@ function getEnsOwner(ens_1) {
4780
4843
  ensHash = hash.namehash(hash.ensNormalize(ens));
4781
4844
  }
4782
4845
  catch (e) {
4783
- return null;
4846
+ return EMPTY_ADDRESS;
4784
4847
  }
4785
4848
  const ensNameWrapper = options.ensNameWrapper || networks[network].ensNameWrapper;
4786
4849
  let owner = yield ensRegistry.owner(ensHash);
@@ -4789,7 +4852,25 @@ function getEnsOwner(ens_1) {
4789
4852
  const ensNameWrapperContract = new contracts.Contract(ensNameWrapper, ['function ownerOf(uint256) view returns (address)'], provider);
4790
4853
  owner = yield ensNameWrapperContract.ownerOf(ensHash);
4791
4854
  }
4792
- return owner;
4855
+ if (owner === EMPTY_ADDRESS && domainType === 'other-tld') {
4856
+ const resolvedAddress = yield provider.resolveName(ens);
4857
+ // Filter out domains with valid TXT records, but not imported
4858
+ if (resolvedAddress) {
4859
+ owner = yield getDNSOwner(ens);
4860
+ }
4861
+ }
4862
+ if (owner === EMPTY_ADDRESS && domainType === 'subdomain') {
4863
+ try {
4864
+ owner = yield provider.resolveName(ens);
4865
+ }
4866
+ catch (e) {
4867
+ if (MUTED_ERRORS.every((error) => !e.message.includes(error))) {
4868
+ throw e;
4869
+ }
4870
+ owner = EMPTY_ADDRESS;
4871
+ }
4872
+ }
4873
+ return owner || EMPTY_ADDRESS;
4793
4874
  });
4794
4875
  }
4795
4876
  function getSpaceController(id_1) {
@@ -2274,6 +2274,22 @@ var networks = {
2274
2274
  },
2275
2275
  start: 13960096,
2276
2276
  logo: "ipfs://QmU7f1MyRz8rLELFfypnWZQjGbDGYgZtC9rjw47jYMYrnu"
2277
+ },
2278
+ "296": {
2279
+ key: "296",
2280
+ name: "Hedera Testnet",
2281
+ shortName: "testnet",
2282
+ chainId: 296,
2283
+ network: "testnet",
2284
+ multicall: "0xADE3166b0afA89b2CDB64870D70ADeD330Eab015",
2285
+ rpc: [
2286
+ ],
2287
+ explorer: {
2288
+ url: "https://hashscan.io/testnet"
2289
+ },
2290
+ start: 17561901,
2291
+ logo: "ipfs://bafkreia5gpitwgo4sspvvtwqcxosq2krrqo5dbrnvylgibvmypzotfmbuu",
2292
+ testnet: true
2277
2293
  },
2278
2294
  "300": {
2279
2295
  key: "300",
@@ -4298,6 +4314,13 @@ function fetchData(_a) {
4298
4314
  });
4299
4315
  }
4300
4316
 
4317
+ const MUTED_ERRORS = [
4318
+ // mute error from coinbase, when the subdomain is not found
4319
+ // most other resolvers just return an empty address
4320
+ 'response not found during CCIP fetch',
4321
+ // mute error from missing offchain resolver (mostly for sepolia)
4322
+ 'UNSUPPORTED_OPERATION'
4323
+ ];
4301
4324
  const ENS_REGISTRY = '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e';
4302
4325
  const ENS_ABI = [
4303
4326
  'function text(bytes32 node, string calldata key) external view returns (string memory)',
@@ -4472,6 +4495,41 @@ ajv.addFormat('domain', {
4472
4495
  return !!value.match(/^(https:\/\/)?([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}(\/)?$/);
4473
4496
  }
4474
4497
  });
4498
+ function getDomainType(domain) {
4499
+ const isEns = domain.endsWith('.eth');
4500
+ const tokens = domain.split('.');
4501
+ if (tokens.length === 1)
4502
+ return 'tld';
4503
+ else if (tokens.length === 2 && !isEns)
4504
+ return 'other-tld';
4505
+ else if (tokens.length > 2)
4506
+ return 'subdomain';
4507
+ else if (isEns)
4508
+ return 'ens';
4509
+ else
4510
+ throw new Error('Invalid domain');
4511
+ }
4512
+ // see https://docs.ens.domains/registry/dns#gasless-import
4513
+ function getDNSOwner(domain) {
4514
+ return __awaiter(this, void 0, void 0, function* () {
4515
+ var _a;
4516
+ const response = yield fetch(`https://cloudflare-dns.com/dns-query?name=${domain}&type=TXT`, {
4517
+ headers: {
4518
+ accept: 'application/dns-json'
4519
+ }
4520
+ });
4521
+ const data = yield response.json();
4522
+ // Error list: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
4523
+ if (data.Status === 3)
4524
+ return EMPTY_ADDRESS;
4525
+ if (data.Status !== 0)
4526
+ throw new Error('Failed to fetch DNS Owner');
4527
+ const ownerRecord = (_a = data.Answer) === null || _a === void 0 ? void 0 : _a.find((record) => record.data.includes('ENS1'));
4528
+ if (!ownerRecord)
4529
+ return EMPTY_ADDRESS;
4530
+ return getAddress(ownerRecord.data.replace(new RegExp('"', 'g'), '').split(' ').pop());
4531
+ });
4532
+ }
4475
4533
  function call(provider, abi, call, options) {
4476
4534
  return __awaiter(this, void 0, void 0, function* () {
4477
4535
  const contract = new Contract$1(call[0], abi, provider);
@@ -4763,6 +4821,11 @@ function getSpaceUri(id_1) {
4763
4821
  }
4764
4822
  function getEnsOwner(ens_1) {
4765
4823
  return __awaiter(this, arguments, void 0, function* (ens, network = '1', options = {}) {
4824
+ var _a, _b;
4825
+ if (!((_b = (_a = networks[network]) === null || _a === void 0 ? void 0 : _a.ensResolvers) === null || _b === void 0 ? void 0 : _b.length)) {
4826
+ throw new Error('Network not supported');
4827
+ }
4828
+ const domainType = getDomainType(ens);
4766
4829
  const provider = getProvider(network, options);
4767
4830
  const ensRegistry = new Contract$1(ENS_REGISTRY, ['function owner(bytes32) view returns (address)'], provider);
4768
4831
  let ensHash;
@@ -4770,7 +4833,7 @@ function getEnsOwner(ens_1) {
4770
4833
  ensHash = namehash(ensNormalize(ens));
4771
4834
  }
4772
4835
  catch (e) {
4773
- return null;
4836
+ return EMPTY_ADDRESS;
4774
4837
  }
4775
4838
  const ensNameWrapper = options.ensNameWrapper || networks[network].ensNameWrapper;
4776
4839
  let owner = yield ensRegistry.owner(ensHash);
@@ -4779,7 +4842,25 @@ function getEnsOwner(ens_1) {
4779
4842
  const ensNameWrapperContract = new Contract$1(ensNameWrapper, ['function ownerOf(uint256) view returns (address)'], provider);
4780
4843
  owner = yield ensNameWrapperContract.ownerOf(ensHash);
4781
4844
  }
4782
- return owner;
4845
+ if (owner === EMPTY_ADDRESS && domainType === 'other-tld') {
4846
+ const resolvedAddress = yield provider.resolveName(ens);
4847
+ // Filter out domains with valid TXT records, but not imported
4848
+ if (resolvedAddress) {
4849
+ owner = yield getDNSOwner(ens);
4850
+ }
4851
+ }
4852
+ if (owner === EMPTY_ADDRESS && domainType === 'subdomain') {
4853
+ try {
4854
+ owner = yield provider.resolveName(ens);
4855
+ }
4856
+ catch (e) {
4857
+ if (MUTED_ERRORS.every((error) => !e.message.includes(error))) {
4858
+ throw e;
4859
+ }
4860
+ owner = EMPTY_ADDRESS;
4861
+ }
4862
+ }
4863
+ return owner || EMPTY_ADDRESS;
4783
4864
  });
4784
4865
  }
4785
4866
  function getSpaceController(id_1) {