@ensnode/datasources
Version:
Catalog of ENSNode-related datasources including chain, contract addresses, start blocks, and event filters.
1,045 lines (1,043 loc) • 3.48 MB
TypeScript
import * as viem_experimental from 'viem/experimental';
import * as viem_chains from 'viem/chains';
import * as viem from 'viem';
import { Chain, Abi, Address } from 'viem';
/**
* ENSNamespaceIds encodes the set of identifiers for well-known ENS namespaces.
*
* Each ENS namespace is a single, unified set of ENS names with a distinct onchain root
* Registry (the ensroot Datasource) and the capability of spanning from that root Registry across
* other `Datasource`s that may be distributed across multiple chains and offchain resources.
*
* For example, as of 9-Feb-2025 the canonical ENS namespace on mainnet includes:
* - A root Registry on mainnet.
* - An onchain Registrar for direct subnames of 'eth' on mainnet.
* - An onchain Registry and Registrar for direct subnames of 'base.eth' on Base.
* - An onchain Registry and Registrar subregistry for direct subnames of 'linea.eth' on Linea.
* - An offchain subregistry for subnames of '.cb.id'.
* - An offchain subregistry for subnames of '.uni.eth'.
* - Etc..
*
* Each ENS namespace is logically independent of & isolated from the others, and not exclusively
* correlated with a specific L1 chain. For example, the Sepolia and Holesky testnet ENS namepaces
* are independent of the canonical ENS namespace on mainnet, and there could be an additional
* deployment of the ENS protocol to mainnet, configured with different Datasources, resulting in a
* logically isolated set of ENS names.
*
* 'ens-test-env' represents an ENS namespace running on a local Anvil chain for testing
* protocol changes, running deterministic test suites, and local development.
* https://github.com/ensdomains/ens-test-env
*/
declare const ENSNamespaceIds: {
readonly Mainnet: "mainnet";
readonly Sepolia: "sepolia";
readonly Holesky: "holesky";
readonly EnsTestEnv: "ens-test-env";
};
/**
* ENSNamespaceId is the derived string union of possible ENS namespace identifiers.
*/
type ENSNamespaceId = (typeof ENSNamespaceIds)[keyof typeof ENSNamespaceIds];
/**
* A Datasource describes a set of contracts on a given chain that interact with the ENS protocol.
*/
interface Datasource {
chain: Chain;
contracts: Record<string, ContractConfig>;
}
/**
* DatasourceNames encodes a unique id for each known Datasource.
*/
declare const DatasourceNames: {
readonly ENSRoot: "ensroot";
readonly Basenames: "basenames";
readonly Lineanames: "lineanames";
readonly ThreeDNSOptimism: "threedns-optimism";
readonly ThreeDNSBase: "threedns-base";
};
type DatasourceName = (typeof DatasourceNames)[keyof typeof DatasourceNames];
/**
* EventFilter specifies a given event's name and arguments to filter that event by.
* This type is intentionally a subset of Ponder's `ContractConfig['filter']`.
*/
interface EventFilter {
event: string;
args: Record<string, unknown>;
}
/**
* Defines the abi, address, filter, and startBlock of a contract relevant to a Datasource.
* A contract is located onchain either by a static `address` or the event signatures (`filter`)
* one should filter the chain for. This type is intentionally a subset of Ponder's ContractConfig.
*
* @param abi - the ABI of the contract
* @param address - (optional) address of the contract
* @param filter - (optional) array of event signatures to filter the log by
* @param startBlock - block number the contract was deployed in
*/
type ContractConfig = {
readonly abi: Abi;
readonly address: Address;
readonly filter?: never;
readonly startBlock: number;
} | {
readonly abi: Abi;
readonly address?: never;
readonly filter: EventFilter[];
readonly startBlock: number;
};
/**
* ENSNamespace encodes a set of known Datasources associated with the same ENS namespace.
*
* The ENSRoot Datasource is required (this formally defines an ENS namespace). All other Datasources
* within the ENSNamespace are optional.
*/
type ENSNamespace = {
[DatasourceNames.ENSRoot]: Datasource;
} & Partial<Record<Exclude<DatasourceName, "ensroot">, Datasource>>;
declare const ENSNamespacesById: {
readonly mainnet: {
ensroot: {
chain: {
blockExplorers: {
readonly default: {
readonly name: "Etherscan";
readonly url: "https://etherscan.io";
readonly apiUrl: "https://api.etherscan.io/api";
};
};
contracts: {
readonly ensRegistry: {
readonly address: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e";
};
readonly ensUniversalResolver: {
readonly address: "0xce01f8eee7E479C928F8919abD53E553a36CeF67";
readonly blockCreated: 19258213;
};
readonly multicall3: {
readonly address: "0xca11bde05977b3631167028862be2a173976ca11";
readonly blockCreated: 14353601;
};
};
id: 1;
name: "Ethereum";
nativeCurrency: {
readonly name: "Ether";
readonly symbol: "ETH";
readonly decimals: 18;
};
rpcUrls: {
readonly default: {
readonly http: readonly ["https://eth.merkle.io"];
};
};
sourceId?: number | undefined;
testnet?: boolean | undefined;
custom?: Record<string, unknown> | undefined;
fees?: viem.ChainFees<undefined> | undefined;
formatters?: undefined;
serializers?: viem.ChainSerializers<undefined, viem.TransactionSerializable> | undefined;
};
contracts: {
RegistryOld: {
abi: readonly [{
readonly inputs: readonly [{
readonly internalType: "contract ENS";
readonly name: "_old";
readonly type: "address";
}];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "constructor";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}, {
readonly indexed: true;
readonly internalType: "address";
readonly name: "operator";
readonly type: "address";
}, {
readonly indexed: false;
readonly internalType: "bool";
readonly name: "approved";
readonly type: "bool";
}];
readonly name: "ApprovalForAll";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "label";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}];
readonly name: "NewOwner";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "address";
readonly name: "resolver";
readonly type: "address";
}];
readonly name: "NewResolver";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "uint64";
readonly name: "ttl";
readonly type: "uint64";
}];
readonly name: "NewTTL";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}];
readonly name: "Transfer";
readonly type: "event";
}, {
readonly constant: true;
readonly inputs: readonly [{
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}, {
readonly internalType: "address";
readonly name: "operator";
readonly type: "address";
}];
readonly name: "isApprovedForAll";
readonly outputs: readonly [{
readonly internalType: "bool";
readonly name: "";
readonly type: "bool";
}];
readonly payable: false;
readonly stateMutability: "view";
readonly type: "function";
}, {
readonly constant: true;
readonly inputs: readonly [];
readonly name: "old";
readonly outputs: readonly [{
readonly internalType: "contract ENS";
readonly name: "";
readonly type: "address";
}];
readonly payable: false;
readonly stateMutability: "view";
readonly type: "function";
}, {
readonly constant: true;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}];
readonly name: "owner";
readonly outputs: readonly [{
readonly internalType: "address";
readonly name: "";
readonly type: "address";
}];
readonly payable: false;
readonly stateMutability: "view";
readonly type: "function";
}, {
readonly constant: true;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}];
readonly name: "recordExists";
readonly outputs: readonly [{
readonly internalType: "bool";
readonly name: "";
readonly type: "bool";
}];
readonly payable: false;
readonly stateMutability: "view";
readonly type: "function";
}, {
readonly constant: true;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}];
readonly name: "resolver";
readonly outputs: readonly [{
readonly internalType: "address";
readonly name: "";
readonly type: "address";
}];
readonly payable: false;
readonly stateMutability: "view";
readonly type: "function";
}, {
readonly constant: false;
readonly inputs: readonly [{
readonly internalType: "address";
readonly name: "operator";
readonly type: "address";
}, {
readonly internalType: "bool";
readonly name: "approved";
readonly type: "bool";
}];
readonly name: "setApprovalForAll";
readonly outputs: readonly [];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "function";
}, {
readonly constant: false;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}];
readonly name: "setOwner";
readonly outputs: readonly [];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "function";
}, {
readonly constant: false;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}, {
readonly internalType: "address";
readonly name: "resolver";
readonly type: "address";
}, {
readonly internalType: "uint64";
readonly name: "ttl";
readonly type: "uint64";
}];
readonly name: "setRecord";
readonly outputs: readonly [];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "function";
}, {
readonly constant: false;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly internalType: "address";
readonly name: "resolver";
readonly type: "address";
}];
readonly name: "setResolver";
readonly outputs: readonly [];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "function";
}, {
readonly constant: false;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly internalType: "bytes32";
readonly name: "label";
readonly type: "bytes32";
}, {
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}];
readonly name: "setSubnodeOwner";
readonly outputs: readonly [{
readonly internalType: "bytes32";
readonly name: "";
readonly type: "bytes32";
}];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "function";
}, {
readonly constant: false;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly internalType: "bytes32";
readonly name: "label";
readonly type: "bytes32";
}, {
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}, {
readonly internalType: "address";
readonly name: "resolver";
readonly type: "address";
}, {
readonly internalType: "uint64";
readonly name: "ttl";
readonly type: "uint64";
}];
readonly name: "setSubnodeRecord";
readonly outputs: readonly [];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "function";
}, {
readonly constant: false;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly internalType: "uint64";
readonly name: "ttl";
readonly type: "uint64";
}];
readonly name: "setTTL";
readonly outputs: readonly [];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "function";
}, {
readonly constant: true;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}];
readonly name: "ttl";
readonly outputs: readonly [{
readonly internalType: "uint64";
readonly name: "";
readonly type: "uint64";
}];
readonly payable: false;
readonly stateMutability: "view";
readonly type: "function";
}];
address: "0x314159265dd8dbb310642f98f50c066173c1259b";
startBlock: number;
};
Registry: {
abi: readonly [{
readonly inputs: readonly [{
readonly internalType: "contract ENS";
readonly name: "_old";
readonly type: "address";
}];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "constructor";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}, {
readonly indexed: true;
readonly internalType: "address";
readonly name: "operator";
readonly type: "address";
}, {
readonly indexed: false;
readonly internalType: "bool";
readonly name: "approved";
readonly type: "bool";
}];
readonly name: "ApprovalForAll";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "label";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}];
readonly name: "NewOwner";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "address";
readonly name: "resolver";
readonly type: "address";
}];
readonly name: "NewResolver";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "uint64";
readonly name: "ttl";
readonly type: "uint64";
}];
readonly name: "NewTTL";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}];
readonly name: "Transfer";
readonly type: "event";
}, {
readonly constant: true;
readonly inputs: readonly [{
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}, {
readonly internalType: "address";
readonly name: "operator";
readonly type: "address";
}];
readonly name: "isApprovedForAll";
readonly outputs: readonly [{
readonly internalType: "bool";
readonly name: "";
readonly type: "bool";
}];
readonly payable: false;
readonly stateMutability: "view";
readonly type: "function";
}, {
readonly constant: true;
readonly inputs: readonly [];
readonly name: "old";
readonly outputs: readonly [{
readonly internalType: "contract ENS";
readonly name: "";
readonly type: "address";
}];
readonly payable: false;
readonly stateMutability: "view";
readonly type: "function";
}, {
readonly constant: true;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}];
readonly name: "owner";
readonly outputs: readonly [{
readonly internalType: "address";
readonly name: "";
readonly type: "address";
}];
readonly payable: false;
readonly stateMutability: "view";
readonly type: "function";
}, {
readonly constant: true;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}];
readonly name: "recordExists";
readonly outputs: readonly [{
readonly internalType: "bool";
readonly name: "";
readonly type: "bool";
}];
readonly payable: false;
readonly stateMutability: "view";
readonly type: "function";
}, {
readonly constant: true;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}];
readonly name: "resolver";
readonly outputs: readonly [{
readonly internalType: "address";
readonly name: "";
readonly type: "address";
}];
readonly payable: false;
readonly stateMutability: "view";
readonly type: "function";
}, {
readonly constant: false;
readonly inputs: readonly [{
readonly internalType: "address";
readonly name: "operator";
readonly type: "address";
}, {
readonly internalType: "bool";
readonly name: "approved";
readonly type: "bool";
}];
readonly name: "setApprovalForAll";
readonly outputs: readonly [];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "function";
}, {
readonly constant: false;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}];
readonly name: "setOwner";
readonly outputs: readonly [];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "function";
}, {
readonly constant: false;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}, {
readonly internalType: "address";
readonly name: "resolver";
readonly type: "address";
}, {
readonly internalType: "uint64";
readonly name: "ttl";
readonly type: "uint64";
}];
readonly name: "setRecord";
readonly outputs: readonly [];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "function";
}, {
readonly constant: false;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly internalType: "address";
readonly name: "resolver";
readonly type: "address";
}];
readonly name: "setResolver";
readonly outputs: readonly [];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "function";
}, {
readonly constant: false;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly internalType: "bytes32";
readonly name: "label";
readonly type: "bytes32";
}, {
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}];
readonly name: "setSubnodeOwner";
readonly outputs: readonly [{
readonly internalType: "bytes32";
readonly name: "";
readonly type: "bytes32";
}];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "function";
}, {
readonly constant: false;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly internalType: "bytes32";
readonly name: "label";
readonly type: "bytes32";
}, {
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}, {
readonly internalType: "address";
readonly name: "resolver";
readonly type: "address";
}, {
readonly internalType: "uint64";
readonly name: "ttl";
readonly type: "uint64";
}];
readonly name: "setSubnodeRecord";
readonly outputs: readonly [];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "function";
}, {
readonly constant: false;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly internalType: "uint64";
readonly name: "ttl";
readonly type: "uint64";
}];
readonly name: "setTTL";
readonly outputs: readonly [];
readonly payable: false;
readonly stateMutability: "nonpayable";
readonly type: "function";
}, {
readonly constant: true;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}];
readonly name: "ttl";
readonly outputs: readonly [{
readonly internalType: "uint64";
readonly name: "";
readonly type: "uint64";
}];
readonly payable: false;
readonly stateMutability: "view";
readonly type: "function";
}];
address: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e";
startBlock: number;
};
Resolver: {
startBlock: number;
abi: readonly [{
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: true;
readonly internalType: "uint256";
readonly name: "contentType";
readonly type: "uint256";
}];
readonly name: "ABIChanged";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "address";
readonly name: "a";
readonly type: "address";
}];
readonly name: "AddrChanged";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "uint256";
readonly name: "coinType";
readonly type: "uint256";
}, {
readonly indexed: false;
readonly internalType: "bytes";
readonly name: "newAddress";
readonly type: "bytes";
}];
readonly name: "AddressChanged";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: true;
readonly internalType: "address";
readonly name: "owner";
readonly type: "address";
}, {
readonly indexed: true;
readonly internalType: "address";
readonly name: "target";
readonly type: "address";
}, {
readonly indexed: false;
readonly internalType: "bool";
readonly name: "isAuthorised";
readonly type: "bool";
}];
readonly name: "AuthorisationChanged";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "bytes";
readonly name: "hash";
readonly type: "bytes";
}];
readonly name: "ContenthashChanged";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "bytes";
readonly name: "name";
readonly type: "bytes";
}, {
readonly indexed: false;
readonly internalType: "uint16";
readonly name: "resource";
readonly type: "uint16";
}, {
readonly indexed: false;
readonly internalType: "bytes";
readonly name: "record";
readonly type: "bytes";
}];
readonly name: "DNSRecordChanged";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "bytes";
readonly name: "name";
readonly type: "bytes";
}, {
readonly indexed: false;
readonly internalType: "uint16";
readonly name: "resource";
readonly type: "uint16";
}];
readonly name: "DNSRecordDeleted";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}];
readonly name: "DNSZoneCleared";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: true;
readonly internalType: "bytes4";
readonly name: "interfaceID";
readonly type: "bytes4";
}, {
readonly indexed: false;
readonly internalType: "address";
readonly name: "implementer";
readonly type: "address";
}];
readonly name: "InterfaceChanged";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "string";
readonly name: "name";
readonly type: "string";
}];
readonly name: "NameChanged";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "bytes32";
readonly name: "x";
readonly type: "bytes32";
}, {
readonly indexed: false;
readonly internalType: "bytes32";
readonly name: "y";
readonly type: "bytes32";
}];
readonly name: "PubkeyChanged";
readonly type: "event";
}, {
readonly anonymous: false;
readonly inputs: readonly [{
readonly indexed: true;
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly indexed: true;
readonly internalType: "string";
readonly name: "indexedKey";
readonly type: "string";
}, {
readonly indexed: false;
readonly internalType: "string";
readonly name: "key";
readonly type: "string";
}];
readonly name: "TextChanged";
readonly type: "event";
}, {
readonly constant: true;
readonly inputs: readonly [{
readonly internalType: "bytes32";
readonly name: "node";
readonly type: "bytes32";
}, {
readonly internalType: "uint256";
readonly name: "contentTypes";
readonly type: "uint256";
}]