# Contract Escrow
###### tags: `ideas`, `crypto`, `services`
The objective of this project is to design, implement, and deploy a smart contract (**Escrow Contract**) that facilitates the secure transfer of ownership of the other contract (**Transferable**) through the use of an escrow mechanism.
<br>
## The transfer flow
The smart contract will enable both parties (**Owner** and **Buyer**) involved in the transfer process to safely perform the transfer of ownership by providing a secure, transparent, and autonomous escrow service by following the steps:
- The **owner** initiates a transfer by creating a `transfer` object in the **escrow contract**. The `transfer` contains the `address` of the **transferable** contract, the `address` of **buyer** and the amount of funds in ETH required for the ownership to be transferred;
- In order to **transfer** to be created the **owner's** address must exactly match the address of the current owner of the **transferable** contract. This step is crucial for the **reverting procedure** which is executed in case if the deal did not take place and the ownership has to be given back to the **owner**;
- After the **transfer** is created sides have to perform the following actions in order to proceed the transfer:
- From **owner's** side, the ownership of the **transferable** contract has to be transferred to the **escrow**;
- From the **buyer's** side, the amount of ETH should be transferred to the **escrow** not less then the amount specified in the **transaction**; `**`
- After both of this requirements are met the **transaction** becomes `validated` which allows sides to complete the ownership transfer and as a result:
- The ownership of **transferable** contract is transferred to the **buyer**;
- Funds accumulated in scope of the transfer are sent to the **owner**; `*`
<br>
<br>
## Transparency
At any time the status of a transfer can be queried from the **escrow** contract providing a complete transparency of both sides, those includes:
- `Ownership is escrowed` - `true`/`false`;
- `Funds are escrowed` - `true` / `false`;
<br>
In addition to that the following block-chain events are fired allowing sides (or interested parties) to follow the transfer process:
- `TransferCreated` - is fired when the transfer is successfully created by the **owner**;
- `OwnershipEscrowed` - is fired when the **transferable** contract ownership is transferred to the **escrow** contract;
- `FundsEscrowed` - is fired when amount of funds at the **escrow** balance in scope of the **transaction** reach the amount specified by the **owner**;
- `TransferComplete`
<br>
<br>
## Reverting
At any time both of the sides can terminate a **transfer** by making a call to specific function of the **escrow** contract which will be resulted in:
- The ownership will be transferred back to the **owner**;
- Funds will be transferred back to the **buyer**;
<br>
<br>
## `*` Interest
At the stage when funds are transferred to the **owner** a service commission can be charged.
<br>
<br>
## `**` Possible extensions
The regular transfer flow can be changed in order to cover wider variety of needs, for example:
- Instead of the direct transfer to the **buyer's** address, the transfer may be performed in a form of auction, meaning that the one who have paid the most for the specific **transferable** will acquire an ownership, and the rest of propositions will be reverted;
- In addition to receive funds only from **buyer's** address the **transfer** can act as a public ledger. (The reverting procedure in this case would be more complicated so that the increase in gas consumption should be taken into account);