Skip to content

Commit

Permalink
refacto: simplify the resolving process
Browse files Browse the repository at this point in the history
That was a mistake to consider `addr(bytes32)` as a special field to
resolve. Remove the code that managed this and rework the script of the
client.
  • Loading branch information
qd-qd committed Aug 24, 2022
1 parent 8e6063a commit 243d7ff
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 75 deletions.
114 changes: 59 additions & 55 deletions packages/client/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,65 +24,69 @@ const provider = new ethers.providers.JsonRpcProvider(options.provider, {

(async () => {
const [name] = program.args;
let [resolver, resolveName] = await Promise.all([
provider.getResolver(name),
provider.resolveName(name),
]);

console.group('\n-> L1 informations');
// Check if a resolver is set for this node on the L1
const resolver = await provider.getResolver(name);
console.log(`l1 offchain resolver address: ${resolver?.address}`);
if (!resolver?.address) return;

// Check if the subdomain has been registered on the L2
let resolveName: null | string;
try {
resolveName = await provider.resolveName(name);
} catch {
console.log("the subdomain doesn't exist on the layer2");
return;
}
console.log(`eth address: ${resolveName}`);
console.groupEnd();

if (resolver && resolveName) {
const [ethAddress, btcAddress, dogeAddress, contentHash] =
await Promise.all([
resolver.getAddress(), // ETH
resolver.getAddress(0), // BTC
resolver.getAddress(3), // DOGE
resolver.getContentHash(),
]);
// Fetch data from the resolver stored on the L2
const [ethAddress, btcAddress, dogeAddress, contentHash] = await Promise.all([
resolver.getAddress(), // ETH
resolver.getAddress(0), // BTC
resolver.getAddress(3), // DOGE
resolver.getContentHash(),
]);

// fetch text records
const [
avatar,
twitter,
github,
telegram,
email,
url,
description,
notice,
keywords,
company,
] = await Promise.all([
resolver.getText('avatar'),
resolver.getText('com.twitter'),
resolver.getText('com.github'),
resolver.getText('org.telegram'),
resolver.getText('email'),
resolver.getText('url'),
resolver.getText('description'),
resolver.getText('notice'),
resolver.getText('keywords'),
resolver.getText('company'),
]);
// fetch text records
const [
avatar,
twitter,
github,
telegram,
email,
url,
description,
notice,
keywords,
company,
] = await Promise.all([
resolver.getText('avatar'),
resolver.getText('com.twitter'),
resolver.getText('com.github'),
resolver.getText('org.telegram'),
resolver.getText('email'),
resolver.getText('url'),
resolver.getText('description'),
resolver.getText('notice'),
resolver.getText('keywords'),
resolver.getText('company'),
]);

console.group('\n-> Data fetched from the layer2 resolver');
console.log(`eth address: ${ethAddress}`);
console.log(`btc address: ${btcAddress}`);
console.log(`doge address: ${dogeAddress}`);
console.log(`content hash: ${contentHash}`);
console.log(`avatar: ${avatar}`);
console.log(`twitter: ${twitter}`);
console.log(`github: ${github}`);
console.log(`telegram: ${telegram}`);
console.log(`email: ${email}`);
console.log(`url: ${url}`);
console.log(`description: ${description}`);
console.log(`notice: ${notice}`);
console.log(`keywords: ${keywords}`);
console.log(`company: ${company}`);
console.groupEnd();
}
console.group('\n-> Data fetched from the layer2 resolver');
console.log(`eth address: ${ethAddress}`);
console.log(`btc address: ${btcAddress}`);
console.log(`doge address: ${dogeAddress}`);
console.log(`content hash: ${contentHash}`);
console.log(`avatar: ${avatar}`);
console.log(`twitter: ${twitter}`);
console.log(`github: ${github}`);
console.log(`telegram: ${telegram}`);
console.log(`email: ${email}`);
console.log(`url: ${url}`);
console.log(`description: ${description}`);
console.log(`notice: ${notice}`);
console.log(`keywords: ${keywords}`);
console.log(`company: ${company}`);
console.groupEnd();
})();
16 changes: 2 additions & 14 deletions packages/gateway/src/resolve.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import { ethers } from 'ethers';
import { abi as Resolver_abi } from '@ensdomains/ens-contracts/artifacts/contracts/resolvers/Resolver.sol/Resolver.json';

const IResolver = new ethers.utils.Interface(Resolver_abi);
const provider = new ethers.providers.JsonRpcProvider(
'http://localhost:8002/',
{
Expand All @@ -13,24 +11,14 @@ const provider = new ethers.providers.JsonRpcProvider(

const resolve = async (
name: string,
signature: string,
data: any
) => {
// manage the case when we try to resolve a name that doesn't have a resolver
// (by using the `registerWithConfig` method, a resolver would be automtically assigned
// during the registration process)
if (signature === 'addr(bytes32)') {
const addr = (await provider.resolveName(name)) ?? ethers.constants.AddressZero;
return IResolver.encodeFunctionResult(signature, [addr]);
}

// manage the case when informations from the resolver are requested
const resolver = await provider.getResolver(name);
if (resolver?.address) {
if (resolver?.address)
return provider.call({ to: resolver?.address, data });
}

// complex data are requested but the name doesn't have a resolver set
// data are requested but the name doesn't have a resolver set
throw new Error('No resolver attached to this name');
};

Expand Down
7 changes: 1 addition & 6 deletions packages/gateway/src/server.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import { Server } from '@chainlink/ccip-read-server';
import { abi as Resolver_abi } from '@ensdomains/ens-contracts/artifacts/contracts/resolvers/Resolver.sol/Resolver.json';
import { ethers } from 'ethers';
import { hexConcat, Result } from 'ethers/lib/utils';
import { abi as IResolverService_abi } from './utils/IResolverService.json';
import resolve from './resolve';
import decodeDnsName from './utils/decodeDnsName';

const IResolver = new ethers.utils.Interface(Resolver_abi);
const TTL = parseInt(process.env.TTL || "") || 300;

export function makeServer(signer: ethers.utils.SigningKey) {
Expand All @@ -18,11 +16,8 @@ export function makeServer(signer: ethers.utils.SigningKey) {
// make the name human readable
const name = decodeDnsName(Buffer.from(encodedName.slice(2), 'hex'));

// get the signature of the transaction
const tx = IResolver.parseTransaction({ data });

// resolve the requested data
const result = await resolve(name, tx.signature, data);
const result = await resolve(name, data);

// set the validity of the data
const validUntil = Math.floor(Date.now() / 1000 + TTL);
Expand Down

0 comments on commit 243d7ff

Please sign in to comment.