#blockchain #ton #the-open-network #cryptography

ton_lib

A collection of types and utilities for interacting with the TON network

17 releases

new 0.0.17 May 3, 2025
0.0.16 May 3, 2025
0.0.14 Apr 30, 2025
0.0.2 Mar 7, 2025
0.0.1 Feb 28, 2025

#22 in Magic Beans

Download history 74/week @ 2025-02-22 172/week @ 2025-03-01 42/week @ 2025-03-08 5/week @ 2025-03-15 95/week @ 2025-03-29 144/week @ 2025-04-05 289/week @ 2025-04-12 681/week @ 2025-04-19 508/week @ 2025-04-26

1,630 downloads per month

MIT/Apache

430KB
8K SLoC

TonLib

CI Crates.io codecov

This crate is heavily based on the tonlib-rs repository and also uses tonlib-sys underneath for the tonlibjson_client implementation.

Features

cell module

Build and read custom cells using TonCell, and serialize them to bytes using BOC:

fn main() -> anyhow::Result<()> {
    let mut builder = ton_lib::cell::build_parse::builder::CellBuilder::new();
    builder.write_bit(true)?;
    builder.write_bits([1, 2, 3], 24)?;
    builder.write_num(&42, 32)?;
    let cell = builder.build()?;
    let boc = BOC::new(cell);
    let boc_b64 = boc.to_b64()?;
}

types module

Contains 3 different layers:

  1. tlb:
    The TLBType trait allows you to implement serde for your objects automatically.
    It also includes a collection of predefined TLB types.
    (Apologies for the Dict implementation — it's still in progress.)

  2. client_types:
    Additional types for clients. (try don't use them!)

  3. The rest:
    High-level TON types such as TonAddress or Wallet.

#[derive(Debug, Clone, PartialEq, TLBDerive)]
#[tlb_derive(ensure_empty = true)]
pub struct StateInit {
    #[tlb_derive(bits_len = 5)]
    pub split_depth: Option<u8>,
    pub tick_tock: Option<TickTock>,
    pub code: Option<TonCellRef>,
    pub data: Option<TonCellRef>,
    #[tlb_derive(adapter = "TLBDict::<DictKeyAdapterTonHash, DictValAdapterTLB, _, _>::new(256)")]
    pub library: LibsDict,
}

fn main() {
    let boc_hex = "b5ee9c720102160100030400020134020100510000082f29a9a31738dd3a33f904d35e2f4f6f9af2d2f9c563c05faa6bb0b12648d5632083ea3f89400114ff00f4a413f4bcf2c80b03020120090404f8f28308d71820d31fd31fd31f02f823bbf264ed44d0d31fd31fd3fff404d15143baf2a15151baf2a205f901541064f910f2a3f80024a4c8cb1f5240cb1f5230cbff5210f400c9ed54f80f01d30721c0009f6c519320d74a96d307d402fb00e830e021c001e30021c002e30001c0039130e30d03a4c8cb1f12cb1fcbff08070605000af400c9ed54006c810108d718fa00d33f305224810108f459f2a782106473747270748018c8cb05cb025005cf165003fa0213cb6acb1f12cb3fc973fb000070810108d718fa00d33fc8542047810108f451f2a782106e6f746570748018c8cb05cb025006cf165004fa0214cb6a12cb1fcb3fc973fb0002006ed207fa00d4d422f90005c8ca0715cbffc9d077748018c8cb05cb0222cf165005fa0214cb6b12ccccc973fb00c84014810108f451f2a702020148130a0201200c0b0059bd242b6f6a2684080a06b90fa0218470d4080847a4937d29910ce6903e9ff9837812801b7810148987159f31840201200e0d0011b8c97ed44d0d70b1f8020158120f02012011100019af1df6a26840106b90eb858fc00019adce76a26840206b90eb85ffc0003db29dfb513420405035c87d010c00b23281f2fff274006040423d029be84c6002e6d001d0d3032171b0925f04e022d749c120925f04e002d31f218210706c7567bd22821064737472bdb0925f05e003fa403020fa4401c8ca07cbffc9d0ed44d0810140d721f404305c810108f40a6fa131b3925f07e005d33fc8258210706c7567ba923830e30d03821064737472ba925f06e30d1514008a5004810108f45930ed44d0810140d720c801cf16f400c9ed540172b08e23821064737472831eb17080185005cb055003cf1623fa0213cb6acb1fcb3fc98040fb00925f03e2007801fa00f40430f8276f2230500aa121bef2e0508210706c7567831eb17080185004cb0526cf1658fa0219f400cb6917cb1f5260cb3f20c98040fb0006";
    let state_init = StateInit::from_boc_hex(boc_hex).unwrap();
}


clients module

  • LiteClient:
    A "native" lite-node client that uses ADNL. More straightforward to use, but less flexible.

  • TLClient:
    A client based on the tonlibjson library from the TON monorepo (requires tonlib-sys).
    A bit tricky to use at times, but offers more features.
    Does not support smc methods - use MethodEmulator instead.

async fn main() -> anyhow::Result<()> {
    // LiteClient example
    let config = LiteClientConfig::new(&TON_NET_CONF_MAINNET)?;
    let lite_client = LiteClient::new(config)?;
    let mc_info = lite_client.get_mc_info().await?;
    let block_id = lite_client.lookup_mc_block(mc_info.last.seqno).await?;
    
    // TLClient example
    let config = TLClientConfig::new(TON_NET_CONF_MAINNET, archive_only);
    let tl_client = TLClientDefault::new(config).await?;
    let mc_info = tl_client.get_mc_info().await?;
    let block = tl_client.lookup_mc_block(mc_info.last.seqno - 100).await?;
}

emulators module

Dependencies

~21–52MB
~842K SLoC