Packages

Various modules and helpers for working with Nimiq primitives in the Gleam programming language or as a CLI

Current section

Files

Jump to
nimiq_gleam src transaction@staking_data.erl
Raw

src/transaction@staking_data.erl

-module(transaction@staking_data).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([deserialize/1, deserialize_all/1, serialize/2, serialize_to_bits/1, to_hex/1, to_int/1, from_int/1]).
-export_type([incoming_staking_data/0, outgoing_staking_data/0]).
-type incoming_staking_data() :: {create_validator,
key@ed25519@public_key:public_key(),
bitstring(),
account@address:address(),
gleam@option:option(bitstring()),
bitstring(),
transaction@signature_proof:signature_proof()} |
{update_validator,
gleam@option:option(key@ed25519@public_key:public_key()),
gleam@option:option(bitstring()),
gleam@option:option(account@address:address()),
gleam@option:option(gleam@option:option(bitstring())),
gleam@option:option(bitstring()),
transaction@signature_proof:signature_proof()} |
{deactivate_validator,
account@address:address(),
transaction@signature_proof:signature_proof()} |
{reactivate_validator,
account@address:address(),
transaction@signature_proof:signature_proof()} |
{retire_validator, transaction@signature_proof:signature_proof()} |
{create_staker,
gleam@option:option(account@address:address()),
transaction@signature_proof:signature_proof()} |
{add_stake, account@address:address()} |
{update_staker,
gleam@option:option(account@address:address()),
boolean(),
transaction@signature_proof:signature_proof()} |
{set_active_stake,
coin:coin(),
transaction@signature_proof:signature_proof()} |
{retire_stake, coin:coin(), transaction@signature_proof:signature_proof()}.
-type outgoing_staking_data() :: delete_validator | remove_stake.
-file("src/transaction/staking_data.gleam", 68).
-spec deserialize(bitstring()) -> {ok, {incoming_staking_data(), bitstring()}} |
{error, binary()}.
deserialize(Buf) ->
gleam@result:'try'(
utils@serde:deserialize_int(Buf, 8),
fun(_use0) ->
{Format, Rest} = _use0,
case Format of
0 ->
gleam@result:'try'(
key@ed25519@public_key:deserialize(Rest),
fun(_use0@1) ->
{Signing_key, Rest@1} = _use0@1,
gleam@result:'try'(
utils@serde:deserialize_bitarray(Rest@1, 285),
fun(_use0@2) ->
{Voting_key, Rest@2} = _use0@2,
gleam@result:'try'(
account@address:deserialize(Rest@2),
fun(_use0@3) ->
{Reward_address, Rest@3} = _use0@3,
gleam@result:'try'(
utils@serde:deserialize_bool(
Rest@3
),
fun(_use0@4) ->
{Has_signal_data, Rest@4} = _use0@4,
gleam@result:'try'(
case Has_signal_data of
false ->
{ok,
{none,
Rest@4}};
true ->
_pipe = utils@serde:deserialize_bitarray(
Rest@4,
32
),
gleam@result:map(
_pipe,
fun(
_capture
) ->
gleam@pair:map_first(
_capture,
fun(Field@0) -> {some, Field@0} end
)
end
)
end,
fun(_use0@5) ->
{Signal_data,
Rest@5} = _use0@5,
gleam@result:'try'(
utils@serde:deserialize_bitarray(
Rest@5,
95
),
fun(_use0@6) ->
{Proof_of_knowledge,
Rest@6} = _use0@6,
gleam@result:'try'(
transaction@signature_proof:deserialize(
Rest@6
),
fun(
_use0@7
) ->
{Proof,
Rest@7} = _use0@7,
{ok,
{{create_validator,
Signing_key,
Voting_key,
Reward_address,
Signal_data,
Proof_of_knowledge,
Proof},
Rest@7}}
end
)
end
)
end
)
end
)
end
)
end
)
end
);
1 ->
gleam@result:'try'(
utils@serde:deserialize_bool(Rest),
fun(_use0@8) ->
{Has_new_signing_key, Rest@8} = _use0@8,
gleam@result:'try'(case Has_new_signing_key of
false ->
{ok, {none, Rest@8}};
true ->
_pipe@1 = key@ed25519@public_key:deserialize(
Rest@8
),
gleam@result:map(
_pipe@1,
fun(_capture@1) ->
gleam@pair:map_first(
_capture@1,
fun(Field@0) -> {some, Field@0} end
)
end
)
end, fun(_use0@9) ->
{New_signing_key, Rest@9} = _use0@9,
gleam@result:'try'(
utils@serde:deserialize_bool(Rest@9),
fun(_use0@10) ->
{Has_new_voting_key, Rest@10} = _use0@10,
gleam@result:'try'(
case Has_new_voting_key of
false ->
{ok, {none, Rest@10}};
true ->
_pipe@2 = utils@serde:deserialize_bitarray(
Rest@10,
285
),
gleam@result:map(
_pipe@2,
fun(_capture@2) ->
gleam@pair:map_first(
_capture@2,
fun(Field@0) -> {some, Field@0} end
)
end
)
end,
fun(_use0@11) ->
{New_voting_key, Rest@11} = _use0@11,
gleam@result:'try'(
utils@serde:deserialize_bool(
Rest@11
),
fun(_use0@12) ->
{Has_new_reward_address,
Rest@12} = _use0@12,
gleam@result:'try'(
case Has_new_reward_address of
false ->
{ok,
{none,
Rest@12}};
true ->
_pipe@3 = account@address:deserialize(
Rest@12
),
gleam@result:map(
_pipe@3,
fun(
_capture@3
) ->
gleam@pair:map_first(
_capture@3,
fun(Field@0) -> {some, Field@0} end
)
end
)
end,
fun(_use0@13) ->
{New_reward_address,
Rest@13} = _use0@13,
gleam@result:'try'(
utils@serde:deserialize_bool(
Rest@13
),
fun(
_use0@14
) ->
{Has_new_signal_data,
Rest@14} = _use0@14,
gleam@result:'try'(
case Has_new_signal_data of
false ->
{ok,
{none,
Rest@14}};
true ->
gleam@result:'try'(
utils@serde:deserialize_bool(
Rest@14
),
fun(
_use0@15
) ->
{Has_signal_data@1,
Rest@15} = _use0@15,
gleam@result:'try'(
case Has_signal_data@1 of
false ->
{ok,
{none,
Rest@15}};
true ->
_pipe@4 = utils@serde:deserialize_bitarray(
Rest@15,
32
),
gleam@result:map(
_pipe@4,
fun(
_capture@4
) ->
gleam@pair:map_first(
_capture@4,
fun(Field@0) -> {some, Field@0} end
)
end
)
end,
fun(
_use0@16
) ->
{Signal_data@1,
Rest@16} = _use0@16,
{ok,
{{some,
Signal_data@1},
Rest@16}}
end
)
end
)
end,
fun(
_use0@17
) ->
{New_signal_data,
Rest@17} = _use0@17,
gleam@result:'try'(
utils@serde:deserialize_bool(
Rest@17
),
fun(
_use0@18
) ->
{Has_new_proof_of_knowledge,
Rest@18} = _use0@18,
gleam@result:'try'(
case Has_new_proof_of_knowledge of
false ->
{ok,
{none,
Rest@18}};
true ->
_pipe@5 = utils@serde:deserialize_bitarray(
Rest@18,
95
),
gleam@result:map(
_pipe@5,
fun(
_capture@5
) ->
gleam@pair:map_first(
_capture@5,
fun(Field@0) -> {some, Field@0} end
)
end
)
end,
fun(
_use0@19
) ->
{New_proof_of_knowledge,
Rest@19} = _use0@19,
gleam@result:'try'(
transaction@signature_proof:deserialize(
Rest@19
),
fun(
_use0@20
) ->
{Proof@1,
Rest@20} = _use0@20,
{ok,
{{update_validator,
New_signing_key,
New_voting_key,
New_reward_address,
New_signal_data,
New_proof_of_knowledge,
Proof@1},
Rest@20}}
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end)
end
);
2 ->
gleam@result:'try'(
account@address:deserialize(Rest),
fun(_use0@21) ->
{Validator_address, Rest@21} = _use0@21,
gleam@result:'try'(
transaction@signature_proof:deserialize(Rest@21),
fun(_use0@22) ->
{Proof@2, Rest@22} = _use0@22,
{ok,
{{deactivate_validator,
Validator_address,
Proof@2},
Rest@22}}
end
)
end
);
3 ->
gleam@result:'try'(
account@address:deserialize(Rest),
fun(_use0@23) ->
{Validator_address@1, Rest@23} = _use0@23,
gleam@result:'try'(
transaction@signature_proof:deserialize(Rest@23),
fun(_use0@24) ->
{Proof@3, Rest@24} = _use0@24,
{ok,
{{reactivate_validator,
Validator_address@1,
Proof@3},
Rest@24}}
end
)
end
);
4 ->
gleam@result:'try'(
transaction@signature_proof:deserialize(Rest),
fun(_use0@25) ->
{Proof@4, Rest@25} = _use0@25,
{ok, {{retire_validator, Proof@4}, Rest@25}}
end
);
5 ->
gleam@result:'try'(
utils@serde:deserialize_bool(Rest),
fun(_use0@26) ->
{Has_delegation, Rest@26} = _use0@26,
gleam@result:'try'(case Has_delegation of
false ->
{ok, {none, Rest@26}};
true ->
_pipe@6 = account@address:deserialize(
Rest@26
),
gleam@result:map(
_pipe@6,
fun(_capture@6) ->
gleam@pair:map_first(
_capture@6,
fun(Field@0) -> {some, Field@0} end
)
end
)
end, fun(_use0@27) ->
{Delegation, Rest@27} = _use0@27,
gleam@result:'try'(
transaction@signature_proof:deserialize(
Rest@27
),
fun(_use0@28) ->
{Proof@5, Rest@28} = _use0@28,
{ok,
{{create_staker,
Delegation,
Proof@5},
Rest@28}}
end
)
end)
end
);
6 ->
gleam@result:'try'(
account@address:deserialize(Rest),
fun(_use0@29) ->
{Staker_address, Rest@29} = _use0@29,
{ok, {{add_stake, Staker_address}, Rest@29}}
end
);
7 ->
gleam@result:'try'(
utils@serde:deserialize_bool(Rest),
fun(_use0@30) ->
{Has_new_delegation, Rest@30} = _use0@30,
gleam@result:'try'(case Has_new_delegation of
false ->
{ok, {none, Rest@30}};
true ->
_pipe@7 = account@address:deserialize(
Rest@30
),
gleam@result:map(
_pipe@7,
fun(_capture@7) ->
gleam@pair:map_first(
_capture@7,
fun(Field@0) -> {some, Field@0} end
)
end
)
end, fun(_use0@31) ->
{New_delegation, Rest@31} = _use0@31,
gleam@result:'try'(
utils@serde:deserialize_bool(Rest@31),
fun(_use0@32) ->
{Reactivate_all_stake, Rest@32} = _use0@32,
gleam@result:'try'(
transaction@signature_proof:deserialize(
Rest@32
),
fun(_use0@33) ->
{Proof@6, Rest@33} = _use0@33,
{ok,
{{update_staker,
New_delegation,
Reactivate_all_stake,
Proof@6},
Rest@33}}
end
)
end
)
end)
end
);
8 ->
gleam@result:'try'(
utils@serde:deserialize_coin(Rest),
fun(_use0@34) ->
{New_active_balance, Rest@34} = _use0@34,
gleam@result:'try'(
transaction@signature_proof:deserialize(Rest@34),
fun(_use0@35) ->
{Proof@7, Rest@35} = _use0@35,
{ok,
{{set_active_stake,
New_active_balance,
Proof@7},
Rest@35}}
end
)
end
);
9 ->
gleam@result:'try'(
utils@serde:deserialize_coin(Rest),
fun(_use0@36) ->
{Retire_stake, Rest@36} = _use0@36,
gleam@result:'try'(
transaction@signature_proof:deserialize(Rest@36),
fun(_use0@37) ->
{Proof@8, Rest@37} = _use0@37,
{ok,
{{retire_stake, Retire_stake, Proof@8},
Rest@37}}
end
)
end
);
_ ->
{error, <<"Invalid staking data type"/utf8>>}
end
end
).
-file("src/transaction/staking_data.gleam", 252).
-spec deserialize_all(bitstring()) -> {ok, incoming_staking_data()} |
{error, binary()}.
deserialize_all(Buf) ->
case deserialize(Buf) of
{ok, {Data, <<>>}} ->
{ok, Data};
{ok, _} ->
{error, <<"Invalid staking data: trailing bytes"/utf8>>};
{error, Err} ->
{error, Err}
end.
-file("src/transaction/staking_data.gleam", 260).
-spec serialize(gleam@bytes_tree:bytes_tree(), incoming_staking_data()) -> gleam@bytes_tree:bytes_tree().
serialize(Builder, Data) ->
case Data of
{create_validator,
Signing_key,
Voting_key,
Reward_address,
Signal_data,
Proof_of_knowledge,
Proof} ->
Builder@1 = begin
_pipe = Builder,
_pipe@1 = utils@serde:serialize_int(_pipe, 0, 8),
_pipe@2 = key@ed25519@public_key:serialize(_pipe@1, Signing_key),
_pipe@3 = utils@serde:serialize_bitarray(_pipe@2, Voting_key),
_pipe@4 = account@address:serialize(_pipe@3, Reward_address),
utils@serde:serialize_bool(
_pipe@4,
gleam@option:is_some(Signal_data)
)
end,
Builder@2 = case Signal_data of
none ->
Builder@1;
{some, Data@1} ->
_pipe@5 = Builder@1,
utils@serde:serialize_bitarray(_pipe@5, Data@1)
end,
_pipe@6 = Builder@2,
_pipe@7 = utils@serde:serialize_bitarray(
_pipe@6,
Proof_of_knowledge
),
transaction@signature_proof:serialize(_pipe@7, Proof);
{update_validator,
New_signing_key,
New_voting_key,
New_reward_address,
New_signal_data,
New_proof_of_knowledge,
Proof@1} ->
Builder@3 = begin
_pipe@8 = Builder,
_pipe@9 = utils@serde:serialize_int(_pipe@8, 1, 8),
utils@serde:serialize_bool(
_pipe@9,
gleam@option:is_some(New_signing_key)
)
end,
Builder@4 = case New_signing_key of
none ->
Builder@3;
{some, Key} ->
_pipe@10 = Builder@3,
key@ed25519@public_key:serialize(_pipe@10, Key)
end,
Builder@5 = begin
_pipe@11 = Builder@4,
utils@serde:serialize_bool(
_pipe@11,
gleam@option:is_some(New_voting_key)
)
end,
Builder@6 = case New_voting_key of
none ->
Builder@5;
{some, Key@1} ->
_pipe@12 = Builder@5,
utils@serde:serialize_bitarray(_pipe@12, Key@1)
end,
Builder@7 = begin
_pipe@13 = Builder@6,
utils@serde:serialize_bool(
_pipe@13,
gleam@option:is_some(New_reward_address)
)
end,
Builder@8 = case New_reward_address of
none ->
Builder@7;
{some, Address} ->
_pipe@14 = Builder@7,
account@address:serialize(_pipe@14, Address)
end,
Builder@9 = begin
_pipe@15 = Builder@8,
utils@serde:serialize_bool(
_pipe@15,
gleam@option:is_some(New_signal_data)
)
end,
Builder@11 = case New_signal_data of
none ->
Builder@9;
{some, Signal_data@1} ->
Builder@10 = begin
_pipe@16 = Builder@9,
utils@serde:serialize_bool(
_pipe@16,
gleam@option:is_some(Signal_data@1)
)
end,
case Signal_data@1 of
none ->
Builder@10;
{some, Signal_data@2} ->
_pipe@17 = Builder@10,
utils@serde:serialize_bitarray(
_pipe@17,
Signal_data@2
)
end
end,
Builder@12 = begin
_pipe@18 = Builder@11,
utils@serde:serialize_bool(
_pipe@18,
gleam@option:is_some(New_proof_of_knowledge)
)
end,
Builder@13 = case New_proof_of_knowledge of
none ->
Builder@12;
{some, Proof@2} ->
_pipe@19 = Builder@12,
utils@serde:serialize_bitarray(_pipe@19, Proof@2)
end,
_pipe@20 = Builder@13,
transaction@signature_proof:serialize(_pipe@20, Proof@1);
{deactivate_validator, Validator_address, Proof@3} ->
_pipe@21 = Builder,
_pipe@22 = utils@serde:serialize_int(_pipe@21, 2, 8),
_pipe@23 = account@address:serialize(_pipe@22, Validator_address),
transaction@signature_proof:serialize(_pipe@23, Proof@3);
{reactivate_validator, Validator_address@1, Proof@4} ->
_pipe@24 = Builder,
_pipe@25 = utils@serde:serialize_int(_pipe@24, 3, 8),
_pipe@26 = account@address:serialize(_pipe@25, Validator_address@1),
transaction@signature_proof:serialize(_pipe@26, Proof@4);
{retire_validator, Proof@5} ->
_pipe@27 = Builder,
_pipe@28 = utils@serde:serialize_int(_pipe@27, 4, 8),
transaction@signature_proof:serialize(_pipe@28, Proof@5);
{create_staker, Delegation, Proof@6} ->
Builder@14 = begin
_pipe@29 = Builder,
_pipe@30 = utils@serde:serialize_int(_pipe@29, 5, 8),
utils@serde:serialize_bool(
_pipe@30,
gleam@option:is_some(Delegation)
)
end,
Builder@15 = case Delegation of
none ->
Builder@14;
{some, Address@1} ->
_pipe@31 = Builder@14,
account@address:serialize(_pipe@31, Address@1)
end,
_pipe@32 = Builder@15,
transaction@signature_proof:serialize(_pipe@32, Proof@6);
{add_stake, Staker_address} ->
_pipe@33 = Builder,
_pipe@34 = utils@serde:serialize_int(_pipe@33, 6, 8),
account@address:serialize(_pipe@34, Staker_address);
{update_staker, New_delegation, Reactivate_all_stake, Proof@7} ->
Builder@16 = begin
_pipe@35 = Builder,
_pipe@36 = utils@serde:serialize_int(_pipe@35, 7, 8),
utils@serde:serialize_bool(
_pipe@36,
gleam@option:is_some(New_delegation)
)
end,
Builder@17 = case New_delegation of
none ->
Builder@16;
{some, Address@2} ->
_pipe@37 = Builder@16,
account@address:serialize(_pipe@37, Address@2)
end,
_pipe@38 = Builder@17,
_pipe@39 = utils@serde:serialize_bool(
_pipe@38,
Reactivate_all_stake
),
transaction@signature_proof:serialize(_pipe@39, Proof@7);
{set_active_stake, New_active_balance, Proof@8} ->
_pipe@40 = Builder,
_pipe@41 = utils@serde:serialize_int(_pipe@40, 8, 8),
_pipe@42 = utils@serde:serialize_coin(_pipe@41, New_active_balance),
transaction@signature_proof:serialize(_pipe@42, Proof@8);
{retire_stake, Retire_stake, Proof@9} ->
_pipe@43 = Builder,
_pipe@44 = utils@serde:serialize_int(_pipe@43, 9, 8),
_pipe@45 = utils@serde:serialize_coin(_pipe@44, Retire_stake),
transaction@signature_proof:serialize(_pipe@45, Proof@9)
end.
-file("src/transaction/staking_data.gleam", 396).
-spec serialize_to_bits(incoming_staking_data()) -> bitstring().
serialize_to_bits(Data) ->
_pipe = gleam@bytes_tree:new(),
_pipe@1 = serialize(_pipe, Data),
erlang:list_to_bitstring(_pipe@1).
-file("src/transaction/staking_data.gleam", 400).
-spec to_hex(incoming_staking_data()) -> binary().
to_hex(Data) ->
_pipe = Data,
_pipe@1 = serialize_to_bits(_pipe),
utils@misc:to_hex(_pipe@1).
-file("src/transaction/staking_data.gleam", 409).
-spec to_int(outgoing_staking_data()) -> integer().
to_int(Data) ->
case Data of
delete_validator ->
0;
remove_stake ->
1
end.
-file("src/transaction/staking_data.gleam", 416).
-spec from_int(integer()) -> {ok, outgoing_staking_data()} | {error, binary()}.
from_int(Value) ->
case Value of
0 ->
{ok, delete_validator};
1 ->
{ok, remove_stake};
_ ->
{error,
<<"Invalid outgoing staking data: "/utf8,
(erlang:integer_to_binary(Value))/binary>>}
end.