@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.
- package/dist/snapshot.cjs.js +83 -2
- package/dist/snapshot.esm.js +83 -2
- package/dist/snapshot.min.js +1 -1
- package/dist/src/utils.d.ts +2 -2
- package/package.json +1 -1
- package/src/networks.json +15 -0
- package/src/utils.spec.js +9 -1
- package/src/utils.ts +78 -4
package/dist/snapshot.cjs.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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) {
|
package/dist/snapshot.esm.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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) {
|