# Создание транзакции

В данной статье мы будем использоваться этот кошелек для примера:

```c
Address: 0x026A25EfbcEFb2e481d005E4F00Ccced0AF511FF
Private Key: 0x1c1a49fea9a4ede1dc8e582639f498d41fa3c4a9e2ab2b9d740a4a3ec14e1cbf
```

## **Уровень-1 (Layer-1)**

Единственная транзакция, которая совершается на Уровне-1 – это депозит. Она имеет два подтипа `DepositETH и DepositERC20`.

### **ABIs**

```cpp
[
  {
    "constant": false,
    "inputs": [
      {
        "internalType": "contract IERC20",
        "name": "_token",
        "type": "address"
      },
      {
        "internalType": "uint104",
        "name": "_amount",
        "type": "uint104"
      },
      {
        "internalType": "address",
        "name": "_franklinAddr",
        "type": "address"
      }
    ],
    "name": "depositERC20",
    "outputs": [],
    "payable": false,
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "constant": false,
    "inputs": [
      {
        "internalType": "address",
        "name": "_franklinAddr",
        "type": "address"
      }
    ],
    "name": "depositETH",
    "outputs": [],
    "payable": true,
    "stateMutability": "payable",
    "type": "function"
  }
]
```

### **Депозит ETH**

Пример кода:

```csharp
import { Wallet, Contract, utils } from 'ethers'

const contract = new Contract('0x8ECa806Aecc86CE90Da803b080Ca4E3A9b8097ad', ABI, wallet)
const wallet = new Wallet('0x1c1a49fea9a4ede1dc8e582639f498d41fa3c4a9e2ab2b9d740a4a3ec14e1cbf')

async function depositETH(amount) {
  const tx = await contract.depositETH(wallet.address, {
    value: utils.parse(amount)
  })
  return tx
}

// deposit 1 ETH
depositETH('1').then(console.log)
```

### **Депозит ERC20**

Как и в других проектах вы должны подтвердить основной адрес контракта ZKSwap, чтобы внести свои токенты ERC20 на депозит. Будьте осторожны с токенами, у которых есть ограничения (Подробнее см. [здесь](https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729)).&#x20;

Пример кода:

```csharp
import { Wallet, Contract, utils } from 'ethers'

const contract = new Contract('0x8ECa806Aecc86CE90Da803b080Ca4E3A9b8097ad', ABI, wallet)
const wallet = new Wallet('0x1c1a49fea9a4ede1dc8e582639f498d41fa3c4a9e2ab2b9d740a4a3ec14e1cbf')

async function depositERC20(amount, tokenAddress) {
  const tokenContract = new Contract(tokenAddress, ERC20_ABI, wallet)
  // check allowance
  const allowance = await tokenContract.allowance(wallet.address, MAIN_CONTRACT_ADDRESS)
  let nonce
  if (allowance.lt(utils.parse(amount)) {
    // approve
    const MAX_AMOUNT = '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
    const approveTx = await tokenContract.allow(MAIN_CONTRACT_ADDRESS, MAX_AMOUNT)
    nonce = approveTx.nonce + 1
  }
  const tx = await contract.depositERC20(tokenAddress, utils.parse(amount), wallet.address, {
    nonce
  })
  return tx
}

// deposit 100 ZKS
depositERC20('100', '0xe4815ae53b124e7263f08dcdbbb757d41ed658c6').then(console.log)
```

### **Уровень-2**

При отправке транзакции на ZKSwap через API необходимо заполнить три поля: `tx`, `signature` и `fastProcessing`. Далее по тексту `Signed Transaction` относиться к полю `tx`, а ETH Signature относится к полю `signature`.

### **Приватный ключ**

Подпишите следующее сообщение приватным ключом Уровня 1, чтобы получить сид фразу Уровня 2. И используйте [криптографические библиотеки zkSync](https://zksync.io/api/sdk/crypto.html), чтобы получить приватный ключ.

{% tabs %}
{% tab title="Plain Text" %}

```csharp
Access ZKSwap account.

Only sign this message for a trusted client!
```

{% endtab %}

{% tab title=" JavaScript" %}

```javascript
const msg = 'Access ZKSwap account.\n\nOnly sign this message for a trusted client!'
```

{% endtab %}
{% endtabs %}

Вот полный пример получения приватного ключа с помощью [zksync-crypto](https://www.npmjs.com/package/zksync-crypto) в JavaScript.

```csharp
import { Wallet, Contract, utils } from 'ethers'
import { privateKeyFromSeed, private_key_to_pubkey_hash } from 'zksync-crypto'

const wallet = new Wallet('0x1c1a49fea9a4ede1dc8e582639f498d41fa3c4a9e2ab2b9d740a4a3ec14e1cbf')

async function getPrivateKey() {
    const msg = 'Access ZKSwap account.\n\nOnly sign this message for a trusted client!'
    const signature = await wallet.signMessage(msg)
    const seed = utils.arrayify(signature)

    // Get private key
    const privateKey = privateKeyFromSeed(seed)
    
    return privateKey
}

getPrivateKey().then(console.log)
```

### Хеш открытого ключа

После получения приватного ключа вам необходимо зарегистрировать хэш открытого ключа в ZKSwap, чтобы он мог верифицировать отправленные вами транзакции.

```csharp
import { utils } from 'ethers'
import { private_key_to_pubkey_hash } from 'zksync-crypto'

const pubKeyHash = `sync:${utils.hexlify(private_key_to_pubkey_hash(privateKey)).substr(2)}`
```

### Подпись

Перед отправкой транзакции в ZKSwap вам необходимо подписать данные транзакции.

```csharp
import { utils } from 'ethers'
import { sign_musig } from 'zksync-crypto'

function signMessage(privateKey, msgBytes) {
    const signaturePacked = sign_musig(privateKey, msgBytes)
    
    const pubKey = utils.hexlify(signaturePacked.slice(0, 32)).substr(2)
    const signature = utils.hexlify(signaturePacked.slice(32)).substr(2)
    
    return {
        pubKey,
        signature
    }
}

const msgBytes = utils.concat([type, accountId, ...etc])
const signature = signMessage(privateKey, msgBytes)

```

### **Замена открытого ключа**

После того, как учетная запись была «зарегистрирована» в ZKSwap (посредством перевода или депозита), вы можете изменить pubKeyHash учетной записи, чтобы совершать любую транзакцию на Уровне 2. Это особая транзакция, которую не нужно подписывать приватным ключом Уровня 2.

**Поля транзакции**

| **Field**    | Type    | Comment              |
| ------------ | ------- | -------------------- |
| type         | string  | ChangePubKey         |
| accountId    | number  | Your account ID.     |
| account      | address | Your address.        |
| newPkHash    | number  | The public key hash. |
| nonce        | number  | Your current nonce.  |
| ethSignature | string  | Layer-1 signature    |

**Пример подписанной транзакции**

```csharp
{
    "type": "ChangePubKey",
    "accountId": 83670,
    "account": "0x026A25EfbcEFb2e481d005E4F00Ccced0AF511FF",
    "newPkHash": "sync:83f62ba777515089eb905a375f77f59ddfada116",
    "nonce": 0,
    "ethSignature": "0x66c1ef3611a634e400301375b291a0835b0e31237273e1bdab45acc3ef27c761674fd5e5a706566e5175e8e18306f5b8d1d36016f3894e84d527c3c97e92bcf71c"
}
```

**ETH подпись**

{% tabs %}
{% tab title="Шаблон сообщения" %}

```csharp
Register ZKSwap pubkey:

{pubKeyHash}
nonce: {hexlifiedNonce}
account id: {hexlifiedAccountId}

Only sign this message for a trusted client!
```

{% endtab %}

{% tab title="Сообщение для подписи" %}

```csharp
Register ZKSwap pubkey:

83f62ba777515089eb905a375f77f59ddfada116
nonce: 0x00000000
account id: 0x000146d6

Only sign this message for a trusted client!
```

{% endtab %}

{% tab title="Подпись" %}

```csharp
0x66c1ef3611a634e400301375b291a0835b0e31237273e1bdab45acc3ef27c761674fd5e5a706566e5175e8e18306f5b8d1d36016f3894e84d527c3c97e92bcf71c
```

{% endtab %}
{% endtabs %}

### **Перевод**

**Поля транзакции**

| Bytes Order | **Field** | Type    | Bytes Length | Comment                                  | Bytes Example                                |
| ----------- | --------- | ------- | ------------ | ---------------------------------------- | -------------------------------------------- |
| 0           | type      | string  | 1            | Transfer                                 | `0x05`                                       |
| 1           | accountId | number  | 4            | Your account ID.                         | `0x0000053a`                                 |
| 2           | from      | address | 20           | Your address.                            | `0x026a25efbcefb2e481d005e4f00ccced0af511ff` |
| 3           | to        | address | 20           | The target address you want to transfer. | `0x961b513dfd3e363c238e0f98219ee02552a847bd` |
| 4           | token     | number  | 2            | The ID of the token.                     | `0x000a`                                     |
| 5           | amount    | string  | 5            | The amount you want to transfer.         | `0x4a817c8008`                               |
| 6           | feeToken  | number  | 1            | The ID of fee token.                     | `0x0a`                                       |
| 7           | fee       | string  | 2            |                                          | `0x0000`                                     |
| 8           | chainId   | number  | 1            | 11 for mainnet, 128 for ropsten.         | `0x0b`                                       |
| 9           | nonce     | number  | 4            | Your current nonce.                      | `0x00000001`                                 |
| -           | signature | object  |              | Contains your `pubKey` and signature.    |                                              |

**Пример Full Bytes**

```csharp
0x050000053a026a25efbcefb2e481d005e4f00ccced0af511ff961b513dfd3e363c238e0f98219ee02552a847bd000a4a817c80080a00000b00000001
```

**Пример подписанной транзакции**

```csharp
{
    "type": "Transfer",
    "accountId": 1338,
    "from": "0x026A25EfbcEFb2e481d005E4F00Ccced0AF511FF",
    "to": "0x961b513dfd3e363c238e0f98219ee02552a847bd",
    "token": 10,
    "amount": "1000000000000000000",
    "feeToken": 10,
    "fee": "0",
    "chainId": 11,
    "nonce": 1,
    "signature": {
        "pubKey": "110ffd569daaee30068fc3c85922d1237f63a41d4749d464b883131e92369204",
        "signature": "7db4f4ce33abf89cbccaff96ae0651c79043dcf965893de71e7388163ec57883b2d4ef9bf264346ceff69f9ba8dfe8624d1fad9a452acf10a5d15f956a0a7b03"
    }
}
```

**ETH подпись**

{% tabs %}
{% tab title="Шаблон сообщения" %}

```csharp
Transfer {readableAmount} {tokenSymbol}
To: {to}
ChainId {chainId}
Nonce: {nonce}
Fee: {readableFee} {feeTokenSymbol}
Account Id: {accountId}
```

{% endtab %}

{% tab title="Пример сообщения" %}

```csharp
Transfer 1.0 ZKS
To: 0x961b513dfd3e363c238e0f98219ee02552a847bd
Chain Id: 11
Nonce: 1
Fee: 0.0 ZKS
Account Id: 1338
```

{% endtab %}

{% tab title="Подпись" %}

```csharp
{
    "type": "EthereumSignature",
    "signature": "0xbf8fa93e7da866aa3acb07a6a826e5e61195eba04e3c72a4f02b8fc8221da1f764363817968576013ca515ffe5e1104b5890937150883f3304d0738777af915b1c"
}
```

{% endtab %}
{% endtabs %}

### **Вывод**

**Поля транзакции**

| Bytes Order | **Field** | Type    | Bytes Length | Comment                                     | Bytes Example                                |
| ----------- | --------- | ------- | ------------ | ------------------------------------------- | -------------------------------------------- |
| 0           | type      | string  | 1            | Withdraw                                    | `0x03`                                       |
| 1           | accountId | number  | 4            | Your account ID.                            | `0x0000053a`                                 |
| 2           | from      | address | 20           | Your address.                               | `0x026a25efbcefb2e481d005e4f00ccced0af511ff` |
| 3           | to        | address | 20           | The target address you want to withdraw to. | `0x026a25efbcefb2e481d005e4f00ccced0af511ff` |
| 4           | token     | number  | 2            | The ID of the token you want to withdraw.   | `0x000a`                                     |
| 5           | amount    | string  | 16           | The amount you want to withdraw.            | `0x00000000000000000de0b6b3a7640000`         |
| 6           | feeToken  | number  | 1            | The ID of fee token.                        | `0x0a`                                       |
| 7           | fee       | string  | 2            |                                             | `0x4bf0`                                     |
| 8           | chainId   | number  | 1            | 11 for mainnet, 128 for ropsten.            | `0x0b`                                       |
| 9           | nonce     | number  | 4            | Your current nonce.                         | `0x00000002`                                 |
| -           | signature | object  |              | Contains your `pubKey` and signature.       |                                              |

**Пример Full Bytes**

```csharp
0x030000053a026a25efbcefb2e481d005e4f00ccced0af511ff026a25efbcefb2e481d005e4f00ccced0af511ff000a00000000000000000de0b6b3a76400000a4bf00b00000002
```

**Пример подписанной транзакции**

```csharp
{
    "type": "Withdraw",
    "accountId": 1338,
    "from": "0x026A25EfbcEFb2e481d005E4F00Ccced0AF511FF",
    "to": "0x026a25efbcefb2e481d005e4f00ccced0af511ff",
    "token": 10,
    "amount": "1000000000000000000",
    "feeToken": 10,
    "fee": "6070000000000000000",
    "chainId": 11,
    "nonce": 2,
    "signature": {
        "pubKey": "110ffd569daaee30068fc3c85922d1237f63a41d4749d464b883131e92369204",
        "signature": "68bb8413edc0182812aa90481ff46f0514df9d5d6b5703338f1a292682caad9b04cac623f95b9d26fa31d4a9330ba35b5746fd697853a0512f92b00692fe6d00"
    }
}
```

**ETH подпись**

{% tabs %}
{% tab title="Шаблон сообщения" %}

```csharp
Withdraw {readableAmount} {tokenSymbol}
To: {to}
ChainId {chainId}
Nonce: {nonce}
Fee: {readableFee} {feeTokenSymbol}
Account Id: {accountId}
```

{% endtab %}

{% tab title="Пример сообщения" %}

```csharp
Withdraw 3.4226556417 ZKS
To: 0x026a25efbcefb2e481d005e4f00ccced0af511ff
ChainId 10
Nonce: 2
Fee: 1.577 ZKS
Account Id: 83670
```

{% endtab %}

{% tab title="Подпись" %}

```csharp
{
    "type": "EthereumSignature",
    "signature": "0x0440667d6a694b76e5f3a51fa3981a3db95bfc7d3feeb301f403ea6f3bef01d32c9e06920f7b13edd92a6cb22f49d6709fb4f9d41efc09b0a094173b6bbb4f121b"
}
```

{% endtab %}
{% endtabs %}

### **Обмен**

#### **Комиссия**

Для примера обменяем токен А на токен В. Есть два способа:

1. Если А – это токен комиссии, то ее размер рассчитывается как `amountIn * 5 / 9995`
2. Если А не выступает в роли токена комиссии, а для комиссии применяется токен В, то ее размер `amountOut * 5 /10000`. Это не `amountOutMin`. `amountOut` равен `amountOutMin` и тогда проскальзывание равно 0.

#### **Поля транзакции**

| Bytes Order | **Field**    | Type    | Bytes Length | Comment                                   | Bytes Example                                |
| ----------- | ------------ | ------- | ------------ | ----------------------------------------- | -------------------------------------------- |
| 0           | type         | string  | 1            | Swap                                      | `0x0b`                                       |
| 1           | accountId    | number  | 4            | Your account ID.                          | `0x0000053a`                                 |
| 2           | from         | address | 20           | Your address.                             | `0x026a25efbcefb2e481d005e4f00ccced0af511ff` |
| 3           | to           | address | 20           | The pair's address.                       | `0xaa45c964e21eafb38574e9d000adbaf85acfbb80` |
| 4           | tokenIn      | number  | 2            | The ID of the token you want to swap in.  | `0x000a`                                     |
| 5           | amountIn     | string  | 5            | The amount you want to swap in.           | `0x94efe63009`                               |
| 6           | tokenOut     | number  | 2            | The ID of the token you want to swap out. | `0x0000`                                     |
| 7           | amountOutMin | string  | 5            | The minimum amount  you want to swap out. | `0x25004d47c6`                               |
| 8           | feeToken     | number  | 1            | The ID of fee token.                      | `0x0a`                                       |
| 9           | fee          | string  | 2            |                                           | `0x7d0d`                                     |
| 10          | chainId      | number  | 1            | 11 for mainnet, 128 for ropsten.          | `0x0b`                                       |
| 11          | nonce        | number  | 4            | Your current nonce.                       | `0x00000003`                                 |
| -           | signature    | object  |              | Contains your `pubKey` and signature.     |                                              |

**Пример Full Bytes**

```csharp
0x0b0000053a026a25efbcefb2e481d005e4f00ccced0af511ffaa45c964e21eafb38574e9d000adbaf85acfbb80000a94efe63009000025004d47c60a7d0d0b00000003
```

**Пример подписанной транзакции**

```csharp
{
    "type": "Swap",
    "accountId": 1338,
    "from": "0x026A25EfbcEFb2e481d005E4F00Ccced0AF511FF",
    "to": "0xaa45c964e21eafb38574e9d000adbaf85acfbb80",
    "tokenIn": 10,
    "tokenOut": 0,
    "amountIn": "19990000000000000000",
    "amountOutMin": "4966214206000000",
    "feeToken": 10,
    "fee": "10000000000000000",
    "chainId": 11,
    "nonce": 3,
    "signature": {
        "pubKey": "110ffd569daaee30068fc3c85922d1237f63a41d4749d464b883131e92369204",
        "signature": "3c6c2059ab0e929ed18d6ad4fbbf1cddce0e84b0cb9537069456b16cd01f33a2bc5391f8f7e1b9ae8fdff4c5d05856709e6bfd0e9200f5293386cf1aa6b39c00"
    }
}
```

**ETH подпись**

{% tabs %}
{% tab title="Шаблон сообщения" %}

```
Swap {readableAmontIn} {tokenInSymbol}
Minimum: {readableAmontOutMin} {tokenOutSymbol}
To: {pairAddress}
ChainId {chainId}
Nonce: {nonce}
Fee: {readableFee} {feeTokenSymbol}
Account Id: {accountId}
```

{% endtab %}

{% tab title="Пример сообщения" %}

```csharp
Swap 19.99 ZKS
Minimum: 0.004966214206 ETH
To: 0xaa45c964e21eafb38574e9d000adbaf85acfbb80
Chain Id: 11
Nonce: 3
Fee: 0.01 ZKS
Account Id: 1338
```

{% endtab %}

{% tab title="Подпись" %}

```csharp
{
    "type": "EthereumSignature",
    "signature": "0x66ca505f09e2dbd2aaaa809cac3ec7085ea7831ec58c695566190588a2ced45c0d7e1c235840dd3f547d54ad87e6740bb3d299a89d36460b9eb1e56b25456ef41b"
}
```

{% endtab %}
{% endtabs %}

**Добавление ликвидности**

**Поля транзакции**

| Bytes Order | **Field**      | Type    | Bytes Length | Comment                                                    | Bytes Example                                |
| ----------- | -------------- | ------- | ------------ | ---------------------------------------------------------- | -------------------------------------------- |
| 0           | type           | string  | 1            | AddLiquidity                                               | `0x09`                                       |
| 1           | accountId      | number  | 4            | Your account ID.                                           | `0x0000053a`                                 |
| 2           | from           | address | 20           | Your address.                                              | `0x026a25efbcefb2e481d005e4f00ccced0af511ff` |
| 3           | to             | address | 20           | The pair's address.                                        | `0xaa45c964e21eafb38574e9d000adbaf85acfbb80` |
| 4           | tokenA         | number  | 2            | The ID of token A.                                         | `0x0000`                                     |
| 5           | amountADesired | number  | 5            | The amount of token A you want to add to the pair.         | `0xc2cf6f3245`                               |
| 6           | amountAMin     | string  | 5            | The minimum amount of Token A you want to add to the pair. | `0xb911dcd625`                               |
| 7           | tokenB         | number  | 2            | The ID of the token B.                                     | `0x000a`                                     |
| 8           | amountBDesired | string  | 5            | The amount of token B you want to add to the pair.         | `0x4a817c8009`                               |
| 9           | amountBMin     | string  | 5            | The minimum amount of Token B you want to add to the pair. | `0x46c7cfe009`                               |
| 10          | tokenLiquidity | number  | 2            | The pair ID.                                               | `0x4002`                                     |
| 11          | feeToken       | number  | 1            | The ID of fee token.                                       | `0x0a`                                       |
| 12          | fee            | string  | 2            |                                                            | `0x0000`                                     |
| 13          | chainId        | number  | 1            | 11 for mainnet, 128 for ropsten.                           | `0x0b`                                       |
| 14          | nonce          | number  | 4            | Your current nonce.                                        | `0x00000004`                                 |
| -           | signature      | object  |              | Contains your `pubKey` and signature.                      |                                              |

**Пример Full Bytes**

```csharp
0x090000053a026a25efbcefb2e481d005e4f00ccced0af511ffaa45c964e21eafb38574e9d000adbaf85acfbb800000c2cf6f3245b911dcd625000a4a817c800946c7cfe00940020a00000b00000004
```

**Пример подписанной транзакции**

```c
{
    "type": "AddLiquidity",
    "accountId": 1338,
    "from": "0x026A25EfbcEFb2e481d005E4F00Ccced0AF511FF",
    "to": "0xaa45c964e21eafb38574e9d000adbaf85acfbb80",
    "tokenA": 0,
    "tokenB": 10,
    "tokenLiquidity": 16386,
    "amountADesired": "2614699457800000",
    "amountBDesired": "10000000000000000000",
    "amountAMin": "2483964484900000",
    "amountBMin": "9500000000000000000",
    "feeToken": 10,
    "fee": "0",
    "chainId": 11,
    "nonce": 4,
    "signature": {
        "pubKey": "110ffd569daaee30068fc3c85922d1237f63a41d4749d464b883131e92369204",
        "signature": "3506a865b8a0871b706a620abbf7978760f76670c2d563f059d217890349988dd7a37d1cea3f67d5ca691453dd45d282141acac3f4dafb9f7a44b1dda3e0ca00"
    }
}
```

**ETH подпись**

{% tabs %}
{% tab title="Шаблон сообщения" %}

```c
AddLiquidity {pairSymbol}
Desired: {readableAmontA} {tokenASymbol} {readableAmontB} {tokenBSymbol}
Minimum: {readableAmontAMin} {tokenASymbol} {readableAmontBMin} {tokenBSymbol}
To: {pairAddress}
ChainId {chainId}
Nonce: {nonce}
Fee: {readableFee} {feeTokenSymbol}
Account Id: {accountId}
```

{% endtab %}

{% tab title="Пример сообщения" %}

```c
AddLiquidity liquidity_0_10
Desired: 0.0026146994578 ETH 10.0 ZKS
Minimum: 0.0024839644849 ETH 9.5 ZKS
To: 0xaa45c964e21eafb38574e9d000adbaf85acfbb80
Chain Id: 11
Nonce: 4
Fee: 0.0 ZKS
Account Id: 1338
```

{% endtab %}

{% tab title="Подпись" %}

```c
{
    "type": "EthereumSignature",
    "signature": "0x20c1c26e8f678220189f0a4a444e1686e969faa536a17abc1a30a113d6e4bfc12aa88a2075693857ea410f439d28467b01666bcb01d1b6bb7b8ce3641bd6daea1b"
}
```

{% endtab %}
{% endtabs %}

**Удаление ликвидности**

**Поля транзакции**

| Bytes Order | **Field**       | Type    |    | Comment                                                         | Bytes Examplle                               |
| ----------- | --------------- | ------- | -- | --------------------------------------------------------------- | -------------------------------------------- |
| 0           | type            | string  | 1  | RemoveLiquidity                                                 | `0x0a`                                       |
| 1           | accountId       | number  | 4  | Your account ID.                                                | `0x0000053a`                                 |
| 2           | from            | address | 20 | Your address.                                                   | `0x026a25efbcefb2e481d005e4f00ccced0af511ff` |
| 3           | to              | address | 20 | The pair's address.                                             | `0xaa45c964e21eafb38574e9d000adbaf85acfbb80` |
| 4           | tokenA          | number  | 2  | The ID of token A.                                              | `0x0000`                                     |
| 5           | amountAMin      | string  | 5  | The minimum amount of Token A you want to remove from the pair. | `0xb96855c485`                               |
| 6           | tokenB          | number  | 2  | The ID of the token B.                                          | `0x000a`                                     |
| 7           | amountBMin      | string  | 5  | The minimum amount of Token B you want to remove from the pair. | `0x46a6e21049`                               |
| 8           | feeToken        | number  | 1  | The ID of fee token.                                            | `0x0a`                                       |
| 9           | fee             | string  | 2  |                                                                 | `0x0000`                                     |
| 10          | tokenLiquidity  | number  | 2  | The pair ID.                                                    | `0x4002`                                     |
| 11          | amountLiquidity | string  | 5  | The amount of LP token you want to remove.                      | `0x77e80cdba7`                               |
| 12          | chainId         | number  | 2  | 11 for mainnet, 128 for ropsten.                                | `0x0b`                                       |
| 13          | nonce           | number  | 4  | Your current nonce.                                             |                                              |
| -           | signature       | object  |    | Contains your `pubKey` and signature.                           |                                              |

**Пример Full Bytes**

```c
0x0a0000053a026a25efbcefb2e481d005e4f00ccced0af511ffaa45c964e21eafb38574e9d000adbaf85acfbb800000b96855c485000a46a6e210490a0000400277e80cdba70b00000005
```

**Пример подписанной транзакции**

```c
{
    "type": "RemoveLiquidity",
    "accountId": 1338,
    "from": "0x026A25EfbcEFb2e481d005E4F00Ccced0AF511FF",
    "to": "0xaa45c964e21eafb38574e9d000adbaf85acfbb80",
    "tokenA": 0,
    "tokenB": 10,
    "amountAMin": "2488498128400000",
    "amountBMin": "9482735746000000000",
    "tokenLiquidity": 16386,
    "amountLiquidity": "160935707810000000",
    "feeToken": 10,
    "fee": "0",
    "chainId": 11,
    "nonce": 5,
    "signature": {
        "pubKey": "110ffd569daaee30068fc3c85922d1237f63a41d4749d464b883131e92369204",
        "signature": "bf0e5c3639e9f9f837e2d141fa9481da8e11574001dbe8cd81cb3005c9cac69ae05655d416cd53bedd27142235ad5743e9f26b66ac8643d859d0c8caf149a700"
    }
}
```

**ETH подпись**

{% tabs %}
{% tab title="Шаблон сообщения" %}

```c
RemoveLiquidity {readableLiquidityAmount} {pairSymbol}
Minimum: {readableAmontAMin} {tokenASymbol} {readableAmontBMin} {tokenBSymbol}
To: {pairAddress}
ChainId {chainId}
Nonce: {nonce}
Fee: {readableFee} {feeTokenSymbol}
Account Id: {accountId}
```

{% endtab %}

{% tab title="Пример сообщения" %}

```c
RemoveLiquidity 0.16093570781 liquidity_0_10
Minimum: 0.0024884981284 ETH 9.482735746 ZKS
To: 0xaa45c964e21eafb38574e9d000adbaf85acfbb80
Chain Id: 11
Nonce: 5
Fee: 0.0 ZKS
Account Id: 1338
```

{% endtab %}

{% tab title="Подпись" %}

```c
{
    "type": "EthereumSignature",
    "signature": "0x85ce1409808a56b4522b6787d397d4b5d04a926e701a72b1388fff74f447650b1789c6bb7487b638bb1f6100faaa318b37311d831f07252bd0971331e61b8ad51b"
}
```

{% endtab %}
{% endtabs %}
