@ew-did-registry/did-resolver-interface
Version:
The package resolve CRUD operations on DID Documents
167 lines (151 loc) • 4.42 kB
text/typescript
/* eslint-disable no-shadow */
import { utils, BigNumber, providers, ContractInterface } from 'ethers';
import { Methods } from '@ew-did-registry/did';
/**
* Specifies currently supported provider types. New types can be added in the future.
*/
export enum ProviderTypes {
HTTP,
IPC,
}
/**
* Specifies Provider to be used to communicate with blockchain.
* The uri, path, and method are the parameters found in the ethers library.
* Hence, 'ethers' documentation is a good point to check the available options,
* if one wants to extend the library.
*/
export interface ProviderSettings {
type: ProviderTypes;
uriOrInfo?: string | utils.ConnectionInfo;
path?: string;
network?: providers.Networkish;
}
/**
* Resolver requires provider, as well as application binary interface and
* address of the smart contract representing DID Registry
*/
export interface RegistrySettings {
address: string;
abi?: ContractInterface;
method?: Methods;
}
export interface IServiceEndpoint {
id: string;
type: string;
serviceEndpoint: string;
description?: string;
validity: BigNumber;
block: number;
hash?: string; // hash of the content located at service endpoint
[key: string]: string | BigNumber | number | undefined | { nodes: string[] };
}
export interface IPublicKey {
id: string;
type: string;
controller: string;
ethereumAddress?: string;
publicKeyBase64?: string;
publicKeyBase58?: string;
publicKeyHex?: string;
publicKeyPem?: string;
publicKeyJwk?: string;
publicKeyMultibase?: string;
validity: BigNumber;
block: number;
[key: string]: string | number | BigNumber | undefined;
}
export interface IAuthentication {
type: string;
publicKey: string;
validity: BigNumber;
block?: number;
[key: string]: string | BigNumber | number | undefined;
}
export interface ILinkedDataProof {
type: string;
created: string;
creator: string;
signatureValue: string;
}
export enum DidEventNames {
AttributeChanged = 'DIDAttributeChanged',
DelegateChanged = 'DIDDelegateChanged',
}
/**
* This interface represents the structure of event emitted by ERC1056 compliant smart contract.
*/
export interface ISmartContractEvent {
name: DidEventNames;
signature: string;
topic: string;
value?: string;
}
export interface AttributeChangedEvent extends ISmartContractEvent {
name: DidEventNames.AttributeChanged;
values: {
identity: string;
name: string;
value: string;
validTo: BigNumber;
previousChange: BigNumber;
};
}
export interface DelegateChangedEvent extends ISmartContractEvent {
name: DidEventNames.DelegateChanged;
values: {
identity: string;
delegateType: string;
delegate: string;
validTo: BigNumber;
previousChange: BigNumber;
};
}
/**
* This interface is used to store the parse data from events.
* The log data will be used for caching and further analysed to construct the did document,
* as new data arrives.
* The data in the did document will exclude certain variables, such as
* 'lastChangedBlock', 'created', 'updated', 'proof'
*/
export interface IDIDLogData {
owner: string;
topBlock: BigNumber;
publicKey: { [key: string]: IPublicKey };
authentication: { [key: string]: IAuthentication };
delegates?: string[];
service: { [key: string]: IServiceEndpoint };
created?: string;
updated?: string;
proof?: ILinkedDataProof;
attributes: Map<string, { [key: string]: string | number | unknown }>;
}
/**
* Our assumption that delegates can be of two types, according to the standard. However,
* Other types can be added in the future, if required.
*/
export enum DelegateTypes {
authentication = 'sigAuth',
verification = 'veriKey',
}
export type DocumentSelector = Partial<{
publicKey: Partial<IPublicKey>;
service: Partial<IServiceEndpoint>;
authentication: Partial<IAuthentication>;
}>;
/**
* The interface of DID Document is compliant with W3C specification.
* https://w3c.github.io/did-core/
* The link above will be the best point of reference for the interface below, including
* IServiceEndpoint, IPublicKey, IAuthentication, ILinkedDataProof
*/
export interface IDIDDocument {
'@context': string;
id: string;
publicKey: IPublicKey[];
authentication: Array<IAuthentication | string>;
delegates?: string[];
service: IServiceEndpoint[];
created?: string;
updated?: string;
proof?: ILinkedDataProof;
}