Module sui::bcs
This module implements BCS (de)serialization in Move. Full specification can be found here: https://github.com/diem/bcs
Short summary (for Move-supported types):
- address - sequence of X bytes
- bool - byte with 0 or 1
- u8 - a single u8 byte
- u16 / u32 / u64 / u128 / u256 - LE bytes
- vector - ULEB128 length + LEN elements
- option - first byte bool: None (0) or Some (1), then value
Usage example:
/// This function reads u8 and u64 value from the input
/// and returns the rest of the bytes.
fun deserialize(bytes: vector<u8>): (u8, u64, vector<u8>) {
use sui::bcs::{Self, BCS};
let prepared: BCS = bcs::new(bytes);
let (u8_value, u64_value) = (
prepared.peel_u8(),
prepared.peel_u64()
);
// unpack bcs struct
let leftovers = prepared.into_remainder_bytes();
(u8_value, u64_value, leftovers)
}
```move
- [Struct `BCS`](#sui_bcs_BCS)
- [Constants](#@Constants_0)
- [Function `to_bytes`](#sui_bcs_to_bytes)
- [Function `new`](#sui_bcs_new)
- [Function `into_remainder_bytes`](#sui_bcs_into_remainder_bytes)
- [Function `peel_address`](#sui_bcs_peel_address)
- [Function `peel_bool`](#sui_bcs_peel_bool)
- [Function `peel_u8`](#sui_bcs_peel_u8)
- [Macro function `peel_num`](#sui_bcs_peel_num)
- [Function `peel_u16`](#sui_bcs_peel_u16)
- [Function `peel_u32`](#sui_bcs_peel_u32)
- [Function `peel_u64`](#sui_bcs_peel_u64)
- [Function `peel_u128`](#sui_bcs_peel_u128)
- [Function `peel_u256`](#sui_bcs_peel_u256)
- [Function `peel_vec_length`](#sui_bcs_peel_vec_length)
- [Macro function `peel_vec`](#sui_bcs_peel_vec)
- [Function `peel_vec_address`](#sui_bcs_peel_vec_address)
- [Function `peel_vec_bool`](#sui_bcs_peel_vec_bool)
- [Function `peel_vec_u8`](#sui_bcs_peel_vec_u8)
- [Function `peel_vec_vec_u8`](#sui_bcs_peel_vec_vec_u8)
- [Function `peel_vec_u16`](#sui_bcs_peel_vec_u16)
- [Function `peel_vec_u32`](#sui_bcs_peel_vec_u32)
- [Function `peel_vec_u64`](#sui_bcs_peel_vec_u64)
- [Function `peel_vec_u128`](#sui_bcs_peel_vec_u128)
- [Function `peel_vec_u256`](#sui_bcs_peel_vec_u256)
- [Function `peel_enum_tag`](#sui_bcs_peel_enum_tag)
- [Macro function `peel_option`](#sui_bcs_peel_option)
- [Function `peel_option_address`](#sui_bcs_peel_option_address)
- [Function `peel_option_bool`](#sui_bcs_peel_option_bool)
- [Function `peel_option_u8`](#sui_bcs_peel_option_u8)
- [Function `peel_option_u16`](#sui_bcs_peel_option_u16)
- [Function `peel_option_u32`](#sui_bcs_peel_option_u32)
- [Function `peel_option_u64`](#sui_bcs_peel_option_u64)
- [Function `peel_option_u128`](#sui_bcs_peel_option_u128)
- [Function `peel_option_u256`](#sui_bcs_peel_option_u256)
<pre><code><b>use</b> <a href="../std/ascii#std_ascii">std::ascii</a>;
<b>use</b> <a href="../std/bcs#std_bcs">std::bcs</a>;
<b>use</b> <a href="../std/option#std_option">std::option</a>;
<b>use</b> <a href="../std/string#std_string">std::string</a>;
<b>use</b> <a href="../std/vector#std_vector">std::vector</a>;
<b>use</b> <a href="../sui/address#sui_address">sui::address</a>;
<b>use</b> <a href="../sui/hex#sui_hex">sui::hex</a>;
</code></pre>
## Struct `BCS` \{#sui_bcs_BCS}
A helper struct that saves resources on operations. For better
vector performance, it stores reversed bytes of the BCS and
enables use of vector::pop_back.
<pre><code><b>public</b> <b>struct</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a> <b>has</b> <b>copy</b>, drop, store
</code></pre>
<details>
<summary>Fields</summary>
<dl>
<dt>
bytes: vector<u8>
</dt>
<dd>
</dd>
</dl>
</details>
<a style='scroll-margin-top:80px' id="@Constants_0"></a>
## Constants
<a style='scroll-margin-top:80px' id="sui_bcs_EOutOfRange"></a>
For when bytes length is less than required for deserialization.
<pre><code><b>const</b> <a href="../sui/bcs#sui_bcs_EOutOfRange">EOutOfRange</a>: u64 = 0;
</code></pre>
<a style='scroll-margin-top:80px' id="sui_bcs_ENotBool"></a>
For when the boolean value different than 0 or 1.
<pre><code><b>const</b> <a href="../sui/bcs#sui_bcs_ENotBool">ENotBool</a>: u64 = 1;
</code></pre>
<a style='scroll-margin-top:80px' id="sui_bcs_ELenOutOfRange"></a>
For when ULEB byte is out of range (or not found).
<pre><code><b>const</b> <a href="../sui/bcs#sui_bcs_ELenOutOfRange">ELenOutOfRange</a>: u64 = 2;
</code></pre>
## Function `to_bytes` \{#sui_bcs_to_bytes}
Get BCS serialized bytes for any value.
Re-exports stdlib <a href="../sui/bcs#sui_bcs_to_bytes">bcs::to_bytes</a>.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_to_bytes">to_bytes</a><T>(value: &T): vector<u8>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_to_bytes">to_bytes</a><T>(value: &T): vector<u8> {
<a href="../sui/bcs#sui_bcs_to_bytes">bcs::to_bytes</a>(value)
}
</code></pre>
</details>
## Function `new` \{#sui_bcs_new}
Creates a new instance of BCS wrapper that holds inversed
bytes for better performance.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_new">new</a>(bytes: vector<u8>): <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_new">new</a>(<b>mut</b> bytes: vector<u8>): <a href="../sui/bcs#sui_bcs_BCS">BCS</a> {
bytes.reverse();
<a href="../sui/bcs#sui_bcs_BCS">BCS</a> { bytes }
}
</code></pre>
</details>
## Function `into_remainder_bytes` \{#sui_bcs_into_remainder_bytes}
Unpack the <a href="../sui/bcs#sui_bcs_BCS">BCS</a> struct returning the leftover bytes.
Useful for passing the data further after partial deserialization.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_into_remainder_bytes">into_remainder_bytes</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): vector<u8>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_into_remainder_bytes">into_remainder_bytes</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): vector<u8> {
<b>let</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a> { <b>mut</b> bytes } = <a href="../sui/bcs#sui_bcs">bcs</a>;
bytes.reverse();
bytes
}
</code></pre>
</details>
## Function `peel_address` \{#sui_bcs_peel_address}
Read address from the bcs-serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_address">peel_address</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): <b>address</b>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_address">peel_address</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): <b>address</b> {
<b>assert</b>!(<a href="../sui/bcs#sui_bcs">bcs</a>.bytes.length() >= <a href="../sui/address#sui_address_length">address::length</a>(), <a href="../sui/bcs#sui_bcs_EOutOfRange">EOutOfRange</a>);
<a href="../sui/address#sui_address_from_bytes">address::from_bytes</a>(vector::tabulate!(<a href="../sui/address#sui_address_length">address::length</a>(), |_| <a href="../sui/bcs#sui_bcs">bcs</a>.bytes.pop_back()))
}
</code></pre>
</details>
## Function `peel_bool` \{#sui_bcs_peel_bool}
Read a bool value from bcs-serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_bool">peel_bool</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): bool
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_bool">peel_bool</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): bool {
<b>let</b> value = <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_u8">peel_u8</a>();
<b>if</b> (value == 0) <b>false</b>
<b>else</b> <b>if</b> (value == 1) <b>true</b>
<b>else</b> <b>abort</b> <a href="../sui/bcs#sui_bcs_ENotBool">ENotBool</a>
}
</code></pre>
</details>
## Function `peel_u8` \{#sui_bcs_peel_u8}
Read u8 value from bcs-serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_u8">peel_u8</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): u8
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_u8">peel_u8</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): u8 {
<b>assert</b>!(<a href="../sui/bcs#sui_bcs">bcs</a>.bytes.length() >= 1, <a href="../sui/bcs#sui_bcs_EOutOfRange">EOutOfRange</a>);
<a href="../sui/bcs#sui_bcs">bcs</a>.bytes.pop_back()
}
</code></pre>
</details>
## Macro function `peel_num` \{#sui_bcs_peel_num}
<pre><code><b>macro</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_num">peel_num</a><$I, $T>($<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>, $len: u64, $bits: $I): $T
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>macro</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_num">peel_num</a><$I, $T>($<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>, $len: u64, $bits: $I): $T {
<b>let</b> <a href="../sui/bcs#sui_bcs">bcs</a> = $<a href="../sui/bcs#sui_bcs">bcs</a>;
<b>assert</b>!(<a href="../sui/bcs#sui_bcs">bcs</a>.bytes.length() >= $len, <a href="../sui/bcs#sui_bcs_EOutOfRange">EOutOfRange</a>);
<b>let</b> <b>mut</b> value: $T = 0;
<b>let</b> <b>mut</b> i: $I = 0;
<b>let</b> bits = $bits;
<b>while</b> (i < bits) {
<b>let</b> byte = <a href="../sui/bcs#sui_bcs">bcs</a>.bytes.pop_back() <b>as</b> $T;
value = value + (byte << (i <b>as</b> u8));
i = i + 8;
};
value
}
</code></pre>
</details>
## Function `peel_u16` \{#sui_bcs_peel_u16}
Read u16 value from bcs-serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_u16">peel_u16</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): u16
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_u16">peel_u16</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): u16 {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_num">peel_num</a>!(2, 16u8)
}
</code></pre>
</details>
## Function `peel_u32` \{#sui_bcs_peel_u32}
Read u32 value from bcs-serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_u32">peel_u32</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): u32
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_u32">peel_u32</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): u32 {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_num">peel_num</a>!(4, 32u8)
}
</code></pre>
</details>
## Function `peel_u64` \{#sui_bcs_peel_u64}
Read u64 value from bcs-serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_u64">peel_u64</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): u64
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_u64">peel_u64</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): u64 {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_num">peel_num</a>!(8, 64u8)
}
</code></pre>
</details>
## Function `peel_u128` \{#sui_bcs_peel_u128}
Read u128 value from bcs-serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_u128">peel_u128</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): u128
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_u128">peel_u128</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): u128 {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_num">peel_num</a>!(16, 128u8)
}
</code></pre>
</details>
## Function `peel_u256` \{#sui_bcs_peel_u256}
Read u256 value from bcs-serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_u256">peel_u256</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): u256
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_u256">peel_u256</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): u256 {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_num">peel_num</a>!(32, 256u16)
}
</code></pre>
</details>
## Function `peel_vec_length` \{#sui_bcs_peel_vec_length}
Read ULEB bytes expecting a vector length. Result should
then be used to perform peel_* operation LEN times.
In BCS vector length is implemented with ULEB128;
See more here: https://en.wikipedia.org/wiki/LEB128
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_length">peel_vec_length</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): u64
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_length">peel_vec_length</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): u64 {
<b>let</b> (<b>mut</b> total, <b>mut</b> shift, <b>mut</b> len) = (0u64, 0, 0);
<b>loop</b> {
<b>assert</b>!(len <= 4, <a href="../sui/bcs#sui_bcs_ELenOutOfRange">ELenOutOfRange</a>);
<b>let</b> byte = <a href="../sui/bcs#sui_bcs">bcs</a>.bytes.pop_back() <b>as</b> u64;
len = len + 1;
total = total | ((byte & 0x7f) << shift);
<b>if</b> ((byte & 0x80) == 0) <b>break</b>;
shift = shift + 7;
};
total
}
</code></pre>
</details>
## Macro function `peel_vec` \{#sui_bcs_peel_vec}
Peel vector<$T> from serialized bytes, where $peel: |&<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>| -> $T gives the
functionality of peeling each value.
<pre><code><b>public</b> <b>macro</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec">peel_vec</a><$T>($<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>, $peel: |&<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>| -> $T): vector<$T>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>macro</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec">peel_vec</a><$T>($<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>, $peel: |&<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>| -> $T): vector<$T> {
<b>let</b> <a href="../sui/bcs#sui_bcs">bcs</a> = $<a href="../sui/bcs#sui_bcs">bcs</a>;
vector::tabulate!(<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_vec_length">peel_vec_length</a>(), |_| $peel(<a href="../sui/bcs#sui_bcs">bcs</a>))
}
</code></pre>
</details>
## Function `peel_vec_address` \{#sui_bcs_peel_vec_address}
Peel a vector of <b>address</b> from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_address">peel_vec_address</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): vector<<b>address</b>>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_address">peel_vec_address</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): vector<<b>address</b>> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_vec">peel_vec</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_address">peel_address</a>())
}
</code></pre>
</details>
## Function `peel_vec_bool` \{#sui_bcs_peel_vec_bool}
Peel a vector of <b>address</b> from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_bool">peel_vec_bool</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): vector<bool>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_bool">peel_vec_bool</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): vector<bool> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_vec">peel_vec</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_bool">peel_bool</a>())
}
</code></pre>
</details>
## Function `peel_vec_u8` \{#sui_bcs_peel_vec_u8}
Peel a vector of u8 (eg string) from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_u8">peel_vec_u8</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): vector<u8>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_u8">peel_vec_u8</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): vector<u8> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_vec">peel_vec</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_u8">peel_u8</a>())
}
</code></pre>
</details>
## Function `peel_vec_vec_u8` \{#sui_bcs_peel_vec_vec_u8}
Peel a vector<vector<u8>> (eg vec of string) from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_vec_u8">peel_vec_vec_u8</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): vector<vector<u8>>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_vec_u8">peel_vec_vec_u8</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): vector<vector<u8>> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_vec">peel_vec</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_vec_u8">peel_vec_u8</a>())
}
</code></pre>
</details>
## Function `peel_vec_u16` \{#sui_bcs_peel_vec_u16}
Peel a vector of u16 from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_u16">peel_vec_u16</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): vector<u16>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_u16">peel_vec_u16</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): vector<u16> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_vec">peel_vec</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_u16">peel_u16</a>())
}
</code></pre>
</details>
## Function `peel_vec_u32` \{#sui_bcs_peel_vec_u32}
Peel a vector of u32 from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_u32">peel_vec_u32</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): vector<u32>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_u32">peel_vec_u32</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): vector<u32> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_vec">peel_vec</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_u32">peel_u32</a>())
}
</code></pre>
</details>
## Function `peel_vec_u64` \{#sui_bcs_peel_vec_u64}
Peel a vector of u64 from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_u64">peel_vec_u64</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): vector<u64>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_u64">peel_vec_u64</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): vector<u64> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_vec">peel_vec</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_u64">peel_u64</a>())
}
</code></pre>
</details>
## Function `peel_vec_u128` \{#sui_bcs_peel_vec_u128}
Peel a vector of u128 from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_u128">peel_vec_u128</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): vector<u128>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_u128">peel_vec_u128</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): vector<u128> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_vec">peel_vec</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_u128">peel_u128</a>())
}
</code></pre>
</details>
## Function `peel_vec_u256` \{#sui_bcs_peel_vec_u256}
Peel a vector of u256 from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_u256">peel_vec_u256</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): vector<u256>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_vec_u256">peel_vec_u256</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): vector<u256> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_vec">peel_vec</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_u256">peel_u256</a>())
}
</code></pre>
</details>
## Function `peel_enum_tag` \{#sui_bcs_peel_enum_tag}
Peel enum from serialized bytes, where $f takes a tag value and returns
the corresponding enum variant. Move enums are limited to 127 variants,
however the tag can be any u32 value.
Example:
```moverust
let my_enum = match (bcs.peel_enum_tag()) {
0 => Enum::Empty,
1 => Enum::U8(bcs.peel_u8()),
2 => Enum::U16(bcs.peel_u16()),
3 => Enum::Struct { a: bcs.peel_address(), b: bcs.peel_u8() },
_ => abort,
};
```move
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_enum_tag">peel_enum_tag</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): u32
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_enum_tag">peel_enum_tag</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): u32 {
<b>let</b> tag = <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_vec_length">peel_vec_length</a>();
<b>assert</b>!(tag <= <a href="../std/u32#std_u32_max_value">std::u32::max_value</a>!() <b>as</b> u64, <a href="../sui/bcs#sui_bcs_EOutOfRange">EOutOfRange</a>);
tag <b>as</b> u32
}
</code></pre>
</details>
## Macro function `peel_option` \{#sui_bcs_peel_option}
Peel Option<$T> from serialized bytes, where $peel: |&<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>| -> $T gives the
functionality of peeling the inner value.
<pre><code><b>public</b> <b>macro</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option">peel_option</a><$T>($<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>, $peel: |&<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>| -> $T): <a href="../std/option#std_option_Option">std::option::Option</a><$T>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>macro</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option">peel_option</a><$T>($<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>, $peel: |&<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>| -> $T): Option<$T> {
<b>let</b> <a href="../sui/bcs#sui_bcs">bcs</a> = $<a href="../sui/bcs#sui_bcs">bcs</a>;
<b>if</b> (<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_bool">peel_bool</a>()) option::some($peel(<a href="../sui/bcs#sui_bcs">bcs</a>)) <b>else</b> option::none()
}
</code></pre>
</details>
## Function `peel_option_address` \{#sui_bcs_peel_option_address}
Peel Option<<b>address</b>> from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_address">peel_option_address</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): <a href="../std/option#std_option_Option">std::option::Option</a><<b>address</b>>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_address">peel_option_address</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): Option<<b>address</b>> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_option">peel_option</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_address">peel_address</a>())
}
</code></pre>
</details>
## Function `peel_option_bool` \{#sui_bcs_peel_option_bool}
Peel Option<bool> from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_bool">peel_option_bool</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): <a href="../std/option#std_option_Option">std::option::Option</a><bool>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_bool">peel_option_bool</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): Option<bool> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_option">peel_option</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_bool">peel_bool</a>())
}
</code></pre>
</details>
## Function `peel_option_u8` \{#sui_bcs_peel_option_u8}
Peel Option<u8> from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_u8">peel_option_u8</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): <a href="../std/option#std_option_Option">std::option::Option</a><u8>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_u8">peel_option_u8</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): Option<u8> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_option">peel_option</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_u8">peel_u8</a>())
}
</code></pre>
</details>
## Function `peel_option_u16` \{#sui_bcs_peel_option_u16}
Peel Option<u16> from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_u16">peel_option_u16</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): <a href="../std/option#std_option_Option">std::option::Option</a><u16>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_u16">peel_option_u16</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): Option<u16> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_option">peel_option</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_u16">peel_u16</a>())
}
</code></pre>
</details>
## Function `peel_option_u32` \{#sui_bcs_peel_option_u32}
Peel Option<u32> from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_u32">peel_option_u32</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): <a href="../std/option#std_option_Option">std::option::Option</a><u32>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_u32">peel_option_u32</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): Option<u32> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_option">peel_option</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_u32">peel_u32</a>())
}
</code></pre>
</details>
## Function `peel_option_u64` \{#sui_bcs_peel_option_u64}
Peel Option<u64> from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_u64">peel_option_u64</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): <a href="../std/option#std_option_Option">std::option::Option</a><u64>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_u64">peel_option_u64</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): Option<u64> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_option">peel_option</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_u64">peel_u64</a>())
}
</code></pre>
</details>
## Function `peel_option_u128` \{#sui_bcs_peel_option_u128}
Peel Option<u128> from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_u128">peel_option_u128</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): <a href="../std/option#std_option_Option">std::option::Option</a><u128>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_u128">peel_option_u128</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): Option<u128> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_option">peel_option</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_u128">peel_u128</a>())
}
</code></pre>
</details>
## Function `peel_option_u256` \{#sui_bcs_peel_option_u256}
Peel Option<u256> from serialized bytes.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_u256">peel_option_u256</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">sui::bcs::BCS</a>): <a href="../std/option#std_option_Option">std::option::Option</a><u256>
</code></pre>
<details>
<summary>Implementation</summary>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs#sui_bcs_peel_option_u256">peel_option_u256</a>(<a href="../sui/bcs#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs#sui_bcs_BCS">BCS</a>): Option<u256> {
<a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_option">peel_option</a>!(|<a href="../sui/bcs#sui_bcs">bcs</a>| <a href="../sui/bcs#sui_bcs">bcs</a>.<a href="../sui/bcs#sui_bcs_peel_u256">peel_u256</a>())
}
</code></pre>
</details>