C# .NET клиент для работы с TON API.
Поддерживаемые платформы: .NET 10.0+
English version | Русская версия
dotnet add package TonapiClient✅ Полное покрытие TON API v2 ✅ Типобезопасные модели для всех эндпоинтов ✅ Поддержка Dependency Injection и HttpClientFactory ✅ Retry логика и обработка ошибок ✅ Поддержка CancellationToken ✅ Асинхронное ожидание транзакций с exponential backoff ✅ Низкоуровневый доступ через LiteServer API ✅ Поддержка testnet и mainnet
Для запуска тестов необходимо создать конфигурационный файл:
- Скопируйте
src/TonapiClient.Tests/appsettings.example.jsonвsrc/TonapiClient.Tests/appsettings.json - Замените
YOUR_API_KEY_HEREна ваш API ключ от TON API - Для тестов рекомендуется использовать testnet API:
https://testnet.tonapi.io
{
"TonApiClient": {
"BaseUrl": "https://testnet.tonapi.io",
"ApiKey": "YOUR_API_KEY_HERE",
"TimeoutSeconds": 30
}
}Запуск тестов:
dotnet testПримечание: Файл appsettings.json включен в .gitignore и не должен коммититься в репозиторий.
using TonapiClient;
var client = new TonApiClient("https://tonapi.io", "your-api-key");
// Получить информацию о блокчейне
var masterchainHead = await client.Blockchain.GetMasterchainHeadAsync();
Console.WriteLine($"Last block: {masterchainHead.Last.Seqno}");
// Получить информацию об аккаунте
var account = await client.Account.GetAsync("EQD...address");
Console.WriteLine($"Balance: {account.Balance}");
// Получить транзакции аккаунта
var transactions = await client.Account.GetTransactionsAsync("EQD...address", limit: 10);
foreach (var tx in transactions.Transactions)
{
Console.WriteLine($"TX: {tx.Hash}");
}
// Получить информацию о Jetton
var jetton = await client.Jetton.GetAsync("EQD...jetton-address");
Console.WriteLine($"Jetton: {jetton.Metadata.Name}");
// Получить NFT коллекцию
var nft = await client.Nft.GetCollectionAsync("EQD...collection-address");
Console.WriteLine($"NFT Collection: {nft.Metadata.Name}");Клиент использует HttpClientFactory для управления HTTP-соединениями и поддерживает полную интеграцию с DI:
using Microsoft.Extensions.DependencyInjection;
using TonapiClient;
var services = new ServiceCollection();
// Из конфигурации (appsettings.json)
services.AddTonApiClient(configuration);
// Или с явными параметрами
services.AddTonApiClient(options =>
{
options.BaseUrl = "https://tonapi.io";
options.ApiKey = "your-api-key";
options.TimeoutSeconds = 30;
});
var serviceProvider = services.BuildServiceProvider();
var client = serviceProvider.GetRequiredService<TonApiClient>();
// Используйте client...В ASP.NET Core добавьте в Program.cs:
builder.Services.AddTonApiClient(builder.Configuration);И в appsettings.json:
{
"TonApiClient": {
"BaseUrl": "https://tonapi.io",
"ApiKey": "your-api-key",
"TimeoutSeconds": 30
}
}Клиент построен на основе категорий (categories), каждая из которых инкапсулирует логику работы с определённой областью TON API:
- 🔗 CategoryBase - базовый класс для всех категорий с общими HTTP-методами
- 📦 TonApiClient - главный фасад, предоставляющий доступ ко всем категориям через свойства
- 🔌 HttpClientFactory - используется для эффективного управления HTTP-соединениями
- ⚙️ IOptions - конфигурация через стандартный механизм .NET
Все категории доступны как свойства клиента: client.Blockchain, client.Account, client.Jetton и т.д.
Клиент организован по категориям для удобства использования:
GetBlockAsync()- Получить данные блокаGetReducedBlocksAsync()- Получить сокращённые данные блоков в диапазоне времениGetMasterchainShardsAsync()- Получить шарды блока masterchainGetMasterchainHeadAsync()- Получить последний блок masterchainGetMasterchainBlocksAsync()- Получить блоки между masterchain блокамиGetMasterchainTransactionsAsync()- Получить транзакции между masterchain блокамиGetBlockTransactionsAsync()- Получить транзакции конкретного блокаGetConfigAsync()- Получить конфигурацию блокчейна по seqnoGetCurrentConfigAsync()- Получить текущую конфигурацию блокчейнаGetRawConfigAsync()- Получить raw конфигурацию блокчейнаGetTransactionAsync()- Получить транзакцию по хешуGetTransactionByMessageHashAsync()- Получить транзакцию по хешу сообщенияSendBocAsync()- Отправить BOC сообщениеWaitForTransactionAsync()- Ждать появления транзакции с exponential backoffGetValidatorsAsync()- Получить список валидаторовGetAccountAsync()- Получить raw данные аккаунтаGetAccountTransactionsAsync()- Получить транзакции аккаунтаExecuteGetMethodAsync()- Выполнить GET-метод на аккаунтеExecuteMethodAsync()- Выполнить POST-метод на аккаунтеInspectAccountAsync()- Инспектировать аккаунт
GetAsync()- Получить информацию об аккаунтеGetTonBalanceAsync()- Получить TON баланс аккаунтаGetBulkAsync()- Получить информацию о нескольких аккаунтахGetTransactionsAsync()- Получить транзакции аккаунтаGetEventsAsync()- Получить события аккаунтаGetEventByIdAsync()- Получить конкретное событие по IDGetTracesAsync()- Получить трейсы аккаунта (lightweight идентификаторы)GetJettonsAsync()- Получить Jetton балансы аккаунтаGetJettonBalanceAsync()- Получить баланс конкретного Jetton по адресу masterGetJettonBalance()- Получить баланс Jetton по имени или адресуGetJettonsHistoryAsync()- Получить историю Jetton переводовGetNftsAsync()- Получить NFT аккаунтаGetNftsHistoryAsync()- Получить историю NFT переводовGetDnsBackresolveAsync()- Получить доменные имена аккаунта через DNS backresolveGetSubscriptionsAsync()- Получить подписки аккаунтаGetPublicKeyAsync()- Получить публичный ключ аккаунтаGetDiffAsync()- Получить изменение баланса между двумя метками времениExecuteGetMethodAsync()- Выполнить GET-метод смарт-контрактаInspectAsync()- Инспектировать контракт аккаунтаWaitForTransactionAsync()- Ждать появления транзакции с exponential backoff
GetAsync()- Получить информацию о JettonGetAllAsync()- Получить список всех JettonsGetBulkAsync()- Получить метаданные нескольких Jettons по адресамGetHoldersAsync()- Получить держателей JettonGetEventJettonsAsync()- Получить событие с информацией о Jetton трансфереGetJettonWalletAddressAsync()- Получить адрес Jetton кошелька пользователя
GetItemAsync()- Получить NFT по адресуGetItemsBulkAsync()- Получить несколько NFT по адресамGetItemHistoryAsync()- Получить историю NFTGetCollectionAsync()- Получить коллекцию NFTGetCollectionsAsync()- Получить список коллекцийGetCollectionsBulkAsync()- Получить несколько коллекций по адресамGetCollectionItemsAsync()- Получить NFT из коллекции
GetRecordAsync()- Получить DNS записьResolveAsync()- Разрешить доменное имяGetAuctionsAsync()- Получить аукционы DNSGetBidsAsync()- Получить ставки для домена
GetPoolsAsync()- Получить список пулов стейкингаGetPoolAsync()- Получить информацию о пулеGetAccountInfoAsync()- Получить информацию о стейкинге аккаунта
GetAsync()- Получить текущие курсы токеновGetChartAsync()- Получить исторические данные курсовGetMarketsAsync()- Получить курсы TON с разных бирж
GetAsync()- Получить трейс по IDWaitForAsync()- Ждать завершения трейсаEmulateAsync()- Эмулировать сообщение и получить трейс
GetAsync()- Получить информацию о кошелькеGetSeqnoAsync()- Получить seqno кошелькаGetWalletsByPublicKeyAsync()- Получить кошельки по публичному ключуEmulateAsync()- Эмулировать отправку сообщения
GetConfigAsync()- Получить конфигурацию gaslessEstimateAsync()- Оценить комиссию gasless транзакцииSendAsync()- Отправить gasless транзакцию
GetAsync()- Получить событие по IDWaitForAsync()- Ждать завершения события
GetMasterchainInfoAsync()- Получить информацию о masterchainGetMasterchainInfoExtAsync()- Получить расширенную информацию о masterchainGetTimeAsync()- Получить время блокчейнаGetBlockAsync()- Получить raw блок по IDGetBlockHeaderAsync()- Получить заголовок raw блокаGetAccountStateAsync()- Получить raw состояние аккаунтаGetShardInfoAsync()- Получить информацию о shardGetAllShardsInfoAsync()- Получить информацию о всех shardsGetTransactionsAsync()- Получить raw транзакции аккаунтаGetListBlockTransactionsAsync()- Получить список транзакций из блокаSendMessageAsync()- Отправить raw сообщение в блокчейнGetBlockProofAsync()- Получить raw block proofGetShardBlockProofAsync()- Получить raw shard block proofGetConfigAsync()- Получить raw конфигурационные параметрыGetOutMsgQueueSizesAsync()- Получить размеры очередей исходящих сообщений
GetProvidersAsync()- Получить список провайдеров хранилища
GetAccountAsync()- Получить информацию о multisig аккаунтеGetOrdersAsync()- Получить ордера (предложения) multisig
DecodeMessageAsync()- Декодировать сообщение
// Build and sign transaction (using TonSdk.NET)
var keys = Mnemonic.ToWalletKey(mnemonic.Split(" "));
var wallet = WalletV5R1.Create(0, keys.PublicKey, false);
var seqno = (await client.Wallet.GetSeqnoAsync(wallet.Address.ToString())).SeqnoValue;
var message = new MessageRelaxed(...); // Create your message
Cell unsignedTransfer = WalletV5R1Utils.CreateUnsignedTransfer(
wallet.WalletId, seqno, [message], SendMode.SendPayFwdFeesSeparately);
Cell transfer = WalletV5R1Utils.SignAndPack(unsignedTransfer, keys.SecretKey);
// Create external message
var externalMsg = new Message(
new CommonMessageInfo.ExternalIn(null, wallet.Address, BigInteger.Zero),
transfer,
seqno > 0 ? null : wallet.Init);
// Calculate message hash locally
var messageHash = WalletV5R1Utils.NormalizeHash(externalMsg).ToHex();
// Serialize to BOC
var boc = Convert.ToBase64String(Builder.BeginCell().StoreMessage(externalMsg).EndCell().ToBoc());
// Emulate before sending (optional)
var consequences = await Client.Traces.EmulateAsync(bocAsString);
Console.WriteLine($"Estimated fee: {consequences.GetTotalFees()}");
// Send transaction
await client.Blockchain.SendBocAsync(boc: boc);
// Wait for transaction
var tx = await client.Blockchain.WaitForTransactionAsync(
wallet.Address.ToString(),
messageHash,
maxWaitTime: 60);
if (tx != null && tx.Success)
{
Console.WriteLine($"Transaction confirmed: {tx.Hash}");
}// Получить адрес Jetton кошелька пользователя
var jettonWalletAddress = await client.GetJettonWalletAddressAsync(
jettonMasterAddress,
userAddress);
// Получить информацию о Jetton
var jetton = await client.Jetton.GetAsync(jettonMasterAddress);
Console.WriteLine($"{jetton.Metadata.Name} ({jetton.Metadata.Symbol})");
// Получить держателей
var holders = await client.Jetton.GetHoldersAsync(jettonMasterAddress, limit: 100);
Console.WriteLine($"Total holders: {holders.Total}");// Получить NFT коллекцию
var collection = await client.Nft.GetCollectionAsync(collectionAddress);
Console.WriteLine($"Collection: {collection.Metadata.Name}");
// Получить NFT из коллекции
var items = await client.Nft.GetCollectionItemsAsync(collectionAddress, limit: 10);
foreach (var item in items.NftItems)
{
Console.WriteLine($"NFT: {item.Metadata.Name}");
}
// Получить историю NFT
var history = await client.Nft.GetItemHistoryAsync(nftAddress);
foreach (var event in history.Events)
{
Console.WriteLine($"Event: {event.EventId}");
}// Инспектировать аккаунт для получения списка доступных методов
var inspection = await client.Blockchain.InspectAccountAsync(contractAddress);
foreach (var method in inspection.Methods)
{
Console.WriteLine($"Method: {method.Name}");
}
// Выполнить GET-метод (параметры в query string)
var result = await client.Blockchain.ExecuteGetMethodAsync(
contractAddress,
"get_wallet_address",
new List<string> { "0:..." });
// Выполнить POST-метод (параметры в теле запроса)
var postResult = await client.Blockchain.ExecuteMethodAsync(
contractAddress,
"get_wallet_address",
new List<MethodArg>
{
new() { Type = "slice", Value = "b5ee9c72..." }
});
Console.WriteLine($"Success: {postResult.Success}");// Получить информацию о masterchain
var info = await client.LiteServer.GetMasterchainInfoAsync();
Console.WriteLine($"Last block seqno: {info.Last.Seqno}");
// Получить время блокчейна
var time = await client.LiteServer.GetTimeAsync();
Console.WriteLine($"Blockchain time: {DateTimeOffset.FromUnixTimeSeconds(time.Time)}");
// Получить raw блок
var blockId = $"({info.Last.Workchain},{info.Last.Shard},{info.Last.Seqno},{info.Last.RootHash},{info.Last.FileHash})";
var block = await client.LiteServer.GetBlockAsync(blockId);
Console.WriteLine($"Block data length: {block.Data.Length}");
// Получить raw состояние аккаунта
var accountState = await client.LiteServer.GetAccountStateAsync(
"0:...",
targetBlock: blockId);
Console.WriteLine($"Account balance: {accountState.Balance}");
// Получить raw транзакции
var rawTxs = await client.LiteServer.GetTransactionsAsync(
"0:...",
count: 10);
Console.WriteLine($"Transactions: {rawTxs.Transactions.Count}");TonapiClient/
├── src/
│ ├── TonapiClient/ # Основная библиотека
│ │ ├── Categories/ # API категории
│ │ │ ├── AccountCategory.cs
│ │ │ ├── BlockchainCategory.cs
│ │ │ ├── JettonCategory.cs
│ │ │ ├── NftCategory.cs
│ │ │ ├── LiteServerCategory.cs
│ │ │ └── ...
│ │ ├── Models/ # Модели данных
│ │ ├── TonApiClient.cs # Главный класс клиента
│ │ ├── TonApiClientOptions.cs # Опции конфигурации
│ │ └── TonApiException.cs # Исключения
│ └── TonapiClient.Tests/ # Интеграционные тесты
│ ├── AccountCategoryTests.cs
│ ├── BlockchainCategoryTests.cs
│ ├── LiteServerCategoryTests.cs
│ └── ...
├── .github/
│ └── workflows/
│ └── ci-cd.yml # CI/CD конфигурация
└── README.md
- .NET 10.0 SDK
- API ключ от TON API (для тестов)
Contributions are welcome! Please feel free to submit a Pull Request.
UQAN9eHzTT6ntU0LSIcqwLJz9GdzeUAOjeXr0x8_XWO0W9S5
MIT