# everscale-asm   [![crates-io-batch]][crates-io-link] [![docs-badge]][docs-url] [![rust-version-badge]][rust-version-link] [![workflow-badge]][workflow-link] [crates-io-batch]: https://img.shields.io/crates/v/everscale-asm.svg [crates-io-link]: https://crates.io/crates/everscale-asm [docs-badge]: https://docs.rs/everscale-asm/badge.svg [docs-url]: https://docs.rs/everscale-asm [rust-version-badge]: https://img.shields.io/badge/rustc-1.70+-lightgray.svg [rust-version-link]: https://blog.rust-lang.org/2023/06/01/Rust-1.70.0.html [workflow-badge]: https://img.shields.io/github/actions/workflow/status/broxus/everscale-asm/master.yaml?branch=master [workflow-link]: https://github.com/broxus/everscale-asm/actions?query=workflow%3Amaster > Status: WIP ## About Rust implementation of TVM Assembler. ## LSP Server/Client - Install [TVM Assembler](https://marketplace.visualstudio.com/items?itemName=Rexagon.tvmasm-lsp) VSCode extension - Install CLI ```bash cargo install --locked tvmasm ``` ## How to use ### Building a contract using CLI ```bash tvmasm build ./src/tests/walletv3.tvm -o walletv3.boc ``` Output: ``` Code path: walletv3.boc Code hash: 84dafa449f98a6987789ba232358072bc0f76dc4524002a5d0918b9a75d2d599 Unique cells: 1 Unique bits: 888 ``` ### Building a contract from Rust Runtime: ```rust use everscale_asm::Code; use everscale_types::prelude::Cell; let code: Cell = Code::assemble(r#" PUSHINT 1 SWAP DUP PUSHCONT { TUCK MUL SWAP DEC } REPEAT DROP "#)?; ``` Compile time: ```rust use everscale_asm_macros::tvmasm; use everscale_types::prelude::{Boc, Cell}; const CODE: &[u8] = tvmasm!( "PUSHINT 1", "PUSHCONT { INC PUSHINT 10 LESS }", "PUSHCONT { DUMPSTK }", "WHILE", ); let code: Cell = Boc::decode(CODE)?; ``` ## Syntax ``` // Single-line comments // Opcodes must be in uppercase, can start with a digit or minus, // and can contain '#' or '_' NOP 2DROP -ROT STREF_L // Opcodes with number as an argument PUSHINT 12 PUSHINT -0xded PUSHINT 0b10110101 // Opcodes with stack register as an argument PUSH s1 XCHG s10, s100 PU2XC s1, s(-1), s(-2) // Opcodes with control registers (c0, .., c5, c7) PUSH c3 PUSHCTR c7 // Opcodes with slice or continuation PUSHSLICE x{123123_} PUSHSLICE b{10001001} IFREFELSEREF { PUSHINT 1 }, { PUSHINT 2 } // Insert raw slices into code @inline x{a924} ``` [Full opcodes list](https://test.ton.org/tvm.pdf) ## Contributing We welcome contributions to the project! If you notice any issues or errors, feel free to open an issue or submit a pull request. ## License Licensed under either of * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or ) * MIT license ([LICENSE-MIT](LICENSE-MIT) or ) at your option.