13 releases (2 stable)

2.0.0 Nov 13, 2024
1.0.0 Jan 9, 2024
0.11.0 Jan 9, 2024
0.10.0 Dec 25, 2023

#79 in #contract

Download history 358/week @ 2024-09-25 381/week @ 2024-10-02 565/week @ 2024-10-09 321/week @ 2024-10-16 471/week @ 2024-10-23 400/week @ 2024-10-30 373/week @ 2024-11-06 822/week @ 2024-11-13 762/week @ 2024-11-20 600/week @ 2024-11-27 1015/week @ 2024-12-04 1121/week @ 2024-12-11 1069/week @ 2024-12-18 208/week @ 2024-12-25 553/week @ 2025-01-01 869/week @ 2025-01-08

2,878 downloads per month
Used in zilliqa-rs

MIT license

240KB
4.5K SLoC

Rust 3.5K SLoC // 0.0% comments LALRPOP 1K SLoC // 0.4% comments

Scilla Parser

This repository contains a Rust parser for the Scilla smart contract language. Scilla is the smart contract language used in the Zilliqa blockchain.

Install

Add the following to your Cargo.toml:

[dependencies]
scilla_parser = "1.0.0"

Alternatively, You can run this command:

cargo add scilla_parser

This will add the scilla_parser dependency to Cargo.toml as specified in the installation instructions above.

Usage

This library parses a .scilla file. There are two options:

  1. Use Contract::parse and pass a contract path.
  2. Parse a string (slice) containing a scilla contract.

To parse a Scilla file:

Here is the code to parse SendZil.scilla contract:

    let contract_path = PathBuf::from("tests/contracts/SendZil.scilla");
    let contract = Contract::parse(&contract_path).unwrap();

    assert_eq!(
        contract,
        Contract {
            name: "SendZil".to_string(),
            init_params: FieldList::default(),
            fields: FieldList(vec![
                Field::new("test_field", Type::Uint256),
                Field::new("bool", Type::Bool),
                Field::new("empty_bool", Type::Option(Box::new(Type::Bool))),
                Field::new("some_int", Type::Option(Box::new(Type::Int32))),
                Field::new(
                    "pair",
                    Type::Pair(Box::new(Type::String), Box::new(Type::Uint32))
                ),
                Field::new("list", Type::List(Box::new(Type::Int32))),
            ]),
            transitions: TransitionList(vec![
                Transition::new_without_param("acceptZil"),
                Transition::new(
                    "updateTestField",
                    FieldList(vec![Field::new("val", Type::Uint256)])
                ),
                Transition::new_without_param("dontAcceptZil"),
                Transition::new(
                    "fundUserWithTag",
                    FieldList(vec![
                        Field::new("user", Type::ByStr20),
                        Field::new("amount", Type::Uint128)
                    ])
                ),
                Transition::new(
                    "fundUser",
                    FieldList(vec![
                        Field::new("user", Type::ByStr20),
                        Field::new("amount", Type::Uint128)
                    ])
                ),
                Transition::new(
                    "fundContract",
                    FieldList(vec![
                        Field::new("contract_address", Type::ByStr20),
                        Field::new("amount", Type::Uint128)
                    ])
                ),
                Transition::new(
                    "callOtherContract",
                    FieldList(vec![
                        Field::new("contract_address", Type::ByStr20),
                        Field::new("tag", Type::String),
                        Field::new("value", Type::Uint256)
                    ])
                ),
            ])
        }
    );

To parse a string containing a scilla contract:

    let contract_code: &str = "contract HelloWorld";
    let contract: Contract = contract_code.parse().unwrap();

For more examples, take a look at the tests.

Dependencies

~2.5–5.5MB
~89K SLoC