Skip to main content
Version: 1.0

Built-in Functions

panic​


_10
view fun panic(_ message: String): Never

Terminates the program unconditionally and reports a message which explains why the unrecoverable error occurred.


_10
panic("something went wrong: ...")

assert​


_10
view fun assert(_ condition: Bool, message: String)

Terminates the program if the given condition is false, and reports a message which explains how the condition is false. Use this function for internal sanity checks.

The message argument is optional.

revertibleRandom​


_10
view fun revertibleRandom<T: FixedSizeUnsignedInteger>(modulo: T): T

Returns a pseudo-random integer.

T can be any fixed-size unsigned integer type (FixedSizeUnsignedInteger, i.e. (UInt8, UInt16, UInt32, UInt64, UInt128, UInt256, Word8, Word16, Word32, Word64, Word128, Word256).

The modulo argument is optional. If provided, the returned integer is between 0 and modulo -1. If not provided, the returned integer is between 0 and the maximum value of T. The function errors if modulo is equal to 0.

The sequence of returned random numbers is independent for every transaction in each block. Under the hood, Cadence instantiates a cryptographically-secure pseudo-random number generator (CSPRG) for each transaction independently, where the seeds of any two transactions are different with near certainty.

The random numbers returned are unpredictable (unpredictable for miners at block construction time, and unpredictable for cadence logic at time of call), verifiable, as well as unbiasable by miners and previously-running Cadence code. See Secure random number generator for Flow’s smart contracts and FLIP120 for more details.

Nevertheless, developers need to be mindful to use revertibleRandom() correctly:

warning

A transaction can atomically revert all its action. It is possible for a transaction submitted by an untrusted party to post-select favorable results and revert the transaction for unfavorable results.

The function usage remains safe when called by a trusted party that does not perform post-selection on the returned random numbers.

This limitation is inherent to any smart contract platform that allows transactions to roll back atomically and cannot be solved through safe randomness alone. In cases where a non-trusted party can interact through their own transactions with smart contracts generating random numbers, it is recommended to use commit-reveal schemes as outlined in this tentative example (full tutorial coming soon).

RLP​

Recursive Length Prefix (RLP) serialization allows the encoding of arbitrarily nested arrays of binary data.

Cadence provides RLP decoding functions in the built-in RLP contract, which does not need to be imported.

decodeString​


_10
view fun decodeString(_ input: [UInt8]): [UInt8]

Decodes an RLP-encoded byte array. RLP calls this a "string." The byte array should only contain of a single encoded value for a string. If the encoded value type does not match, or it has trailing unnecessary bytes, the program aborts. If the function encounters any error while decoding, the program aborts.

decodeList​


_10
view fun decodeList(_ input: [UInt8]): [[UInt8]]`

Decodes an RLP-encoded list into an array of RLP-encoded items.

Note that this function does not recursively decode, so each element of the resulting array is RLP-encoded data. The byte array should only contain of a single encoded value for a list. If the encoded value type does not match, or it has trailing unnecessary bytes, the program aborts. If the function encounters any error while decoding, the program aborts.