Documentation
# `did:sol` Program

The [anchor-based](https://github.com/coral-xyz/anchor) program of `did:sol` on Solana.

## Creating DIDs

*Any Solana public key can be a DID.* This means that if you have a public key `abc`, then that key
corresponds to the decentralized identifier `did:sol:abc`.

This DID is called a `generative` DID, because it is generated from a public key, and has no other information associated with it.

Generative DIDs have one authority, which is the public key itself (`abc` in this case).

## Adding information to DIDs

In order to add more authorities, or any other information to the DID, it must be initialised on chain,
using the `initialize` instruction.

Once a DID is initialized, other keys can be added to it using the `add_verification_method` instruction.

## DID Accounts

The information for a DID is stored on a `DID Account`, a PDA that is derived from the DID identifier.

In order to derive the PDA for any DID, the following function is used:

```rust
use sol_did::integrations::derive_did_account;

let (did_account, bump) = derive_did_account(key.to_bytes())
```

Where `key` is the identifier of the DID (`abc` in the above case)

In order to reduce the amount of calculations that are needed to derive the DID account,
you can pass the `bump` value as a parameter:

```rust
use sol_did::integrations::derive_did_account_with_bump;

let did_account = derive_did_account_with_bump(key.to_bytes(), bump)?;
```

Note, in this case, the function returns a Result, in case the bump value is incorrect.

## Checking if a key is an authority on a DID

In order to use DIDs in your program, add the DID account to your instruction accounts list.

The DID account is the that stores the DID information. Note: this can be `generative` (see above).

To check if a key is an authority of a DID, use the `is_authority` instruction.

```rust
use sol_did::integrations::is_authority;

let signer_owns_did = is_authority(
    &did_account,
    None,
    &[],
    &signer.to_bytes(),
    None,
    None
);
```

This function works in the generative and non-generative case. In the generative case, the did_account
must be owned by the system program.

## Controller relationship

One DID can be a `controller` of another DID.

If a key `a` is an authority on `did:sol:abc`, and `did:sol:abc` is a controller of `did:sol:def`
then the following `is_authority` relationship is true:

```rust
use sol_did::integrations::is_authority;

let signer_owns_did = is_authority(
    &abc_account,
    None,
    &[(def_account_info, def)],
    &abc.to_bytes(),
    None,
    None
);
```

## Instructions

### `initialize`
Arguments:
- size: `u32`

Accounts:
- didData `isMut`
- authority `isSigner`, `isMut`
- payer `isSigner`, `isMut`
- systemProgram 

### `resize`
Arguments:
- size:`u32`
- ethSignature:`Option<Secp256k1RawSignature>`

Accounts:
- didData `isMut`
- authority `isSigner`
- payer `isSigner`, `isMut`
- systemProgram

### `close`
Arguments:
- ethSignature:`Option<Secp256k1RawSignature>`

Accounts:
- didData `isMut`
- authority `isSigner`
- destination `isMut`
- systemProgram

### `add_verification_method`
Arguments:
- verificationMethod:`VerificationMethod`
- ethSignature:`Option<Secp256k1RawSignature>`

Accounts:
- didData `isMut`
- authority `isSigner`

### `remove_verification_method`
Arguments:
- fragment:`string`
- ethSignature:`Option<Secp256k1RawSignature>`

Accounts:
- didData `isMut`
- authority `isSigner`

### `add_service`
Arguments:
- service:`Service`
- allowOverwrite:`bool`
- ethSignature:`Option<Secp256k1RawSignature>`

Accounts:
- didData `isMut`
- authority `isSigner`

### `remove_service`
Arguments:
- fragment:`string`
- ethSignature:`Option<Secp256k1RawSignature>`

Accounts:
- didData `isMut`
- authority `isSigner`

### `set_vm_flags`
Arguments:
- flagsVm:`UpdateFlagsVerificationMethod`
- ethSignature:`Option<Secp256k1RawSignature>`

Accounts:
- didData `isMut`
- authority `isSigner`

### `set_controllers`
Arguments:
- setControllersArg:`SetControllersArg`
- ethSignature:`Option<Secp256k1RawSignature>`

Accounts:
- didData `isMut`
- authority `isSigner`

### `update`
Arguments:
- updateArg:`UpdateArg`
- ethSignature:`Option<Secp256k1RawSignature>`

Accounts:
- didData `isMut`
- authority `isSigner`

### `migrate`
Arguments:

Accounts:
- didData `isMut`
- authority
- payer `isSigner`, `isMut`
- legacyDidData
- systemProgram

### Deployments

- Mainnet-beta: [didso1Dpqpm4CsiCjzP766BGY89CAdD6ZBL68cRhFPc]https://explorer.solana.com/address/didso1Dpqpm4CsiCjzP766BGY89CAdD6ZBL68cRhFPc
- Devnet: [didso1Dpqpm4CsiCjzP766BGY89CAdD6ZBL68cRhFPc]https://explorer.solana.com/address/didso1Dpqpm4CsiCjzP766BGY89CAdD6ZBL68cRhFPc?cluster=devnet
- Testnet: TODO...

### APR Reference

- `did:sol` program on [APR]https://www.apr.dev/program/didso1Dpqpm4CsiCjzP766BGY89CAdD6ZBL68cRhFPc