# Zksync

[Escrow.sol](https://github.com/yetanotherco/yet-another-bridge/blob/develop/contracts/zksync/contracts/escrow.sol) is a Smart Contract written in Solidity that resides in Ethereum's L2 [ZKSync](https://zksync.io/), 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

* `/contracts`: Contains source files, solidity smart contracts.
* `/deploy`: Scripts for contract deployment and interaction.
* `/test`: Test files.
* `/artifacts-zk`: Autogenerated with required libraries.
* `hardhat.config.ts`: Configuration settings.

## How to Use

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

### Local Tests

To run local tests you should first start a local dockerized node. For this you can:

```bash
git clone https://github.com/matter-labs/local-setup.git
cd local-setup
./start.sh
```

Then, to run the contract's tests:

```bash
make zksync-test
```

### About Network Support:

`hardhat.config.ts` comes with a list of networks to deploy and test contracts. Add more by adjusting the `networks` section in the `hardhat.config.ts`. To make a network the default, set the `defaultNetwork` to its name.

You can also override the default using the `--network` option. For example: `hardhat test --network dockerizedNode`.

## How does a User set a new order?

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

```solidity
function set_order(address recipient_address, uint256 fee) public payable whenNotPaused returns (uint256)
```

Which 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:

```solidity
event SetOrder(uint256 order_id, address recipient_address, uint256 amount, uint256 fee);
```

## 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:

```solidity
function claim_payment(
    uint256 order_id,
    address recipient_address,
    uint256 amount
) public whenNotPaused
```

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:

```solidity
function claim_payment_batch(
    uint256[] calldata order_ids,
    address[] calldata recipient_addresses,
    uint256[] calldata amounts
) public whenNotPaused
```
