# Starknet

[Escrow.cairo](https://github.com/yetanotherco/yet-another-bridge/blob/develop/docs/contracts/cairo/src/escrow.cairo) is a Smart Contract written in Cairo that resides in Ethereum's L2 [Starknet](https://www.starknet.io/en), and is our implementation of our bridge's [Escrow](https://github.com/yetanotherco/yet-another-bridge/blob/develop/docs/contracts/escrow/Escrow.md) entity for this L2.

## Project Layout

* `/src`: Contains source files, Cairo smart contracts.
  * `/src/test` & `/src/mocks`: Test files.
* `/target`: Autogenerated output files.
* `/scripts`: Scripts for contract deployment and interaction.
* `/`: Config files

## How to Use

* `make deps`: Installs dependencies
* `make starknet-build`: Compiles contracts.
* `make starknet-deploy`: Deploys using script `/deploy/deploy.ts`.
* `make starknet-connect`: Connects itself to saved PaymentRegistry address.
* `make starknet-deploy-and-connect`: Deploys and connects itself to saved PaymentRegistry address.
* `make ethereum-and-starknet-deploy`: Deploys both smart contracts and connects them to each other.
* `make starknet-test`: Runs local tests

## How does a User set a new order?

This contract recieves User's new orders with the function:

```
fn set_order(ref self: ContractState, order: Order) -> u256
```

Which recieves an `Order` structure:

```cairo
struct Order {
    recipient_address: EthAddress,
    amount: u256,
    fee: u256
}
```

And returns the new order's ID.

## How does a MM detect a User's new order?

When a new order is set, the following SetOrder Event is emitted, detectable by MM's:

```cairo
struct SetOrder {
    order_id: u256,
    recipient_address: EthAddress,
    amount: u256,
    fee: u256
}
```

## How does a MM claim his payment?

The `claim_payment` function is called, only by our [Payment Registry](https://docs.yetanotherbridge.com/contracts/payment_registry), in order for the MM to retrieve its payment from the Escrow:

```cairo
#[l1_handler]
fn claim_payment(
    ref self: ContractState,
    from_address: felt252,
    order_id: u256,
    recipient_address: EthAddress,
    amount: u256
)
```

Alternatevly, the `claim_payment_batch` function is called, only by our [Payment Registry](https://docs.yetanotherbridge.com/contracts/payment_registry), in order for the MM to retrieve many payments from the Escrow at once:

```cairo
#[l1_handler]
fn claim_payment_batch(
    ref self: ContractState,
    from_address: felt252,
    orders: Array<(u256, EthAddress, u256)>
)
```
