Skip to content

Commit

Permalink
fix: unit test
Browse files Browse the repository at this point in the history
  • Loading branch information
cryptodev-2s authored and Salah-eddineS committed Apr 11, 2023
1 parent f3ffdf0 commit 8b80cd4
Show file tree
Hide file tree
Showing 7 changed files with 156 additions and 101 deletions.
10 changes: 5 additions & 5 deletions packages/controller-utils/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,9 @@ export const NETWORK_ID_TO_ETHERS_NETWORK_NAME_MAP: { [key: string]: string } =
} as const;

export const CHAIN_ID_TO_NETWORK_ID_MAP: { [key: string]: string } = {
[NetworksChainId.mainnet]: ChainsId.mainnet,
[NetworksChainId.goerli]: ChainsId.goerli,
[NetworksChainId.sepolia]: ChainsId.sepolia,
[NetworksChainId.linea_testnet]: ChainsId.linea_testnet,
[NetworksChainId.localhost]: ChainsId.localhost,
[ChainsId.mainnet]: NetworksChainId.mainnet,
[ChainsId.goerli]: NetworksChainId.goerli,
[ChainsId.sepolia]: NetworksChainId.sepolia,
[ChainsId.linea_testnet]: NetworksChainId.linea_testnet,
[ChainsId.localhost]: NetworksChainId.localhost,
} as const;
2 changes: 2 additions & 0 deletions packages/ens-controller/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,15 @@
"@ethersproject/providers": "^5.7.0",
"@metamask/base-controller": "workspace:^",
"@metamask/controller-utils": "workspace:^",
"ethereum-ens-network-map": "^1.0.2",
"punycode": "^2.1.1"
},
"devDependencies": {
"@metamask/auto-changelog": "^3.1.0",
"@types/jest": "^26.0.22",
"deepmerge": "^4.2.2",
"jest": "^26.4.2",
"sinon": "^9.2.4",
"ts-jest": "^26.5.2",
"typedoc": "^0.22.15",
"typedoc-plugin-missing-exports": "^0.22.6",
Expand Down
67 changes: 0 additions & 67 deletions packages/ens-controller/src/Ens.ts

This file was deleted.

78 changes: 78 additions & 0 deletions packages/ens-controller/src/EnsController.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { ControllerMessenger } from '@metamask/base-controller';
import { toChecksumHexAddress } from '@metamask/controller-utils';
import sinon from 'sinon';
import { EnsController } from './EnsController';

const address1 = '0x32Be343B94f860124dC4fEe278FDCBD38C102D88';
Expand All @@ -26,6 +27,20 @@ function getMessenger() {
}

describe('EnsController', () => {
let currentChainId: string;
let getCurrentChainId: () => string;
let onNetworkDidChange: (callback: () => void) => void;

beforeEach(function () {
currentChainId = '0x5';
getCurrentChainId = () => currentChainId;
onNetworkDidChange = sinon.spy();
});

afterEach(function () {
sinon.restore();
});

it('should set default state', () => {
const messenger = getMessenger();
const controller = new EnsController({
Expand All @@ -37,6 +52,18 @@ describe('EnsController', () => {
});
});

it('should construct the controller given a provider and a network', async function () {
const messenger = getMessenger();
const ens = new EnsController({
messenger,
provider: sinon.fake(),
getCurrentChainId,
onNetworkDidChange,
});

expect(ens._ethProvider).toBeDefined();
});

it('should add a new ENS entry and return true', () => {
const messenger = getMessenger();
const controller = new EnsController({
Expand Down Expand Up @@ -352,4 +379,55 @@ describe('EnsController', () => {
ensResolutionsByAddress: {},
});
});

describe('#reverseResolveName', function () {
it('should through "Provider has not been initialized."', () => {
const messenger = getMessenger();
const address = '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5';
const ens = new EnsController({
messenger,
});

expect(() => ens.reverseResolveAddress(address)).toThrow(
'Provider has not been initialized.',
);
});

it('should only resolve an ENS name once', async () => {
const address = '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5';
const messenger = getMessenger();
const ens = new EnsController({
messenger,
provider: sinon.fake(),
getCurrentChainId,
onNetworkDidChange,
});
const reverse = sinon.stub().withArgs(address).returns('peaksignal.eth');
const lookup = sinon.stub().withArgs('peaksignal.eth').returns(address);
ens._reverse = reverse;
ens._lookup = lookup;

expect(await ens.reverseResolveAddress(address)).toStrictEqual(
'peaksignal.eth',
);
expect(await ens.reverseResolveAddress(address)).toStrictEqual(
'peaksignal.eth',
);
expect(lookup.calledOnce).toBe(true);
expect(reverse.calledOnce).toBe(true);
});

it('should fail if the name is registered to a different address than the reverse-resolved', async () => {
const address = '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5';
const messenger = getMessenger();
const ens = new EnsController({
messenger,
provider: sinon.fake(),
getCurrentChainId,
onNetworkDidChange,
});

expect(await ens.reverseResolveAddress(address)).toBeUndefined();
});
});
});
89 changes: 60 additions & 29 deletions packages/ens-controller/src/EnsController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,21 @@ import {
BaseControllerV2,
RestrictedControllerMessenger,
} from '@metamask/base-controller';
import {
Web3Provider,
ExternalProvider,
JsonRpcFetchFunc,
} from '@ethersproject/providers';
import {
normalizeEnsName,
isValidHexAddress,
toChecksumHexAddress,
NetworksChainId,
CHAIN_ID_TO_NETWORK_ID_MAP,
NETWORK_ID_TO_ETHERS_NETWORK_NAME_MAP,
} from '@metamask/controller-utils';
import { toASCII } from 'punycode/';
import { ExternalProvider, JsonRpcFetchFunc } from '@ethersproject/providers';
import { Ens } from './Ens';
import ensNetworkMap from 'ethereum-ens-network-map';

const name = 'EnsController';

Expand Down Expand Up @@ -74,30 +79,27 @@ export class EnsController extends BaseControllerV2<
EnsControllerState,
EnsControllerMessenger
> {
private _ens?: Ens;
_ethProvider?: Web3Provider;

/**
* Creates an EnsController instance.
*
* @param options - Constructor options.
* @param options.messenger - A reference to the messaging system.
* @param options.state - Initial state to set on this controller.
* @param options.ens - Ens instance.
* @param options.provider - Provider config.
* @param options.onNetworkDidChange - onNetworkDidChange.
* @param options.getCurrentChainId - getCurrentChainId .
*/
constructor({
messenger,
state = {},
ens,
provider,
onNetworkDidChange,
getCurrentChainId,
}: {
messenger: EnsControllerMessenger;
state?: Partial<EnsControllerState>;
ens?: Ens;
provider?: ExternalProvider | JsonRpcFetchFunc;
onNetworkDidChange?: (callback: () => void) => void;
getCurrentChainId?: () => string;
Expand All @@ -112,28 +114,37 @@ export class EnsController extends BaseControllerV2<
},
});

if (provider && onNetworkDidChange && getCurrentChainId) {
this._ens = ens;
if (!this._ens) {
const chainId = getCurrentChainId();
const network = CHAIN_ID_TO_NETWORK_ID_MAP[chainId] as NetworksChainId;
if (Ens.getNetworkEnsSupport(network)) {
this._ens = new Ens({
network,
provider,
});
}
if (provider && getCurrentChainId) {
const chainId = getCurrentChainId();
const network = CHAIN_ID_TO_NETWORK_ID_MAP[chainId] as NetworksChainId;
if (this._getNetworkEnsSupport(network)) {
const networkName = NETWORK_ID_TO_ETHERS_NETWORK_NAME_MAP[network];
const ensAddress = ensNetworkMap[network];
const ethProvider = new Web3Provider(provider, {
chainId: parseInt(network, 10),
name: networkName,
ensAddress,
});
this._ethProvider = ethProvider;
}
onNetworkDidChange(() => {
const chainId = getCurrentChainId();
const network = CHAIN_ID_TO_NETWORK_ID_MAP[chainId] as NetworksChainId;
if (Ens.getNetworkEnsSupport(network)) {
this._ens = new Ens({
network,
provider,

onNetworkDidChange?.(() => {
const currentChaindID = getCurrentChainId();
const currentNetwork = CHAIN_ID_TO_NETWORK_ID_MAP[
currentChaindID
] as NetworksChainId;
if (this._getNetworkEnsSupport(currentNetwork)) {
const networkName =
NETWORK_ID_TO_ETHERS_NETWORK_NAME_MAP[currentNetwork];
const ensAddress = ensNetworkMap[currentNetwork];
const ethProvider = new Web3Provider(provider, {
chainId: parseInt(currentNetwork, 10),
name: networkName,
ensAddress,
});
this._ethProvider = ethProvider;
} else {
delete this._ens;
delete this._ethProvider;
}
});
}
Expand Down Expand Up @@ -245,12 +256,33 @@ export class EnsController extends BaseControllerV2<
return true;
}

_getNetworkEnsSupport(network: NetworksChainId) {
return Boolean(ensNetworkMap[network]);
}

reverseResolveAddress(address: string) {
if (!this._ethProvider) {
throw new Error('Provider has not been initialized.');
}
return this._reverseResolveAddress(toChecksumHexAddress(address));
}

_lookup(ensName: string | Promise<string>): Promise<string | null> {
if (!this._ethProvider) {
throw new Error('Provider has not been initialized.');
}
return this._ethProvider.resolveName(ensName);
}

_reverse(address: string | Promise<string>): Promise<string | null> {
if (!this._ethProvider) {
throw new Error('Provider has not been initialized.');
}
return this._ethProvider.lookupAddress(address);
}

async _reverseResolveAddress(address: string) {
if (!this._ens) {
if (!this._ethProvider) {
return undefined;
}

Expand All @@ -260,7 +292,7 @@ export class EnsController extends BaseControllerV2<

let domain: string | null;
try {
domain = await this._ens.reverse(address);
domain = await this._reverse(address);
} catch (error) {
return undefined;
}
Expand All @@ -271,7 +303,7 @@ export class EnsController extends BaseControllerV2<

let registeredAddress: string | null;
try {
registeredAddress = await this._ens.lookup(domain);
registeredAddress = await this._lookup(domain);
} catch (error) {
return undefined;
}
Expand All @@ -286,7 +318,6 @@ export class EnsController extends BaseControllerV2<
) {
return undefined;
}

if (toChecksumHexAddress(registeredAddress) !== address) {
return undefined;
}
Expand Down
1 change: 1 addition & 0 deletions types/ethereum-ens-network-map.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
declare module 'ethereum-ens-network-map';
Loading

0 comments on commit 8b80cd4

Please sign in to comment.