Skip to main content

Built-in Functions

panic


_10
fun panic(_ message: String): Never

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


_10
let optionalAccount: AuthAccount? = // ...
_10
let account = optionalAccount ?? panic("missing account")

assert


_10
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.

unsafeRandom


_10
fun unsafeRandom(): UInt64

Returns a pseudo-random number.

NOTE: Smart contract developers should be mindful about the limitations of unsafeRandom. The stream of random numbers produced is potentially unsafe in the following two regards:

  1. The sequence of random numbers is potentially predictable by transactions within the same block and by other smart contracts calling into your smart contract.
  2. A transaction calling into your smart contract can potentially bias the sequence of random numbers which your smart contract internally generates.

We are working towards removing these limitations incrementally. Once these points are addressed, Flow’s randomness is safe and we will remove the "unsafe" qualifier.

Nevertheless, there is an additional safety-relevant aspect that developers need to be mindful about:

  • A transaction can atomically revert all its action at any time. Therefore, it is possible for a transaction calling into your smart contract to post-select favourable results and revert the transaction for unfavourable results. (example)

This limitation is inherent to any smart contract platform that allows transactions to roll back atomically and cannot be solved through safe randomness alone. Providing additional Cadence language primitives to simplify this challenge for developers is on our roadmap as well. Nevertheless, with safe randomness (points 1 and 2 above resolved), developers can prevent clients from post-select favourable outcomes using approaches such as described in the example.

RLP

RLP (Recursive Length Prefix) 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.


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

    Decodes an RLP-encoded byte array (called string in the context of RLP). 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 any error is encountered while decoding, the program aborts.


    _10
    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 any error is encountered while decoding, the program aborts.