2021-10-31 00:06:11 +00:00
|
|
|
import { BaseProvider } from "@ethersproject/providers";
|
|
|
|
|
import { IAddressResolver } from "./address-resolver";
|
|
|
|
|
|
2021-10-31 05:38:41 +00:00
|
|
|
export type SelectedResolvedName<T> = [IAddressResolver<T>, T];
|
2021-10-31 00:06:11 +00:00
|
|
|
|
2021-10-31 22:51:11 +00:00
|
|
|
export class CompositeAddressResolver<T = any>
|
2021-10-31 05:38:41 +00:00
|
|
|
implements IAddressResolver<SelectedResolvedName<T>>
|
|
|
|
|
{
|
|
|
|
|
private resolvers: IAddressResolver<T>[] = [];
|
|
|
|
|
|
|
|
|
|
addResolver(resolver: IAddressResolver<T>) {
|
2021-10-31 00:06:11 +00:00
|
|
|
this.resolvers.push(resolver);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async resolveAddress(
|
|
|
|
|
provider: BaseProvider,
|
|
|
|
|
address: string
|
2021-10-31 05:38:41 +00:00
|
|
|
): Promise<SelectedResolvedName<T> | undefined> {
|
2021-10-31 00:06:11 +00:00
|
|
|
for (const r of this.resolvers) {
|
2021-10-31 22:51:11 +00:00
|
|
|
const resolvedAddress = await r.resolveAddress(provider, address);
|
|
|
|
|
if (resolvedAddress !== undefined) {
|
|
|
|
|
return [r, resolvedAddress];
|
2021-10-31 00:06:11 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return undefined;
|
|
|
|
|
// TODO: fallback to address itself
|
|
|
|
|
// return address;
|
|
|
|
|
}
|
|
|
|
|
}
|