Skip to main content

Leo Operators Reference

The following is a list of operators supported by Leo. The Leo operators compile down to Aleo instructions opcodes executable by the Aleo Virtual Machine (AVM).

Table of Operators

NameDescription
absAbsolute value operation
abs_wrappedWrapping absolute value operation
addAddition operation
add_wrappedWrapping addition operation
andAND operation
assert_eqAssert equality
assert_neqAssert non-equality
BHP256::commit256-bit input BHP commitment
BHP512::commit512-bit input BHP commitment
BHP768::commit768-bit input BHP commitment
BHP1024::commit1024-bit input BHP commitment
Pedersen64::commit64-bit input Pedersen commitment
Pedersen128::commit128-bit input Pedersen commitment
divDivision operation
div_wrappedWrapping division operation
doubleDouble operation
gtGreater than comparison
gteGreater than or equal to comparison
BHP256::hash256-bit input BHP hash
BHP512::hash512-bit input BHP hash
BHP768::hash768-bit input BHP hash
BHP1024::hash1024-bit input BHP hash
Pedersen64::hash64-bit input Pedersen hash
Pedersen128::hash128-bit input Pedersen hash
Poseidon2::hashPoseidon hash with input rate 2
Poseidon4::hashPoseidon hash with input rate 4
Poseidon8::hashPoseidon hash with input rate 8
invMultiplicative inverse operation
eqEquality comparison
neqNot equal comparison
ltLess than comparison
lteLess than or equal to comparison
modArithmetic modulo operation
mulMultiplication operation
mul_wrappedWrapping multiplication operation
nandBoolean NAND operation
negAdditive inverse operation
norBoolean NOR operation
notNOT operation
orOR Operation
powExponentiation operation
pow_wrappedWrapping exponentiation operation
remRemainder operation
rem_wrappedWrapping remainder operation
shlShift left operation
shl_wrappedWrapping shift left operation
shrShift right operation
shr_wrappedWrapping shift right operation
square_rootSquare root operation
squareSquare operation
subSubtraction operation
sub_wrappedWrapping subtraction operation
ternaryTernary select operation
xorXOR operation

Specification

The following is the specification for each opcode in the Aleo Virtual Machine (AVM).

abs

let a: i8 = -1i8;
let b: i8 = a.abs(); // 1i8

Description

Computes the absolute value of the input, checking for overflow, storing the result in the destination.

For integer types, a constraint is added to check for underflow. For cases where wrapping semantics are needed, see the abs_wrapped instruction. This underflow happens when the input is the minimum value of a signed integer type. For example, abs -128i8 would result in underflow, since 128 cannot be represented as an i8.

Supported Types

InputDestination
I8I8
I16I16
I32I32
I64I64
I128I128
<!--U8
<!--U16
<!--U32
<!--U64
<!--U128

Back to Top


abs_wrapped

let a: i8 = -128i8;
let b: i8 = a.abs_wrapped(); // -128i8

Description

Compute the absolute value of the input, wrapping around at the boundary of the type, and storing the result in the destination.

Supported Types

InputDestination
I8I8
I16I16
I32I32
I64I64
I128I128
<!--U8
<!--U16
<!--U32
<!--U64
<!--U128

Back to Top


add

let a: u8 = 1u8;
let b: u8 = a + 1u8; // 2u8
let c: u8 = b.add(1u8); // 3u8

Description

Adds first with second, storing the outcome in destination.

For integer types, a constraint is added to check for overflow. For cases where wrapping semantics are needed for integer types, see the add_wrapped instruction.

Supported Types

FirstSecondDestination
FieldFieldField
GroupGroupGroup
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128
ScalarScalarScalar

Back to Top


add_wrapped

let a: u8 = 255u8;
let b: u8 = a.add_wrapped(1u8); // 0u8

Description

Adds first with second, wrapping around at the boundary of the type, and storing the outcome in destination.

Supported Types

FirstSecondDestination
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128

Back to Top


and

let a: i8 = 1i8 & 1i8; // 1i8
let b: i8 = 1i8.and(2i8); // 0i8

Description

Performs an AND operation on integer (bitwise) or boolean first and second, storing the outcome in destination.

Supported Types

FirstSecondDestination
BooleanBooleanBoolean
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128

Back to Top


assert_eq

let a: u8 = 1u8;
let b: u8 = 2u8;

console.assert_eq(a, a); // will not halt
console.assert_eq(a, b); // program halts

Description

Checks whether first and second are equal, halting if they are not equal.

Supported Types

FirstSecond
AddressAddress
BooleanBoolean
FieldField
GroupGroup
I8I8
I16I16
I32I32
I64I64
I128I128
U8U8
U16U16
U32U32
U64U64
U128U128
ScalarScalar
InterfaceInterface
RecordRecord

Back to Top


assert_neq

let a: u8 = 1u8;
let b: u8 = 2u8;

console.assert_neq(a, b); // will not halt
console.assert_neq(a, a); // program halts

Description

Checks whether first and second are not equal, halting if they are equal.

Supported Types

FirstSecond
AddressAddress
BooleanBoolean
FieldField
GroupGroup
I8I8
I16I16
I32I32
I64I64
I128I128
U8U8
U16U16
U32U32
U64U64
U128U128
ScalarScalar
InterfaceInterface
RecordRecord

Back to Top


BHP256::commit

let a: i128 = 1i128;
let b: field = BHP256::commit(a, 1scalar);

Description

Computes a BHP commitment on inputs of 256-bit chunks in first, and some randomness in second, storing the commitment in destination. Randomness should always be a Scalar value, and the produced commitment will always be a Field value.

The instruction will halt if the given input is smaller than 129 bits.

Supported Types

FirstSecondDestination
AddressScalarField
BooleanScalarField
FieldScalarField
GroupScalarField
I8ScalarField
I16ScalarField
I32ScalarField
I64ScalarField
I128ScalarField
U8ScalarField
U16ScalarField
U32ScalarField
U64ScalarField
U128ScalarField
ScalarScalarField
StringScalarField
InterfaceScalarField

Back to Top


BHP512::commit

let a: i128 = 1i128;
let b: field = BHP512::commit(a, 1scalar);

Description

Computes a BHP commitment on inputs of 512-bit chunks in first, and some randomness in second, storing the commitment in destination. Randomness should always be a Scalar value, and the produced commitment will always be a Field value.

The instruction will halt if the given input is smaller than 171 bits.

Supported Types

FirstSecondDestination
AddressScalarField
BooleanScalarField
FieldScalarField
GroupScalarField
I8ScalarField
I16ScalarField
I32ScalarField
I64ScalarField
I128ScalarField
U8ScalarField
U16ScalarField
U32ScalarField
U64ScalarField
U128ScalarField
ScalarScalarField
StringScalarField
InterfaceScalarField

Back to Top


BHP768::commit

let a: i128 = 1i128;
let b: field = BHP768::commit(a, 1scalar);

Description

Computes a BHP commitment on inputs of 768-bit chunks in first, and some randomness in second, storing the commitment in destination. Randomness should always be a Scalar value, and the produced commitment will always be a Field value.

The instruction will halt if the given input is smaller than 129 bits.

Supported Types

FirstSecondDestination
AddressScalarField
BooleanScalarField
FieldScalarField
GroupScalarField
I8ScalarField
I16ScalarField
I32ScalarField
I64ScalarField
I128ScalarField
U8ScalarField
U16ScalarField
U32ScalarField
U64ScalarField
U128ScalarField
ScalarScalarField
StringScalarField
InterfaceScalarField

Back to Top


BHP1024::commit

let a: i128 = 1i128;
let b: field = BHP1024::commit(a, 1scalar);

Description

Computes a BHP commitment on inputs of 1024-bit chunks in first, and some randomness in second, storing the commitment in destination. Randomness should always be a Scalar value, and the produced commitment will always be a Field value.

The instruction will halt if the given input is smaller than 171 bits.

Supported Types

FirstSecondDestination
AddressScalarField
BooleanScalarField
FieldScalarField
GroupScalarField
I8ScalarField
I16ScalarField
I32ScalarField
I64ScalarField
I128ScalarField
U8ScalarField
U16ScalarField
U32ScalarField
U64ScalarField
U128ScalarField
ScalarScalarField
StringScalarField
InterfaceScalarField

Back to Top


Pedersen64::commit

let a: i64 = 1i64;
let b: group = Pedersen64::commit(a, 1scalar);

Description

Computes a Pedersen commitment up to a 64-bit input in first, and some randomness in second, storing the commitment in destination. Randomness should always be a Scalar value, and the produced commitment will always be a Group value.

The instruction will halt if the given String or Interface value exceeds the 64-bit limit.

Supported Types

FirstSecondDestination
BooleanScalarGroup
I8ScalarGroup
I16ScalarGroup
I32ScalarGroup
I64ScalarGroup
U8ScalarGroup
U16ScalarGroup
U32ScalarGroup
U64ScalarGroup
StringScalarGroup
InterfaceScalarGroup

Back to Top


Pedersen128::commit

let a: i128 = 1i128;
let b: group = Pedersen128::commit(a, 1scalar);

Description

Computes a Pedersen commitment up to a 128-bit input in first, and some randomness in second, storing the commitment in destination. Randomness should always be a Scalar value, and the produced commitment will always be a Group value.

The instruction will halt if the given String or Interface value exceeds the 128-bit limit.

Supported Types

FirstSecondDestination
BooleanScalarGroup
I8ScalarGroup
I16ScalarGroup
I32ScalarGroup
I64ScalarGroup
I128ScalarGroup
U8ScalarGroup
U16ScalarGroup
U32ScalarGroup
U64ScalarGroup
U128ScalarGroup
StringScalarGroup
InterfaceScalarGroup

Back to Top


div

let a: u8 = 4u8;
let b: u8 = a / 2u8; // 2u8
let c: u8 = b.div(2u8); // 1u8

Description

Divides first by second, storing the outcome in destination. Halts on division by zero.

For integer types, this operation performs truncated division. Furthermore, a constraint is added to check for underflow. This underflow happens when dividing the minimum value of a signed integer type by -1. For example, div -128i8 -1i8 would result in underflow, since 128 cannot be represented as an i8.

For cases where wrapping semantics are needed for integer types, see the div_wrapped instruction.

Supported Types

FirstSecondDestination
FieldFieldField
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128

Back to Top


div_wrapped

let a: i8 = -128i8;
let b: i8 = a.div_wrapped(-1i8); // -128i8

Description

Divides first by second, wrapping around at the boundary of the type, and storing the outcome in destination.

Supported Types

FirstSecondDestination
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128

Back to Top


double

let a: group = (0, 4)group;
let b: group = a.double();

Description

Doubles the input, storing the outcome in destination.

Supported Types

InputDestination
FieldField
GroupGroup

Back to Top


gt

let a: bool = 2u8 > 1u8; // true
let b: bool = 1u8.gt(1u8); // false

Description

Checks if first is greater than second, storing the result in destination.

Supported Types

FirstSecondDestination
FieldFieldBoolean
I8I8Boolean
I16I16Boolean
I32I32Boolean
I64I64Boolean
I128I128Boolean
U8U8Boolean
U16U16Boolean
U32U32Boolean
U64U64Boolean
U128U128Boolean
ScalarScalarBoolean
<!--AddressAddress

Back to Top


gte

let a: bool = 2u8 >= 1u8; // true
let b: bool = 1u8.gte(1u8); // true

Description

Checks if first is greater than or equal to second, storing the result in destination.

Supported Types

FirstSecondDestination
FieldFieldBoolean
I8I8Boolean
I16I16Boolean
I32I32Boolean
I64I64Boolean
I128I128Boolean
U8U8Boolean
U16U16Boolean
U32U32Boolean
U64U64Boolean
U128U128Boolean
ScalarScalarBoolean
<!--AddressAddress

Back to Top


BHP256::hash

let a: address = aleo10qerras5799u6k7rjtc9y3hcwxuykr45qra7x7dp6jgnc0923czqm0lgta;
let b: field = BHP256::hash(a);

Description

Computes a BHP hash on inputs of 256-bit chunks in first, storing the hash in destination. The produced hash will always be a Field value.

The instruction will halt if the given input is smaller than 129 bits.

Supported Types

FirstDestination
AddressField
BooleanField
FieldField
GroupField
I8Field
I16Field
I32Field
I64Field
I128Field
U8Field
U16Field
U32Field
U64Field
U128Field
ScalarField
StringField
InterfaceField

Back to Top


BHP512::hash

let a: address = aleo10qerras5799u6k7rjtc9y3hcwxuykr45qra7x7dp6jgnc0923czqm0lgta;
let b: field = BHP512::hash(a);

Description

Computes a BHP hash on inputs of 512-bit chunks in first, storing the hash in destination. The produced hash will always be a Field value.

The instruction will halt if the given input is smaller than 171 bits.

Supported Types

FirstDestination
AddressField
BooleanField
FieldField
GroupField
I8Field
I16Field
I32Field
I64Field
I128Field
U8Field
U16Field
U32Field
U64Field
U128Field
ScalarField
StringField
InterfaceField

Back to Top


BHP768::hash

let a: address = aleo10qerras5799u6k7rjtc9y3hcwxuykr45qra7x7dp6jgnc0923czqm0lgta;
let b: field = BHP768::hash(a);

Description

Computes a BHP hash on inputs of 768-bit chunks in first, storing the hash in destination. The produced hash will always be a Field value.

The instruction will halt if the given input is smaller than 129 bits.

Supported Types

FirstDestination
AddressField
BooleanField
FieldField
GroupField
I8Field
I16Field
I32Field
I64Field
I128Field
U8Field
U16Field
U32Field
U64Field
U128Field
ScalarField
StringField
InterfaceField

Back to Top


BHP1024::hash

let a: address = aleo10qerras5799u6k7rjtc9y3hcwxuykr45qra7x7dp6jgnc0923czqm0lgta;
let b: field = BHP1024::hash(a);

Description

Computes a BHP hash on inputs of 1024-bit chunks in first, storing the hash in destination. The produced hash will always be a Field value.

The instruction will halt if the given input is smaller than 171 bits.

Supported Types

FirstDestination
AddressField
BooleanField
FieldField
GroupField
I8Field
I16Field
I32Field
I64Field
I128Field
U8Field
U16Field
U32Field
U64Field
U128Field
ScalarField
StringField
InterfaceField

Back to Top


Pedersen64::hash

let a: field = Pedersen64::hash(1u64);

Description

Computes a Pedersen hash up to a 64-bit input in first, storing the hash in destination. The produced hash will always be a Field value.

The instruction will halt if the given String or Interface value exceeds the 64-bit limit.

Supported Types

FirstDestination
BooleanField
I8Field
I16Field
I32Field
I64Field
U8Field
U16Field
U32Field
U64Field
StringField
InterfaceField

Back to Top


Pedersen128::hash

let a: field = Pedersen64::hash(1u64);

Description

Computes a Pedersen hash up to a 128-bit input in first, storing the hash in destination. The produced hash will always be a Field value.

The instruction will halt if the given String or Interface value exceeds the 128-bit limit.

Supported Types

FirstDestination
BooleanField
I8Field
I16Field
I32Field
I64Field
I128Field
U8Field
U16Field
U32Field
U64Field
U128Field
StringField
InterfaceField

Back to Top


Poseidon2::hash

let a: field = Poseidon2::hash(1u128);

Description

Calculates a Poseidon hash with an input rate of 2, from an input in first, storing the hash in destination. The produced hash will always be a Field value.

Supported Types

FirstDestination
FieldField
I8Field
I16Field
I32Field
I64Field
I128Field
U8Field
U16Field
U32Field
U64Field
U128Field
ScalarField
StringField
InterfaceField

Back to Top


Poseidon4::hash

let a: field = Poseidon4::hash(1u128);

Description

Calculates a Poseidon hash with an input rate of 4, from an input in first, storing the hash in destination. The produced hash will always be a Field value.

Supported Types

FirstDestination
FieldField
I8Field
I16Field
I32Field
I64Field
I128Field
U8Field
U16Field
U32Field
U64Field
U128Field
ScalarField
StringField
InterfaceField

Back to Top


Poseidon8::hash

let a: field = Poseidon8::hash(1u128);

Description

Calculates a Poseidon hash with an input rate of 8, from an input in first, storing the hash in destination. The produced hash will always be a Field value.

Supported Types

FirstDestination
FieldField
I8Field
I16Field
I32Field
I64Field
I128Field
U8Field
U16Field
U32Field
U64Field
U128Field
ScalarField
StringField
InterfaceField

Back to Top


inv

let a: field = 1field.inv();

Description

Computes the multiplicative inverse of the input, storing the outcome in destination.

Supported Types

InputDestination
FieldField

Back to Top


eq

let a: bool = 1u8 == 1u8; // true
let b: bool = 1u8.eq(2u8); // false

Description

Compares first and second, storing the result in destination.

Supported Types

FirstSecondDestination
AddressAddressAddress
BooleanBooleanBoolean
FieldFieldField
GroupGroupGroup
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128
ScalarScalarScalar
InterfaceInterfaceInterface
RecordRecordRecord

Back to Top


neq

let a: bool = 1u8 != 1u8; // false
let b: bool = 1u8.neq(2u8); // true

Description

Returns true if first is not equal to second, storing the result in destination.

Supported Types

FirstSecondDestination
AddressAddressAddress
BooleanBooleanBoolean
FieldFieldField
GroupGroupGroup
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128
ScalarScalarScalar
InterfaceInterfaceInterface
RecordRecordRecord

Back to Top


lt

let a: bool = 1u8 < 2u8; // true
let b: bool = 1u8.lt(1u8); // false

Description

Checks if first is less than second, storing the outcome in destination.

Supported Types

FirstSecondDestination
FieldFieldBoolean
I8I8Boolean
I16I16Boolean
I32I32Boolean
I64I64Boolean
I128I128Boolean
U8U8Boolean
U16U16Boolean
U32U32Boolean
U64U64Boolean
U128U128Boolean
ScalarScalarBoolean
<!--AddressAddress

Back to Top


lte

let a: bool = 1u8 <= 2u8; // true
let b: bool = 1u8.lte(1u8); // true

Description

Checks if first is less than or equal to second, storing the outcome in destination.

Supported Types

FirstSecondDestination
FieldFieldBoolean
I8I8Boolean
I16I16Boolean
I32I32Boolean
I64I64Boolean
I128I128Boolean
U8U8Boolean
U16U16Boolean
U32U32Boolean
U64U64Boolean
U128U128Boolean
ScalarScalarBoolean
<!--AddressAddress

Back to Top


mod

let a: u8 = 3u8.mod(2u8); // 1u8

Description

Takes the modulus of first with respect to second, storing the outcome in destination. Halts if second is zero.

The semantics of this operation are consistent with the mathematical definition of modulo operation.

Supported Types

FirstSecondDestination
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128

Back to Top


mul

let a: u8 = 2u8 * 2u8; // 4u8
let b: u8 = a.mul(2u8); // 8u8

Description

Multiplies first with second, storing the outcome in destination.

For integer types, a constraint is added to check for overflow/underflow. For cases where wrapping semantics are needed for integer types, see the mul_wrapped instruction.

Supported Types

FirstSecondDestination
FieldFieldField
GroupScalarGroup
ScalarGroupGroup
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128

Back to Top


mul_wrapped

let a: u8 = 128u8.mul_wrapped(2u8); // 0u8

Description

Multiplies first with second, wrapping around at the boundary of the type, and storing the outcome in destination.

Supported Types

FirstSecondDestination
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128

Back to Top


nand

let a: bool = true.nand(false); // true

Description

Returns false only if first and second are true, storing the outcome in destination.

Supported Types

FirstSecondDestination
BooleanBooleanBoolean

Back to Top


neg

let a: i8 = -1i8.neg(); // 1i8

Description

Negates first, storing the outcome in destination.

For signed integer types, calling neg on the minimum value is an invalid operation. For example, the input -128i8 would not be valid since 128 cannot be represented as an i8.

Supported Types

InputDestination
FieldField
GroupGroup
I8I8
I16I16
I32I32
I64I64
I128I128

Back to Top


nor

let a: bool = false.nor(false); // true

Description

Returns true when neither first nor second is true, storing the outcome in destination.

Supported Type

FirstSecondDestination
BooleanBooleanBoolean

Back to Top


not

let a: bool = true.not(); // false

Description

Perform a NOT operation on an integer (bitwise) or boolean input, storing the outcome in destination.

Supported Types

InputDestination
BooleanBoolean
I8I8
I16I16
I32I32
I64I64
I128I128
U8U8
U16U16
U32U32
U64U64
U128U128

Back to Top


or

let a: bool = true || false; // true
let b: bool = false.or(false); // false

Description

Performs an OR operation on integer (bitwise) or boolean first and second, storing the outcome in destination.

Supported Types

FirstSecondDestination
BooleanBooleanBoolean
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128

Back to Top


pow

let a: u8 = 2u8 ** 2u8; // 4u8
let b: u8 = b.pow(2u8); // 16u8

Description

Raises first to the power of second, storing the outcome in destination.

For integer types, a constraint is added to check for overflow/underflow. For cases where wrapping semantics are needed for integer types, see the pow_wrapped instruction.

Supported Types

Magnitude can be a U8, U16, or U32.

FirstSecondDestination
FieldFieldField
I8MagnitudeI8
I16MagnitudeI16
I32MagnitudeI32
I64MagnitudeI64
I128MagnitudeI128
U8MagnitudeU8
U16MagnitudeU16
U32MagnitudeU32
U64MagnitudeU64
U128MagnitudeU128

Back to Top


pow_wrapped

let a: u8 = 16u8 ** 2u8; // 0u8

Description

Raises first to the power of second, wrapping around at the boundary of the type, storing the outcome in destination.

Supported Types

Magnitude can be a U8, U16, or U32.

FirstSecondDestination
I8MagnitudeI8
I16MagnitudeI16
I32MagnitudeI32
I64MagnitudeI64
I128MagnitudeI128
U8MagnitudeU8
U16MagnitudeU16
U32MagnitudeU32
U64MagnitudeU64
U128MagnitudeU128

Back to Top


rem

let a: u8 = 3u8 % 2u8; // 1u8
let b: u8 = 4u8.rem(2u8); // 0u8

Description

Computes the truncated remainder of first divided by second, storing the outcome in destination. Halts on division by zero.

A constraint is added to check for underflow. This underflow happens when the associated division operation, div, underflows.

For cases where wrapping semantics are needed for integer types, see the rem_wrapped instruction.

Supported Types

FirstSecondDestination
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128

Back to Top


rem_wrapped

let a: i128 = -128i8;
let b: i128 = a.rem_wrapped(-1i8); // 0i8

Description

Computes the truncated remainder of first divided by second, wrapping around at the boundary of the type, and storing the outcome in destination.

Supported Types

FirstSecondDestination
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128

Back to Top


shl

let a: u8 = 1u8 << 1u8; // 2u8
let b: u8 = a.shl(1u8); // 4u8

Description

Shifts first left by second bits, storing the outcome in destination.

Supported Types

Magnitude can be a U8, U16, or U32.

FirstSecondDestination
I8MagnitudeI8
I16MagnitudeI16
I32MagnitudeI32
I64MagnitudeI64
I128MagnitudeI128
U8MagnitudeU8
U16MagnitudeU16
U32MagnitudeU32
U64MagnitudeU64
U128MagnitudeU128

Back to Top


shl_wrapped

let a: u8 = 128u8.shl_wrapped(1u8); // 0u8

Description

Shifts first left by second bits, wrapping around at the boundary of the type, storing the outcome in destination.

Supported Types

Magnitude can be a U8, U16, or U32.

FirstSecondDestination
I8MagnitudeI8
I16MagnitudeI16
I32MagnitudeI32
I64MagnitudeI64
I128MagnitudeI128
U8MagnitudeU8
U16MagnitudeU16
U32MagnitudeU32
U64MagnitudeU64
U128MagnitudeU128

Back to Top


shr

let a: u8 = 4u8 >> 1u8; // 2u8 
let b: u8 = a.shr(1u8); // 1u8

Description

Shifts first right by second bits, storing the outcome in destination.

Supported Types

Magnitude can be a U8, U16, or U32.

FirstSecondDestination
I8MagnitudeI8
I16MagnitudeI16
I32MagnitudeI32
I64MagnitudeI64
I128MagnitudeI128
U8MagnitudeU8
U16MagnitudeU16
U32MagnitudeU32
U64MagnitudeU64
U128MagnitudeU128

Back to Top


shr_wrapped

let a: u8 = 128u8.shr_wrapped(7u8); // 1u8

Description

Shifts first right by second bits, wrapping around at the boundary of the type, storing the outcome in destination.

Supported Types

Magnitude can be a U8, U16, or U32.

FirstSecondDestination
I8MagnitudeI8
I16MagnitudeI16
I32MagnitudeI32
I64MagnitudeI64
I128MagnitudeI128
U8MagnitudeU8
U16MagnitudeU16
U32MagnitudeU32
U64MagnitudeU64
U128MagnitudeU128

Back to Top


square

let a: field = 1field.square(); // 1field

Description

Squares the input, storing the outcome in destination.

Supported Types

InputDestination
FieldField

Back to Top


square_root

let a: field = 1field.square_root(); // 1field

Description

Computes the square root of the input, storing the outcome in destination.

Supported Types

InputDestination
FieldField

Back to Top


sub

let a: u8 = 2u8 - 1u8; // 1u8
let b: u8 = a.sub(1u8); // 0u8

Description

Computes first - second, storing the outcome in destination.

Supported Types

FirstSecondDestination
FieldFieldField
GroupGroupGroup
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128

Back to Top


sub_wrapped

let a: u8 = 0u8.sub_wrapped(1u8); // 255u8

Description

Computes first - second, wrapping around at the boundary of the type, and storing the outcome in destination.

Supported Types

FirstSecondDestination
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128

Back to Top


ternary

let a: u8 = true ? 1u8 : 2u8; // 1u8

Description

Selects first, if condition is true, otherwise selects second, storing the result in destination.

Supported Types

ConditionFirstSecondDestination
BooleanBooleanBooleanBoolean
BooleanFieldFieldField
BooleanGroupGroupGroup
BooleanI8I8I8
BooleanI16I16I16
BooleanI32I32I32
BooleanI64I64I64
BooleanI128I128I128
BooleanU8U8U8
BooleanU16U16U16
BooleanU32U32U32
BooleanU64U64U64
BooleanU128U128U128
BooleanScalarScalarScalar

Back to Top


xor

let a: bool = true.xor(false); // true

Description

Performs a XOR operation on integer (bitwise) or boolean first and second, storing the outcome in destination.

Supported Types

FirstSecondDestination
BooleanBooleanBoolean
I8I8I8
I16I16I16
I32I32I32
I64I64I64
I128I128I128
U8U8U8
U16U16U16
U32U32U32
U64U64U64
U128U128U128

Back to Top