# Liquality veramo plugins
liq seed phrase
-> derivation path -> privKey -> pubKey -> addr -> did
You need to provide custom `AbstractKeyStore` and `AbstractDIDStore` implementations that use the liquality account data to `list` and `get` DIDs and keys.
## Using `account data`
* custom `AbstractDIDStore`:
* `import()` => should throw error
* `delete()` => should throw error
* `list()`
* map account data addresses to DIDs by prefixing them
* use `get(did)` for each one to return a list of `IIdentifier`
* `get(did)` => `did:ethr:0xaddr` => substring => `addr` =>
* build an `IIdentifier` with one entry in the `keys` array
* `did`: did
* `provider`: 'did:ethr'
* `services`: []
* `keys`: [{`kid`: addr}]
I think everything else about the `IKey` is meaningless here, but you have all the data needed to construct the key here if needed.
* custom `AbstractKeyStore`:
liq addr -> der path -> priv key
* `import()` => should throw error
* `delete()` => should throw error
* `get(kid)`
* interpret `kid` as `addr`
* use `account data` to get `derivation path` for `addr`
* call https://docs.ethers.io/v5/api/signer/#Wallet.fromMnemonic to get a Wallet instance
* this would be a good place to compare `wallet.address` with `addr` and if they don't match, there's probably something wrong with the path
* wallet instance has `privateKey` and `publicKey` which can be used to populate the details of an `IKey`
## How to construct an `IKey` instance
- `privateKeyHex` `Wallet.fromMnemonic(seed, deriv path).privateKey`
- `publicKeyHex` `Wallet.fromMnemonic(seed, deriv path).publicKey`
- `kid` can be the same as `addr`
- `type`: `TKeyType` => `Secp256k1` (ignore everything else)
- `kms`: 'local' (has to correspond to the string you use in the config)
- `meta` ( optional, but can hold derivation path )
## What happens when you create credential
* createVerifiableCredential:
* plugin uses `issuer` to get `did` => `agent.didManagerGet(did)` => an `IIdentifier` instance
* `IIdentifier.keys.find(secp256k1)` => an `IKey` instance
* plugin calls `keyManagerSign({IKey.kid})`