Skip to content
On this page

Expressions and Statements

Contract creation

Like creating a new object in regular object-oriented language, a contract can be created by another contract using new keyword. For example, the following statement creates a contract of type C:

scif
C newContract = new C(args);

The full code of the contract being created must be provided during compile time to get rid of loop creation-dependencies.

Unary expressions

The following unary operators are provided in SCIF: ! for logical negation; ~ for bitwise negation; - for integer negation.

Unary operators have the highest precedence when evaluating expressions.

Binary expressions

Binary operators provided in SCIF for booleans, bytes and integers are like in Java: &, |, for bitewise and and or; <<, >> for bitwise left shift and right shift; &&, || for logical and and or; ==, != for logical equality and inequality. +, -, *, /, and % for integer addition, subtraction, multiplication, division and modulo operation.

address type and contracts can also be compared using == and !=.

Method calls

Method calls in SCIF contains internal method calls and external method calls.

Internal method calls

Methods within the same contract can be called using their names. For example,

scif
contract C {
    @private 
    uint f(uint i) {
        return i + 1;
    }

    @public
    uint g() {
        return f(10);
    }
}

In method g above, method f is called internally.

Internal method calls are compiled into simple jumps inside the EVM. So they are much more efficient than external method calls.

Extrernal method calls

scif
contract D {
    C c;
    @private
    uint h() {
        return c.g() + 10;
    }
}

In contract D, c's public method g is called by specifying the contract c where the method belongs to. This is an external method call, and a new sub-transaction is created when doing so.

A contract can also call its own public methods externally by using expressions like this.h().

Assignments

Variables can be assigned values using assignment operator =.

Control structures

The following contrcol structure keywords are supported in SCIF: if, else, while, for, break, continue, and return. They carry similar semantics from Java.

SCIF also supports exception handling by providing try/catch statements.

Scoping and declarations

Scoping in SCIF is similar to in Java. Variables are visible from the point after their declaration until the end of the smallest scope block (usually a {} block) that contains the declaration.

Extrenal contracts can be imported by keyword import. For example, the following code imports a new contract ContractD from the specified source file.

scif
import ContractD from "./ContractD.scif";

Variables have initial default values: false for a bool; 0 for integers and bytes;

Exceptions

Exception types are declared at contract level and can be thrown and caught by throw and try/catch statements. Any uncaught exceptions in a method must be specified in the signature of the method.