@sphereon/ssi-sdk.ebsi-support
Version:
397 lines • 13.9 kB
TypeScript
import { W3CVerifiableCredential } from '@sphereon/ssi-types';
import { IAgentContext, IIdentifier, IKeyManager, MinimalImportableKey, TKeyType } from '@veramo/core';
import { IService } from '@veramo/core';
import { DIDDocument } from 'did-resolver';
import { AccessListish, BigNumberish, BytesLike } from 'ethers';
import { ApiOpts, EbsiEnvironment } from '../types/IEbsiSupport';
import { CredentialRole } from '@sphereon/ssi-sdk.data-store';
export type IContext = IAgentContext<IKeyManager>;
/**
* The type of the DID to be created
* @readonly
* @enum {string}
*/
export type EbsiDIDType = 'NATURAL_PERSON' | 'LEGAL_ENTITY';
/**
* The DID method to use
* @readonly
* @enum {string}
*/
export type EbsiDIDPrefix = 'did:ebsi:' | 'did:key:';
/**
* @typedef EbsiDidSpecInfo
* @type {object}
* @property {EbsiDIDType} type - The type of the DID
* @property {EbsiDIDPrefix} method - The method of the DID
* @property {number} version - The version of the specs
* @property {number} didLength - The length of the DID
* @property {number} privateKeyLength The private key length
*/
export interface EbsiDidSpecInfo {
type: EbsiDIDType;
method: EbsiDIDPrefix;
version?: number;
didLength?: number;
privateKeyLength?: number;
}
export declare const EBSI_DID_SPEC_INFOS: Record<string, EbsiDidSpecInfo>;
/**
* A minimal importable key with restricted types to choose from and purposes of the public key
* @typedef IKeyOpts
* @extends MinimalImportableKey
* @property {EbsiKeyType} type
* @property {EbsiPublicKeyPurpose[]} purposes
*/
export interface IKeyOpts extends WithRequiredProperty<Partial<MinimalImportableKey>, 'privateKeyHex'> {
type?: EbsiKeyType;
purposes?: EbsiPublicKeyPurpose[];
}
type WithRequiredProperty<Type, Key extends keyof Type> = Type & {
[Property in Key]-?: Type[Property];
};
export type RpcMethodArgs = {
params: RPCParams[];
rpcId: number;
accessToken: string;
rpcMethod: EbsiRpcMethod;
apiOpts?: ApiOpts;
doNotThrowErrors?: boolean;
};
export type EbsiCreateIdentifierOpts = {
methodSpecificId?: string;
rpcId?: number;
secp256k1Key?: IKeyOpts;
secp256r1Key?: IKeyOpts;
did?: string;
keys?: IKeyOpts[];
executeLedgerOperation?: boolean;
baseDocument?: string;
notBefore?: number;
notAfter?: number;
accessTokenOpts: EbsiAccessTokenOpts;
services?: IService[];
};
/**
* @typedef ICreateIdentifierArgs
* @type {object}
* @property {string} kms - The kms to use
* @property {string} alias - The alias of the DID
* @property {EbsiDidSpecInfo} type
* @property {string} options.methodSpecificId - method specific id for import
* @property {IKeyOpts} secp256k1Key - The options to create the key
* @property {IKeyOpts} secp256r1Key - The options to create the key
*/
export interface ICreateIdentifierArgs {
kms?: string;
alias?: string;
type?: EbsiDidSpecInfo;
options: EbsiCreateIdentifierOpts;
}
/**
* The Ebsi allowed key types - Secp256k1 and Secp256r1
* @readonly
* @enum {string}
*/
export type EbsiKeyType = Extract<TKeyType, 'Secp256k1' | 'Secp256r1'>;
/**
* The purpose of the public keys
* @readonly
* @enum {string}
*/
export declare enum EbsiPublicKeyPurpose {
Authentication = "authentication",
AssertionMethod = "assertionMethod",
CapabilityInvocation = "capabilityInvocation"
}
/**
* @typedef InsertDidDocumentParams
* @type {object}
* @property {string} from - Ethereum address of the signer
* @property {string} did - DID to insert. It must be for a legal entity (DID v1)
* @property {string} BASE_CONTEXT_DOC - JSON string containing the @context of the DID document
* @property {string} vMethodId - Thumbprint of the public key
* @property {string} publicKey - Public key for secp256k1 in uncompressed format prefixed with "0x04"
* @property {boolean} isSecp256k1 - It must be true
* @property {number} notBefore - Capability invocation is valid from this time
* @property {number} notAfter - Expiration of the capability invocation
*/
export type InsertDidDocumentParams = {
from: string;
did: string;
baseDocument: string;
vMethodId: string;
publicKey: string;
isSecp256k1: boolean;
notBefore: number;
notAfter: number;
};
/**
* @typedef UpdateBaseDocumentParams
* @type {object}
* @property {string} from - Ethereum address of the signer
* @property {string} did - Existing DID
* @property {string} BASE_CONTEXT_DOC - JSON string containing the @context of the DID document
*/
export type UpdateBaseDocumentParams = Pick<InsertDidDocumentParams, 'from' | 'did' | 'baseDocument'>;
/**
* @typedef UpdateIdentifierParams
* @type {object}
* @property {string} did - A DID
* @property {Partial<DIDDocument>} document - The partial DID document
* @property {{ [p: string]: any }} [options] - Any additional options
*/
export type UpdateIdentifierParams = {
did: string;
document: Partial<DIDDocument>;
options?: {
[p: string]: any;
};
};
export type AddServiceParams = {
from: string;
did: string;
service: IService;
};
/**
* @typedef AddVerificationMethodParams
* @type {object}
* @property {string} from - Ethereum address of the signer
* @property {string} did - Existing DID
* @property {string} vMethodId - New verification method id
* @property {boolean} isSecp256k1 - Boolean defining if the public key is for secp256k1 curve or not
* @property {string} publicKey - Public key as hex string. For an ES256K key, it must be in uncompressed format
* prefixed with "0x04". For other algorithms, it must be the JWK transformed to string and then to hex format.
*/
export type AddVerificationMethodParams = Pick<InsertDidDocumentParams, 'from' | 'did' | 'vMethodId' | 'isSecp256k1' | 'publicKey'>;
/**
* @typedef AddVerificationMethodRelationshipParams
* @type {object}
* @property {string} from - Ethereum address of the signer
* @property {string} did - Existing DID
* @property {string} name - Name of the verification relationship
* @property {string} vMethodId - Reference to the verification method
* @property {number} notBefore - Verification relationship is valid from this time
* @property {number} notAfter - Expiration of the verification relationship
*/
export type AddVerificationMethodRelationshipParams = Pick<InsertDidDocumentParams, 'from' | 'did' | 'vMethodId' | 'notBefore' | 'notAfter'> & {
name: string;
};
/**
* @typedef UnsignedTransaction
* @type {object}
* @property {string} from - The sending address.
* @property {string} to - The receiving address (if EOA, the transaction will transfer value. If a smart contract
* account, the transaction will use contract code).
* @property {string} data - Can contain code or a message to the recipient.
* @property {string} nonce - A number used to track ordering of transactions and prevent replay attacks
* @property {string} chainId - The Ethereum Network ID (ex: 1 - Ethereum Mainnet).
* @property {string} gasLimit - The maximum amount of gas units that can be used.
* @property {string} gasPrice - Gas price provided by the sender in Wei.
* @property {string} value - The amount of ETH to be sent from the sending address (denominated in Wei)
*/
export type UnsignedTransaction = {
to?: string;
nonce?: number;
gasLimit?: BigNumberish;
gasPrice?: BigNumberish;
data?: BytesLike;
value?: BigNumberish;
chainId?: number;
type?: number | null;
accessList?: AccessListish;
maxPriorityFeePerGas?: BigNumberish;
maxFeePerGas?: BigNumberish;
};
/**
* @typedef SendSignedTransactionParams
* @type {object}
* @property {string} protocol - Example: eth
* @property {UnsignedTransaction} unsignedTransaction - The unsigned transaction
* @property {string} r - ECDSA signature r
* @property {string} s - ECDSA signature s
* @property {string} v - ECDSA recovery id
* @property {string} signedRawTransaction - The signed raw transaction
*/
export type SendSignedTransactionParams = {
protocol: string;
unsignedTransaction: UnsignedTransaction;
r: string;
s: string;
v: string;
signedRawTransaction: string;
};
/**
* @typedef RpcOkResponse
* @type {object}
* @property {string} JSON_RPC_VERSION - Must be exactly "2.0"
* @property {number} id - Same identifier established by the client in the call
* @property {object} result - Result of the transaction
*/
export type RpcOkResponse = {
jsonrpc: string;
id: number;
result: any;
};
export type RpcErrorResponse = {
jsonrpc: string;
id: number;
error: {
code: number;
message: string;
};
};
/**
* @typedef ResponseNot200
* @type {object}
* @property {URL | string} type - An absolute URI that identifies the problem type. When dereferenced,
* it SHOULD provide human-readable documentation for the problem type.
* @property {string} title - A short summary of the problem type.
* @property {number} status - The HTTP status code generated by the origin server for this occurrence of the problem.
* @property {string} detail - A human-readable explanation specific to this occurrence of the problem.
* @property {URL | string} instance An absolute URI that identifies the specific occurrence of the problem.
* It may or may not yield further information if dereferenced.
*/
export type ResponseNot200 = {
type: URL | string;
id?: number;
title: string;
error?: {
code: number;
message: string;
};
status: number;
detail: string;
instance: URL | string;
};
/**
* @typedef GetDidDocumentParams
* @type {object}
* @property {string} did
* @property {string} validAt
*/
export type GetDidDocumentParams = {
did: string;
validAt?: string;
};
/**
* @typedef GetDidDocumentsParams
* @type {object}
* @property {string} offset Originally page[after] Cursor that points to the end of the page of data that has been returned.
* @property {number} size Originally page[size] Defines the maximum number of objects that may be returned.
* @property {string} controller Filter by controller DID.
*/
export type GetDidDocumentsParams = {
offset?: string;
size?: number;
controller?: string;
};
/**
* Result of listing dids
* @typedef {Item}
* @type {object}
* @property {string} did - The DID
* @property {string} href - The referrer of the DID
*/
export type Item = {
did: string;
href: string;
};
/**
* The links related to pagination
* @typedef Links
* @type {object}
* @property {string} first - The link to the first page
* @property {string} prev - The link ot the previous page
* @property {string} next - The link to the next page
* @property {string} last - The link to the last page
*/
export type Links = {
first: string;
prev: string;
next: string;
last: string;
};
/**
* @typedef GetDidDocumentResponse
* @type {object}
* @property {string} self - Absolute path to the collection (consult)
* @property {Item[]} items - List of DIDs and their referrers
* @property {number} total - Total number of items across all pages.
* @property {pageSize} number - Maximum number of items per page. For the last page, its value should be independent of the number of actually returned items.
* @property {Links} links - The links related to pagination
*/
export type GetDidDocumentsResponse = {
self: string;
items: Item[];
total: number;
pageSize: number;
links: Links;
};
export type EbsiAccessTokenOpts = {
attestationToOnboard?: W3CVerifiableCredential;
attestationToOnboardCredentialRole: CredentialRole;
jwksUri?: string;
redirectUri: string;
credentialIssuer: string;
clientId: string;
environment: EbsiEnvironment;
};
/**
* @typedef CreateEbsiDidParams
* @type {object}
* @property {Omit<IIdentifier, 'provider'>} identifier An identifier without the provider
* @property {ManagedKeyInfo} secp256k1ManagedKeyInfo A Secp256k1 managed key
* @property {ManagedKeyInfo} secp256r1ManagedKeyInfo A Secp256r1 managed key
* @property {number} id A client created id
* @property {string} from The wallet eth like address
* @property {string} [baseDocument] The base DID document
* @property {number} notBefore Date of issuance of the identifier
* @property {number} notAfter Date of expiration of the identifier
* @property {ApiOpts} [apiOpts] The EBSI API options
*/
export type CreateEbsiDidParams = {
identifier: IIdentifier;
rpcId?: number;
notBefore?: number;
notAfter?: number;
baseDocument?: string;
accessTokenOpts: EbsiAccessTokenOpts;
};
export interface CreateEbsiDidOnLedgerResult {
identifier: IIdentifier;
addVerificationMethod: EbsiRPCResponse;
insertDidDoc: EbsiRPCResponse;
addAssertionMethodRelationship: EbsiRPCResponse;
addAuthenticationRelationship: EbsiRPCResponse;
}
/**
* @constant JSON_RPC_VERSION
*/
export declare const JSON_RPC_VERSION = "2.0";
/**
* @constant BASE_CONTEXT_DOC
*/
export declare const BASE_CONTEXT_DOC: string;
export interface EbsiDidRegistryAPIEndpoints {
mutate: string;
query: string;
}
/**
* The EBSI RPC operations
* @readonly
* @enum {string}
*/
export declare enum EbsiRpcMethod {
INSERT_DID_DOCUMENT = "insertDidDocument",
UPDATE_DID_DOCUMENT = "updateBaseDocument",
ADD_VERIFICATION_METHOD = "addVerificationMethod",
ADD_VERIFICATION_RELATIONSHIP = "addVerificationRelationship",
ADD_SERVICE = "addService",
SEND_SIGNED_TRANSACTION = "sendSignedTransaction"
}
export type RPCParams = InsertDidDocumentParams | UpdateBaseDocumentParams | AddVerificationMethodParams | AddVerificationMethodRelationshipParams | SendSignedTransactionParams | AddServiceParams;
export type EbsiRPCResponse = RpcOkResponse | (RpcErrorResponse & {
nonce: string;
});
export {};
//# sourceMappingURL=types.d.ts.map