Перейти к содержимому
Последнее обновление

Storage client

npm-пакет @vilna-io/storage-client подключает веб-приложения к браузерному расширению Vilna Storage для операций с кошельком: запросы сетей, валидация адресов и подписание транзакций.

  • Пакет: @vilna-io/storage-client
  • Лицензия: MIT
  • Среда: Только браузер (требуется window)

Установка

npm install @vilna-io/storage-client

Быстрый старт

import { connect } from "@vilna-io/storage-client";

const client = await connect();

const networks = await client.getSupportedNetworks();
// ['eip155:1', 'eip155:56', 'tron:728126428', ...]

Функция connect() создает клиент, обнаруживает расширение и возвращает готовый к использованию экземпляр. Если расширение не установлено, выбрасывается VilnaStorageNotFoundError.

Основные методы

МетодВозвращаетОписание
connect()Promise<VilnaStorageClient>Создать и подключить клиент за один шаг
client.getSupportedNetworks()Promise<string[]>Список поддерживаемых идентификаторов сетей в формате CAIP-2
client.isAvailableAddress(params)Promise<boolean>Проверить, существует ли адрес в кошельке
client.sendTransaction(params)Promise<{ transactionId: string }>Открыть всплывающее окно расширения для подписания
client.isConnected()booleanПроверить статус подключения
client.on(event, handler)thisПодписаться на события расширения
client.removeListener(event, handler)thisОтписаться от событий
client.disconnect()voidОтключиться и освободить ресурсы

Проверка доступности адреса

const isAvailable = await client.isAvailableAddress({
  address: "0x742d35Cc6634C0532925a3b844Bc9e7595f7B123",
  derivationPath: "m/44'/60'/0'/0/0",
});

if (isAvailable) {
  // Адрес существует в подключенном кошельке
}

Отправка транзакций

Метод sendTransaction открывает всплывающее окно расширения, в котором пользователь просматривает и подтверждает транзакцию.

EVM-транзакция

const result = await client.sendTransaction({
  chainId: "eip155:1",
  address: "0x742d35Cc6634C0532925a3b844Bc9e7595f7B123",
  derivationPath: "m/44'/60'/0'/0/0",
  transaction: {
    to: "0xRecipientAddress",
    value: "1000000000000000000", // 1 ETH в Wei
    tokenType: "native",
  },
});

console.log("Transaction ID:", result.transactionId);

Перевод EVM-токена

const result = await client.sendTransaction({
  chainId: "eip155:1",
  address: "0x742d35Cc6634C0532925a3b844Bc9e7595f7B123",
  derivationPath: "m/44'/60'/0'/0/0",
  transaction: {
    tokenType: "usdt",
    tokenAddress: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
    tokenAmount: "1000000", // 1 USDT (6 десятичных знаков)
    to: "0xRecipientAddress",
  },
});

TRON-транзакция

const result = await client.sendTransaction({
  chainId: "tron:728126428",
  address: "TLyqzVGLV1srkB7dToTAEqgDSfPtXRJZYH",
  derivationPath: "m/44'/195'/0'/0/0",
  transaction: {
    to_address: "TRecipientAddress",
    amount: 1000000, // 1 TRX в Sun
    tokenType: "native",
  },
});

Обработка событий

client.on("accountsChanged", (accounts) => {
  console.log("Accounts changed:", accounts);
});

client.on("chainChanged", (chainId) => {
  console.log("Chain changed:", chainId);
});

Поддерживаемые сети

СетьChain ID
Ethereum Mainneteip155:1
Ethereum Sepoliaeip155:11155111
BNB Smart Chaineip155:56
BNB Testneteip155:97
TRON Mainnettron:728126428
TRON Shastatron:2494104990

Вызовите client.getSupportedNetworks() во время выполнения для получения актуального списка.

Утилиты

Пакет экспортирует несколько пространств имен с утилитами для типичных задач валидации:

import { validationUtils, envUtils } from "@vilna-io/storage-client";

// Валидация идентификатора сети CAIP-2
validationUtils.isValidChainId("eip155:1"); // true

// Валидация форматов адресов
validationUtils.isValidEthereumAddress("0x742d35Cc6634C0532925a3b844Bc9e7595f7B123"); // true
validationUtils.isValidTronAddress("TLyqzVGLV1srkB7dToTAEqgDSfPtXRJZYH"); // true

// Валидация пути деривации BIP-32
validationUtils.isValidDerivationPath("m/44'/60'/0'/0/0"); // true

// Проверка запуска в браузере
envUtils.isBrowser(); // true/false

// Проверка установки расширения
envUtils.isVilnaStorageAvailable(); // true/false

// Ожидание загрузки расширения (с таймаутом)
await envUtils.waitForVilnaStorage(5000);

Обработка ошибок

Пакет определяет три класса ошибок:

ОшибкаКодКогда возникает
VilnaStorageNotFoundErrorEXTENSION_NOT_FOUNDРасширение не установлено
VilnaStorageConnectionErrorCONNECTION_ERRORРасширение обнаружено, но подключение не удалось
VilnaStorageErrorразличныеБазовый класс для всех ошибок storage
import {
  connect,
  VilnaStorageNotFoundError,
  VilnaStorageConnectionError,
} from "@vilna-io/storage-client";

try {
  const client = await connect();
} catch (err) {
  if (err instanceof VilnaStorageNotFoundError) {
    // Предложить пользователю установить расширение
  } else if (err instanceof VilnaStorageConnectionError) {
    // Расширение найдено, но не отвечает
  }
}

Дополнительные материалы