# Signatory

The Signatory Component primarily controls signer/signature validation. It gives developers the flexibility to define who they want to be a valid signer.

The full contract code of the `SignatoryComponent` can be found [**here**](https://github.com/horuslabsio/TBA/blob/v3/src/components/signatory/signatory.cairo)**.**

## Functions

### `_base_signer_validation`

```rust
fn _base_signer_validation(
  self: @ComponentState<TContractState>, 
  signer: ContractAddress
) -> bool;
```

This function implements a simple signer validation where only the NFT owner is a valid signer.

#### Parameters

| Name     | Type              | Description                                                                   |
| -------- | ----------------- | ----------------------------------------------------------------------------- |
| `signer` | `ContractAddress` | This is the address that is attempting to sign or perform actions on the TBA. |

#### Returns

`bool:` Returns`true` if the `signer` is same as the owner and `false` otherwise.

### `_permissioned_signer_validation`

This function implements a more complex signer validation where NFT owner, root owner, and permissioned addresses are valid signers.

```rust
fn _permissioned_signer_validation(
    self: @ComponentState<TContractState>, signer: ContractAddress
) -> bool;
```

#### Parameters

| Name     | Type              | Description                                                                   |
| -------- | ----------------- | ----------------------------------------------------------------------------- |
| `signer` | `ContractAddress` | This is the address that is attempting to sign or perform actions on the TBA. |

#### Returns

`bool:` Returns `true` if the `signer` is either the owner, the root owner, or a permissioned address, returns `false` otherwise.

### `_is_valid_signature`

This function checks whether a given digital signature is valid.

<pre class="language-rust"><code class="lang-rust"><strong>fn _is_valid_signature(
</strong>   self: @ComponentState&#x3C;TContractState>, hash: felt252, signature: Span&#x3C;felt252>
) -> felt252;
</code></pre>

#### Returns

`felt252:`  It returns `VALIDATED` If the signature is valid.
