An open API service indexing awesome lists of open source software.

https://github.com/broxus/everscale-asm

Rust implementation of TVM Assembler
https://github.com/broxus/everscale-asm

blockchain everscale tvm venom-blockchain venom-developer-program vm

Last synced: 6 months ago
JSON representation

Rust implementation of TVM Assembler

Awesome Lists containing this project

README

        

# 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.