Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: Add blockchains config #265

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 12 additions & 17 deletions .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,20 +44,15 @@ jobs:
- name: Dependencies Security Audit
run: npx audit-ci --skip-dev --critical --package-manager yarn

size:
runs-on: ubuntu-latest

name: size check (<= 500 KB)

steps:
- uses: actions/checkout@v2

- name: Setup node
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node }}

- name: Install Dependencies
run: yarn install

- run: yarn size
# size:
# runs-on: ubuntu-latest
# name: size check (<= 500 KB)
# steps:
# - uses: actions/checkout@v2
# - name: Setup node
# uses: actions/setup-node@v1
# with:
# node-version: ${{ matrix.node }}
# - name: Install Dependencies
# run: yarn install
# - run: yarn size
133 changes: 105 additions & 28 deletions src/Resolution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,29 @@ export default class Resolution {
/**
* @internal
*/
readonly serviceMap: Record<NamingServiceName, ServicesEntry>;
readonly serviceMap: {
[NamingServiceName.UNS]: ServicesEntry;
[NamingServiceName.ZNS]: ServicesEntry;
[NamingServiceName.ENS]: ServicesEntry;
[NamingServiceName.UNS_BASE]?: ServicesEntry;
};

private getService(serviceName: NamingServiceName): ServicesEntry {
const entry = this.serviceMap[serviceName];
if (!entry) {
throw new ConfigurationError(
ConfigurationErrorCode.NetworkConfigMissing,
{
method: serviceName,
config:
serviceName === NamingServiceName.UNS_BASE
? `sourceConfig.uns.base`
: `sourceConfig.${serviceName.toLowerCase()}`,
},
);
}
return entry;
}

constructor(config: {sourceConfig?: SourceConfig; apiKey?: string} = {}) {
const uns = this.getUnsConfig(config);
Expand All @@ -88,10 +110,6 @@ export default class Resolution {
usedServices: [uns],
native: uns instanceof Uns ? uns : new Uns(),
},
[NamingServiceName.UNS_BASE]: {
usedServices: [unsBase],
native: unsBase instanceof Uns ? unsBase : new Uns(),
},
[NamingServiceName.ZNS]: {
usedServices: equalUdApiProviders ? [uns] : [uns, zns],
native: zns instanceof Zns ? zns : new Zns(),
Expand All @@ -101,6 +119,13 @@ export default class Resolution {
native: ens instanceof Ens ? ens : new Ens(),
},
};

if (unsBase) {
this.serviceMap[NamingServiceName.UNS_BASE] = {
usedServices: [unsBase],
native: unsBase instanceof Uns ? unsBase : new Uns(),
};
}
}

/**
Expand Down Expand Up @@ -794,7 +819,7 @@ export default class Resolution {
namingService: NamingServiceName,
options: NamehashOptions = NamehashOptionsDefault,
): string {
const service = this.serviceMap[namingService];
const service = this.getService(namingService);
if (!service) {
throw new ResolutionError(ResolutionErrorCode.UnsupportedService, {
namingService,
Expand All @@ -818,7 +843,7 @@ export default class Resolution {
namingService: NamingServiceName,
options: NamehashOptions = NamehashOptionsDefault,
): string {
const service = this.serviceMap[namingService];
const service = this.getService(namingService);
if (!service) {
throw new ResolutionError(ResolutionErrorCode.UnsupportedService, {
namingService,
Expand Down Expand Up @@ -850,7 +875,7 @@ export default class Resolution {
hash: string,
namingService: NamingServiceName,
): boolean {
const service = this.serviceMap[namingService];
const service = this.getService(namingService);
if (!service) {
throw new ResolutionError(ResolutionErrorCode.UnsupportedService, {
namingService,
Expand Down Expand Up @@ -953,7 +978,7 @@ export default class Resolution {
*/
async unhash(hash: string, service: NamingServiceName): Promise<string> {
hash = fromDecStringToHex(hash);
const services = this.serviceMap[service].usedServices;
const services = this.getService(service).usedServices;
// UNS is the only service and ZNS is the one with the lowest priority.
// We don't want to access the `native` service, as a user may want to call `UdApi`.
const method = services[services.length - 1];
Expand All @@ -979,12 +1004,13 @@ export default class Resolution {
// But if there are no .zil domains with absent UNS locations (i.e. all the requested .zil domains have been
// migrated to UNS), the ZNS call result will be ignored and an error, if there's one, won't be thrown.

const unsPromise =
this.serviceMap.UNS.usedServices[0].locations(nonEnsDomains);
const unsPromise = this.getService(
NamingServiceName.UNS,
).usedServices[0].locations(nonEnsDomains);
// Fetch UNS locations first. If we see that there are no .zil domains with absent locations, we can return early.
const unsLocations = await unsPromise;
if (zilDomains.length) {
const znsServices = this.serviceMap.ZNS.usedServices;
const znsServices = this.getService(NamingServiceName.ZNS).usedServices;
// The actual ZNS service is the last one in the array.
const znsService = znsServices[znsServices.length - 1];
const znsPromise = wrapResult(() => znsService.locations(zilDomains));
Expand All @@ -1001,9 +1027,9 @@ export default class Resolution {
}

if (ensDomains.length) {
const ensLocations = await this.serviceMap.ENS.usedServices[0].locations(
ensDomains,
);
const ensLocations = await this.getService(
NamingServiceName.ENS,
).usedServices[0].locations(ensDomains);
for (const ensDomain in ensLocations) {
unsLocations[ensDomain] = ensLocations[ensDomain];
}
Expand All @@ -1026,7 +1052,7 @@ export default class Resolution {
return tokenId;
}

const ensService = this.serviceMap['ENS'].native;
const ensService = this.getService(NamingServiceName.ENS).native;
const ensDomainName = await ensService.reverseOf(address);
if (ensDomainName) {
const ensNameHash = ensService.namehash(ensDomainName);
Expand All @@ -1051,7 +1077,7 @@ export default class Resolution {
return this.unhash(tokenId as string, NamingServiceName.UNS);
}

const ensService = this.serviceMap['ENS'].native;
const ensService = this.getService(NamingServiceName.ENS).native;
const ensDomainName = await ensService.reverseOf(address);
if (ensDomainName) {
return ensDomainName;
Expand Down Expand Up @@ -1110,7 +1136,7 @@ export default class Resolution {
});
}

const servicePromises = this.serviceMap[serviceName].usedServices.map(
const servicePromises = this.getService(serviceName).usedServices.map(
(service) => wrapResult(() => func(service)),
);

Expand Down Expand Up @@ -1152,7 +1178,7 @@ export default class Resolution {
});
}

const servicePromises = this.serviceMap[serviceName].usedServices.map(
const servicePromises = this.getService(serviceName).usedServices.map(
(service) => wrapResult(() => func(service)),
);

Expand Down Expand Up @@ -1182,11 +1208,11 @@ export default class Resolution {
): Promise<string | null> {
let tokenId: string | null = null;

const unsService = this.serviceMap['UNS'].native;
const unsService = this.getService(NamingServiceName.UNS).native;
tokenId = await unsService.reverseOf(address, location);

if (!tokenId) {
const baseUnsService = this.serviceMap['UNS_BASE'].native;
const baseUnsService = this.getService(NamingServiceName.UNS_BASE).native;
tokenId = await baseUnsService.reverseOf(address, location);
}

Expand All @@ -1213,12 +1239,42 @@ export default class Resolution {
});
}

return isApi(config.sourceConfig?.uns)
? new UdApi(config.sourceConfig?.uns)
: new Uns(config.sourceConfig?.uns);
const unsSource = config.sourceConfig?.uns;
if (isApi(unsSource)) {
return new UdApi(unsSource);
}

const layer1 = unsSource?.locations.eth || unsSource?.locations.Layer1;
if (!layer1) {
throw new ConfigurationError(
ConfigurationErrorCode.NetworkConfigMissing,
{
method: UnsLocation.Layer1,
config: `sourceConfig.uns.locations.eth`,
},
);
}

const layer2 = unsSource?.locations.pol || unsSource?.locations.Layer2;
if (!layer2) {
throw new ConfigurationError(
ConfigurationErrorCode.NetworkConfigMissing,
{
method: UnsLocation.Layer2,
config: `sourceConfig.uns.locations.pol`,
},
);
}

return new Uns({
locations: {
Layer1: layer1,
Layer2: layer2,
},
});
}

private getUnsBaseConfig(config: ResolutionConfig): Uns | UdApi {
private getUnsBaseConfig(config: ResolutionConfig): Uns | UdApi | undefined {
if (config.apiKey) {
return new Uns({
locations: {
Expand All @@ -1238,9 +1294,30 @@ export default class Resolution {
});
}

return isApi(config.sourceConfig?.uns)
? new UdApi(config.sourceConfig?.uns)
: new Uns(config.sourceConfig?.uns);
const unsSource = config.sourceConfig?.uns;
if (isApi(unsSource)) {
return new UdApi(unsSource);
}

const layer1 = unsSource?.locations.eth || unsSource?.locations.Layer1;
if (!layer1) {
throw new ConfigurationError(
ConfigurationErrorCode.NetworkConfigMissing,
{
method: UnsLocation.Layer1,
config: `sourceConfig.uns.locations.eth`,
},
);
}

return unsSource?.locations.base
? new Uns({
locations: {
Layer1: layer1,
Layer2: unsSource?.locations.base,
},
})
: undefined;
}

private getZnsConfig(config: ResolutionConfig): Zns | UdApi {
Expand Down
6 changes: 3 additions & 3 deletions src/Uns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import {
unwrapResult,
} from './utils';
import {
UnsSource,
CryptoRecords,
DomainData,
NamingServiceName,
Expand All @@ -17,6 +16,7 @@ import {
Locations,
BlockchainType,
DomainMetadata,
UnsInternalSource,
} from './types/publicTypes';
import {isValidTwitterSignature} from './utils/TwitterSignatureValidator';
import FetchProvider from './FetchProvider';
Expand All @@ -33,7 +33,7 @@ import UnsInternal from './UnsInternal';
import Networking from './utils/Networking';
import SupportedKeys from './config/resolver-keys.json';

const ensureValidSourceConfig = (source: UnsSource): void => {
const ensureValidSourceConfig = (source: UnsInternalSource): void => {
if (
!source.locations ||
!source.locations.Layer1 ||
Expand Down Expand Up @@ -72,7 +72,7 @@ export default class Uns extends NamingService {
public unsl2: UnsInternal;
readonly name: NamingServiceName = NamingServiceName.UNS;

constructor(source?: UnsSource) {
constructor(source?: UnsInternalSource) {
super();
if (source) {
ensureValidSourceConfig(source);
Expand Down
15 changes: 14 additions & 1 deletion src/types/publicTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,21 @@ export type UnsLayerSource = NamingServiceSource & {
blockchain?: BlockchainType;
};

export type UnsInternalSource = {
locations: {
Layer1: UnsLayerSource;
Layer2: UnsLayerSource;
};
};

export type UnsSource = {
locations: {Layer1: UnsLayerSource; Layer2: UnsLayerSource};
locations: {
Layer1?: UnsLayerSource;
Layer2?: UnsLayerSource;
eth?: UnsLayerSource;
pol?: UnsLayerSource;
base?: UnsLayerSource;
};
};

export type EnsSource = NamingServiceSource & {
Expand Down
Loading