# Authority transfer

### Overview

The state of network entities that are currently not simulated locally (either because they are being simulated on another game client or on a simulator) cannot be affected directly.

Network [commands ](https://docs.coherence.io/0.4.14/authority/commands)and [events ](https://docs.coherence.io/0.4.14/authority/broken-reference)can help us affect state indirectly, but for anything more involved, an authority transfer might be necessary.

### Types of Authority Transfer

In the design phase, **CoherenceSync** objects can be configured to handle authority transfer in different ways:

* **Request**. Authority transfer may be requested, but it may be rejected by the receiving party (i.e. when *Approve requests* is false).
* **Steal.** Authority will always be given to the requesting party on a FCFS ("first come first serve") basis.
* **Not transferable**. Authority cannot be transferred.

<div align="left"><img src="https://3643360286-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWd0ZPEK7vE9nkE0b7G%2F-MYg4378H7LOZ5_vqe4G%2F-MYg4DscnE8e9YZ3fLdm%2Fimage.png?alt=media&#x26;token=5196138c-9efb-4d82-8d70-373c678d8384" alt=""></div>

### Requesting Authority in Code

Requesting authority is very straight-forward.

```csharp
var coherenceSync = target.GetComponent<CoherenceSync>();
coherenceSync.RequestAuthority();
```

As the transfer is asynchronous, we have to subscribe to one or more **Unity Events** in **CoherenceSync** to learn the result.

The request will first go to the replication server and be passed onto the receiving simulator or game client, so it may take a few frames to get a response.

```csharp
// There Unity Events in CoherenceSync help us understand 
// what happened with authority requests and act accordingly.

public UnityEvent OnAuthorityTransferRejected;

// TRUE is authority is transfered being gained, FALSE if lost
public UnityEvent<bool> OnBeforeAuthorityTransfer;

// TRUE is authority is transfered being gained, FALSE if lost
public UnityEvent<bool> OnAfterAuthorityTransfer;
```
