-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathens.ts
More file actions
99 lines (87 loc) · 2.58 KB
/
ens.ts
File metadata and controls
99 lines (87 loc) · 2.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import { getAddress } from '@ethersproject/address';
import snapshot from '@snapshot-labs/snapshot.js';
import { capture } from '@snapshot-labs/snapshot-sentry';
import { ens_normalize } from '@adraffy/ens-normalize';
import {
provider as getProvider,
Address,
Handle,
isSilencedError,
FetchError,
isEvmAddress
} from './utils';
import { graphQlCall } from '../helpers/utils';
export const NAME = 'Ens';
const NETWORK = '1';
const provider = getProvider(NETWORK);
function normalizeEns(names: Handle[]): Handle[] {
return names.map(name => {
try {
return ens_normalize(name) === name ? name : '';
} catch (e) {
return '';
}
});
}
function normalizeAddresses(addresses: Address[]): Address[] {
return addresses.filter(isEvmAddress);
}
function normalizeHandles(names: Handle[]): Handle[] {
return normalizeEns(names).filter(h => h);
}
export async function lookupAddresses(addresses: Address[]): Promise<Record<Address, Handle>> {
const abi = ['function getNames(address[] addresses) view returns (string[] r)'];
const normalizedAddresses = normalizeAddresses(addresses);
if (normalizedAddresses.length === 0) return {};
try {
const reverseRecords = await snapshot.utils.call(
provider,
abi,
['0x3671aE578E63FdF66ad4F3E12CC0c0d71Ac7510C', 'getNames', [normalizedAddresses]],
{ blockTag: 'latest' }
);
const validNames = normalizeEns(reverseRecords);
return Object.fromEntries(
normalizedAddresses
.map((address, index) => [address, validNames[index]])
.filter((_, index) => !!validNames[index])
);
} catch (e) {
if (!isSilencedError(e)) {
capture(e, { input: { addresses: normalizedAddresses } });
}
throw new FetchError();
}
}
export async function resolveNames(handles: Handle[]): Promise<Record<Handle, Address>> {
const normalizedHandles = normalizeHandles(handles);
if (normalizedHandles.length === 0) return {};
try {
const {
data: {
data: { domains: items }
}
} = await graphQlCall(
'https://api.thegraph.com/subgraphs/name/ensdomains/ens',
`query Domains {
domains(where: {name_in: ["${normalizedHandles.join('","')}"]}) {
name
resolvedAddress {
id
}
}
}`
);
return Object.fromEntries(
items.map(item => [
item.name,
item.resolvedAddress ? getAddress(item.resolvedAddress.id) : ''
])
);
} catch (e) {
if (!isSilencedError(e)) {
capture(e, { input: { handles: normalizedHandles } });
}
throw new FetchError();
}
}