Smart contracts, safe by default.
Symvasi is a contract language for SUM-Chain. It compiles to WASM, enforces safety at the compiler level, and reads like pseudocode. No lifetimes. No footguns. Just contracts.
cargo install --path crates/symvasi-cli1contract Counter {2 pub storage count: u643 storage owner: Address45 event Incremented { by: Address, new_value: u64 }67 @init8 fn deploy() {9 self.owner = caller()10 self.count = 011 }1213 @call14 pub fn increment() {15 self.count += 116 emit Incremented { by: caller(), new_value: self.count }17 }1819 @view20 pub fn get() -> u64 { self.count }21}Why Symvasi?
Every design decision serves one goal: contracts that are correct, readable, and auditable.
Safety First
Checked arithmetic, no overflow surprises. Every footgun from other contract languages is a compiler error in Symvasi.
Explicit Over Implicit
Visibility, mutability, and error handling are always stated, never assumed. No hidden defaults or gotchas.
Compiles to WASM
Targets SUM-Chain via WebAssembly. Fast execution, small binary sizes, and deterministic behavior.
Built-in Toolchain
One tool does it all: sym build, sym check, sym fmt, sym test. No ecosystem fragmentation.
Static Analysis
The compiler catches reentrancy risks, storage mutation in views, missing visibility, and more — before deployment.
Accessible Design
No lifetimes, no raw pointers, no manual memory management. If you can read pseudocode, you can write Symvasi.
What the compiler catches for you
These are real bugs that have cost millions in other smart contract languages. In Symvasi, they are compile-time errors.
@viewpub fn get() -> u64 { self.count = 5 // error: cannot mutate self.count // storage inside @view}Storage mutation in read-only functions is impossible.
@callpub fn withdraw(amount: Balance) { send(caller(), amount)? self.balance -= amount // warn: CEI} // storage write after send()Reentrancy vulnerabilities are flagged automatically.
pub fn _helper() -> bool { // error: pub on _-prefixed // function is not allowed true}Visibility rules are enforced — no accidental exposure.
let x: u8 = 255x + 1 // revert: ArithmeticOverflowlet y = 10 / 0 // revert: DivisionByZeroAll arithmetic is checked. No silent overflow, ever.
Ready to write contracts?
Follow the step-by-step tutorial to write and compile your first Symvasi contract in minutes.
Start Learning →