> For the complete documentation index, see [llms.txt](https://vi0.gitbook.io/zksync-docs-ru/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://vi0.gitbook.io/zksync-docs-ru/provaidery.md).

# Провайдеры

Провайдеры - это объекты, которые "оборачивают" взаимодействие с нодой zkSync. Если вы знакомы с концепцией провайдеров в `ethers`, вам следует ознакомиться с их документацией [здесь](https://docs.ethers.io/v5/api/providers).

zkSync полностью поддерживает Ethereum Web3 API, поэтому вы можете использовать объекты провайдеров из ethers.js. Однако zkSync API предоставляет некоторые дополнительные методы JSON-RPC, которые позволяют:

* Легко отслеживать транзакции L1<->L2.&#x20;
* Разные стадии финальности транзакций. По умолчанию наш RPC предоставляет информацию о последнем состоянии, обработанном сервером, но в некоторых случаях может потребоваться отслеживание только "финализированных" транзакций.&#x20;

И многое другое! Как правило, для быстрого старта вы можете использовать провайдеров из `ethers`, но позже перейти на провайдеров из библиотеки `zksync-web3`.

Библиотека `zksync-web3` экспортирует два типа провайдеров:

* `Provider`, который наследуется от `JsonRpcProvider` из `ethers` и предоставляет доступ ко всем конечным точкам zkSync JSON-RPC.
* `Web3Provider`, который расширяет класс `Provider`, делая его более совместимым с кошельками Web3. Именно этот тип кошелька следует использовать для интеграции в браузере.

## `Provider`

Это наиболее часто используемый тип провайдера. Он обеспечивает ту же функциональность, что и `ethers.providers.JsonRpcProvider`, но дополняет его стандартными для zkSync методами.

### Создание провайдера

Конструктор принимает `url` ноды оператора и название `network` (опционально).

```typescript
constructor(url?: ConnectionInfo | string, network?: ethers.providers.Networkish)
```

#### Вводы и выводы

| Название              | Описание                         |
| --------------------- | -------------------------------- |
| url (опционально)     | URL-адрес ноды оператора zkSync. |
| network (опционально) | Описание сети.                   |
| returns               | Объект `provider`.               |

> Пример

```typescript
import { Provider } from "zksync-web3";

const provider = new Provider("https://zksync2-testnet.zksync.dev");
```

### `getBalance` <a href="#getbalance" id="getbalance"></a>

Возвращает баланс пользователя для определенного тега блока и нативного токена. Для проверки баланса в `ETH` вы можете либо не указывать последний аргумент, либо указать `ETH_ADDRESS`, предоставленный в объекте `utils`.

Пример:

```typescript
async getBalance(address: Address, blockTag?: BlockTag, tokenAddress?: Address): Promise<BigNumber>
```

#### Вводы и выводы

| Название                   | Описание                                                                                                       |
| -------------------------- | -------------------------------------------------------------------------------------------------------------- |
| address                    | Адрес пользователя для проверки баланса.                                                                       |
| blockTag (опционально)     | Блок, на котором должен быть проверен баланс. `committed`, т.е. последний обработанный - вариант по умолчанию. |
| tokenAddress (опционально) | Адрес токена. ETH по умолчанию.                                                                                |
| returns                    | Объект `BigNumber`.                                                                                            |

> Пример

```typescript
import { Provider } from "zksync-web3";

const provider = new Provider("https://zksync2-testnet.zksync.dev");

// Получение USDC баланса счета 0x0614BB23D91625E60c24AAD6a2E6e2c03461ebC5 на последнем обработанном блоке
console.log(await provider.getBalance("0x0614BB23D91625E60c24AAD6a2E6e2c03461ebC5", "latest", USDC_L2_ADDRESS));

// Получение баланса ETH
console.log(await provider.getBalance("0x0614BB23D91625E60c24AAD6a2E6e2c03461ebC5"));
```

### Получение адреса смарт-контракта zkSync

```typescript
async getMainContractAddress(): Promise<string>
```

#### Вводы и выводы

| Название | Описание                      |
| -------- | ----------------------------- |
| returns  | Адрес смарт-контракта zkSync. |

> Пример

```typescript
import { Provider } from "zksync-web3";

const provider = new Provider("https://zksync2-testnet.zksync.dev");

console.log(await provider.getMainContractAddress());
```

### Получение адреса testnet paymaster <a href="#getting-testnet-paymaster-address" id="getting-testnet-paymaster-address"></a>

В тестнетах zkSync можно воспользоваться услугой [testnet paymaster](https://v2-docs.zksync.io/dev/developer-guides/aa.html#paymasters).

```typescript
async getTestnetPaymasterAddress(): Promise<string|null>
```

#### Вводы и выводы

| Название | Описание                                               |
| -------- | ------------------------------------------------------ |
| returns  | Адрес testnet paymaster или `null`, если такового нет. |

> Пример

```typescript
import { Provider } from "zksync-web3";

const provider = new Provider("https://zksync2-testnet.zksync.dev");

console.log(await provider.getTestnetPaymasterAddress());
```

### Получение адресов перенесенных контрактов zkSync по умолчанию

```typescript
async getDefaultBridgeAddresses(): Promise<{
        ethL1?: Address;
        ethL2?: Address;
        erc20L1?: Address;
        erc20L2?: Address;
}>
```

#### Вводы и выводы

| Название | Описание                                                      |
| -------- | ------------------------------------------------------------- |
| returns  | Адреса перенесенных контрактов zkSync по умолчанию на L1 и L2 |

### `getConfirmedTokens` <a href="#getconfirmedtokens" id="getconfirmedtokens"></a>

Принимая `from` и `limit` , возвращает информацию (адрес, символ, название, количество знаков после запятой) о подтвержденных токенах с идентификаторами в интервале `[from..from+limit-1]`. Слово "подтвержденный" здесь является неверным, поскольку подтвержденный токен - это токен, который был перенесен с помощью моста zkSync по умолчанию. Этот метод будет использоваться в основном членами команды zkSync.&#x20;

Токены возвращаются в соответствии с их символом в алфавитном порядке, так что, по сути, идентификатор токена - это его позиция в отсортированном по алфавиту множестве токенов.

```typescript
async getConfirmedTokens(start: number = 0, limit: number = 255): Promise<Token[]>
```

#### Вводы и выводы

| Название | Описание                                                                                               |
| -------- | ------------------------------------------------------------------------------------------------------ |
| start    | Идентификатор токена, с которого начинается возвращение информации о токенах. По умолчанию равен нулю. |
| limit    | Количество токенов, возвращаемых из API. 255 по умолчанию.                                             |
| returns  | Множество объектов `Token`, отсортированных в соответствии с их символом.                              |

> Пример

```typescript
import { Provider } from "zksync-web3";
const provider = new Provider("https://zksync2-testnet.zksync.dev");

console.log(await provider.getConfirmedTokens());
```

### `getTokenPrice` <a href="#gettokenprice" id="gettokenprice"></a>

#### <mark style="color:yellow;background-color:yellow;">Устаревший</mark>

<mark style="background-color:yellow;">Этот метод устарел и скоро будет удален.</mark>

Возвращает цену в долларах США за токен. Обратите внимание, что это цена, которая используется командой zkSync и может немного отличаться от текущей рыночной цены. В тестнетах цены на токены могут сильно отличаться от реальной рыночной цены.

```typescript
async getTokenPrice(token: Address): Promise<string | null>
```

| Название | Описание                       |
| -------- | ------------------------------ |
| token    | Адрес токена.                  |
| returns  | `string` значение цены токена. |

> Пример

```typescript
import { Provider } from "zksync-web3";
const provider = new Provider("https://zksync2-testnet.zksync.dev");

console.log(await provider.getTokenPrice(USDC_L2_ADDRESS));
```

### Получение адреса токена на L2 из его адреса на L1 и наоборот

Адрес токена на L2 не будет таким же, как на L1. Адрес ETH установлен на нулевой адрес в обеих сетях.

Приведенные методы работают только для токенов, перенесенных с помощью моста zkSync по умолчанию.

```typescript
// принимает адрес L1, возвращает адрес L2
async l2TokenAddress(l1Token: Address): Promise<Address>
// принимает адрес L2, возвращает адрес L1
async l1TokenAddress(l2Token: Address): Promise<Address>
```

| Название | Описание                             |
| -------- | ------------------------------------ |
| token    | Адрес токена.                        |
| returns  | Адрес этого токена на другом уровне. |

### `getTransactionStatus` <a href="#gettransactionstatus" id="gettransactionstatus"></a>

Принимая хэш транзакции, возвращает ее статус.

```typescript
async getTransactionStatus(txHash: string): Promise<TransactionStatus>
```

| Название | Описание                                                                                                                         |
| -------- | -------------------------------------------------------------------------------------------------------------------------------- |
| token    | Адрес токена.                                                                                                                    |
| returns  | Статус транзакции. Описание перечня вариантов `TransactionStatus` можно найти в [типах](https://v2-docs.zksync.io/api/js/types). |

> Пример

```typescript
import { Provider } from "zksync-web3";
const provider = new Provider("https://zksync2-testnet.zksync.dev");

const TX_HASH = "0x95395d90a288b29801c77afbe359774d4fc76c08879b64708c239da8a65dbcf3";
console.log(await provider.getTransactionStatus(TX_HASH));
```

### `getTransaction` <a href="#gettransaction" id="gettransaction"></a>

Принимая хэш транзакции, возвращает ответный объект транзакции L2.

```typescript
async getTransaction(hash: string | Promise<string>): Promise<TransactionResponse>
```

| Название | Описание                                                                                |
| -------- | --------------------------------------------------------------------------------------- |
| token    | Адрес токена.                                                                           |
| returns  | Объект `TransactionResponse`, который позволяет легко отслеживать состояние транзакции. |

> Пример

```typescript
import { Provider } from "zksync-web3";
const provider = new Provider("https://zksync2-testnet.zksync.dev");

const TX_HASH = "0x95395d90a288b29801c77afbe359774d4fc76c08879b64708c239da8a65dbcf3";
const txHandle = await provider.getTransaction(TX_HASH);

// Подождите, пока транзакция обработается сервером.
await txHandle.wait();
// Подождите, пока транзакция будет завершена.
await txHandle.waitFinalize();
```

## `Web3Provider` <a href="#web3provider" id="web3provider"></a>

Класс, который следует использовать для интеграции браузерных web3-кошельков, адаптированный для легкой совместимости с Metamask, WalletConnect и другими популярными браузерными кошельками.

### Создание`Web3Provider` <a href="#creating-web3provider" id="creating-web3provider"></a>

Основное отличие от конструктора класса `Provider` заключается в том, что вместо URL ноды он принимает `ExternalProvider`.

```typescript
constructor(provider: ExternalProvider, network?: ethers.providers.Networkish)
```

#### Вводы и выводы

| Название              | Описание                                                                                                 |
| --------------------- | -------------------------------------------------------------------------------------------------------- |
| provider              | Инстанция класса `ethers.providers.ExternalProvider.` Например, в случае Metamask это `window.ethereum`. |
| network (опционально) | Описание сети.                                                                                           |
| returns               | Объект `Provider`.                                                                                       |

> Пример

```typescript
import { Web3Provider } from "zksync-web3";

const provider = new Web3Provider(window.ethereum);
```

### Получение подписи zkSync <a href="#getting-zksync-signer" id="getting-zksync-signer"></a>

Возвращает объект `Signer`, который можно использовать для подписания транзакций zkSync. Более подробную информацию о классе `Signer` можно найти в данном [разделе](https://v2-docs.zksync.io/api/js/accounts.html#signer).

#### Вводы и выводы

| Название | Описание                |
| -------- | ----------------------- |
| returns  | Объект класса `Signer`. |

> Пример

```typescript
import { Web3Provider } from "zksync-web3";

const provider = new Web3Provider(window.ethereum);
const signer = provider.getSigner();
```
