From 9c9248a9ae1791152d88c9c36574b4becdf5e8b6 Mon Sep 17 00:00:00 2001 From: ton Date: Wed, 16 Oct 2019 13:00:43 +0400 Subject: [PATCH] updated func - updated func - deleted autogenerated files from git - updated liteclient - increase state sync timeout --- .gitignore | 1 + crypto/block/check-proof.cpp | 11 +- crypto/block/check-proof.h | 6 +- crypto/block/transaction.cpp | 7 +- crypto/func/builtins.cpp | 100 +- crypto/func/func.h | 25 +- crypto/func/keywords.cpp | 25 +- crypto/func/parse-func.cpp | 118 +- crypto/func/test/a6.fc | 18 +- crypto/func/test/a6_3.fc | 22 + crypto/func/unify-types.cpp | 14 +- crypto/smartcont/auto/config-code.cpp | 1 - crypto/smartcont/auto/config-code.fif | 323 ---- crypto/smartcont/auto/elector-code.cpp | 1 - crypto/smartcont/auto/elector-code.fif | 1712 ----------------- .../smartcont/auto/highload-wallet-code.cpp | 1 - .../smartcont/auto/highload-wallet-code.fif | 79 - .../auto/highload-wallet-v2-code.cpp | 1 - .../auto/highload-wallet-v2-code.fif | 134 -- crypto/smartcont/auto/simple-wallet-code.cpp | 1 - crypto/smartcont/auto/simple-wallet-code.fif | 45 - crypto/smartcont/auto/wallet-code.cpp | 1 - crypto/smartcont/auto/wallet-code.fif | 59 - crypto/smartcont/stdlib.fc | 16 + lite-client/lite-client.cpp | 39 +- lite-client/lite-client.h | 2 + validator/manager.cpp | 3 +- validator/net/download-state.cpp | 2 +- 28 files changed, 302 insertions(+), 2465 deletions(-) create mode 100644 crypto/func/test/a6_3.fc delete mode 100644 crypto/smartcont/auto/config-code.cpp delete mode 100644 crypto/smartcont/auto/config-code.fif delete mode 100644 crypto/smartcont/auto/elector-code.cpp delete mode 100644 crypto/smartcont/auto/elector-code.fif delete mode 100644 crypto/smartcont/auto/highload-wallet-code.cpp delete mode 100644 crypto/smartcont/auto/highload-wallet-code.fif delete mode 100644 crypto/smartcont/auto/highload-wallet-v2-code.cpp delete mode 100644 crypto/smartcont/auto/highload-wallet-v2-code.fif delete mode 100644 crypto/smartcont/auto/simple-wallet-code.cpp delete mode 100644 crypto/smartcont/auto/simple-wallet-code.fif delete mode 100644 crypto/smartcont/auto/wallet-code.cpp delete mode 100644 crypto/smartcont/auto/wallet-code.fif diff --git a/.gitignore b/.gitignore index cc307279..44ed769e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ compile_commands.json crypto/block/block-auto.cpp crypto/block/block-auto.h crypto/smartcont/*-code.fif +crypto/smartcont/auto/ test/regression-tests.cache/ *.swp **/*build*/ diff --git a/crypto/block/check-proof.cpp b/crypto/block/check-proof.cpp index 98d2c1cf..7bc21eb3 100644 --- a/crypto/block/check-proof.cpp +++ b/crypto/block/check-proof.cpp @@ -32,7 +32,7 @@ namespace block { using namespace std::literals::string_literals; td::Status check_block_header_proof(td::Ref root, ton::BlockIdExt blkid, ton::Bits256* store_shard_hash_to, - bool check_state_hash, td::uint32* save_utime) { + bool check_state_hash, td::uint32* save_utime, ton::LogicalTime* save_lt) { ton::RootHash vhash{root->get_hash().bits()}; if (vhash != blkid.root_hash) { return td::Status::Error(PSTRING() << " block header for block " << blkid.to_str() << " has incorrect root hash " @@ -50,6 +50,9 @@ td::Status check_block_header_proof(td::Ref root, ton::BlockIdExt blki if (save_utime) { *save_utime = info.gen_utime; } + if (save_lt) { + *save_lt = info.end_lt; + } if (store_shard_hash_to) { vm::CellSlice upd_cs{vm::NoVmSpec(), blk.state_update}; if (!(upd_cs.is_special() && upd_cs.prefetch_long(8) == 4 // merkle update @@ -157,7 +160,7 @@ td::Status check_shard_proof(ton::BlockIdExt blk, ton::BlockIdExt shard_blk, td: td::Status check_account_proof(td::Slice proof, ton::BlockIdExt shard_blk, const block::StdAddress& addr, td::Ref root, ton::LogicalTime* last_trans_lt, ton::Bits256* last_trans_hash, - td::uint32* save_utime) { + td::uint32* save_utime, ton::LogicalTime* save_lt) { TRY_RESULT_PREFIX(Q_roots, vm::std_boc_deserialize_multi(std::move(proof)), "cannot deserialize account proof"); if (Q_roots.size() != 2) { return td::Status::Error(PSLICE() << "account state proof must have exactly two roots"); @@ -174,7 +177,7 @@ td::Status check_account_proof(td::Slice proof, ton::BlockIdExt shard_blk, const } ton::Bits256 state_hash = state_root->get_hash().bits(); TRY_STATUS_PREFIX(check_block_header_proof(vm::MerkleProof::virtualize(std::move(Q_roots[0]), 1), shard_blk, - &state_hash, true, save_utime), + &state_hash, true, save_utime, save_lt), "error in account shard block header proof : "); block::gen::ShardStateUnsplit::Record sstate; if (!(tlb::unpack_cell(std::move(state_root), sstate))) { @@ -238,7 +241,7 @@ td::Result AccountState::validate(ton::BlockIdExt ref_blk, b Info res; TRY_STATUS(block::check_account_proof(proof.as_slice(), shard_blk, addr, root, &res.last_trans_lt, - &res.last_trans_hash, &res.gen_utime)); + &res.last_trans_hash, &res.gen_utime, &res.gen_lt)); res.root = std::move(root); return res; diff --git a/crypto/block/check-proof.h b/crypto/block/check-proof.h index 87d6b442..173ae9e4 100644 --- a/crypto/block/check-proof.h +++ b/crypto/block/check-proof.h @@ -26,11 +26,12 @@ using td::Ref; td::Status check_block_header_proof(td::Ref root, ton::BlockIdExt blkid, ton::Bits256* store_shard_hash_to = nullptr, bool check_state_hash = false, - td::uint32* save_utime = nullptr); + td::uint32* save_utime = nullptr, ton::LogicalTime* save_lt = nullptr); td::Status check_shard_proof(ton::BlockIdExt blk, ton::BlockIdExt shard_blk, td::Slice shard_proof); td::Status check_account_proof(td::Slice proof, ton::BlockIdExt shard_blk, const block::StdAddress& addr, td::Ref root, ton::LogicalTime* last_trans_lt = nullptr, - ton::Bits256* last_trans_hash = nullptr, td::uint32* save_utime = nullptr); + ton::Bits256* last_trans_hash = nullptr, td::uint32* save_utime = nullptr, + ton::LogicalTime* save_lt = nullptr); td::Result check_state_proof(ton::BlockIdExt blkid, td::Slice proof); td::Result> check_extract_state_proof(ton::BlockIdExt blkid, td::Slice proof, td::Slice data); @@ -48,6 +49,7 @@ struct AccountState { td::Ref root; ton::LogicalTime last_trans_lt = 0; ton::Bits256 last_trans_hash; + ton::LogicalTime gen_lt{0}; td::uint32 gen_utime{0}; }; diff --git a/crypto/block/transaction.cpp b/crypto/block/transaction.cpp index 1e0084e9..bc6d8e22 100644 --- a/crypto/block/transaction.cpp +++ b/crypto/block/transaction.cpp @@ -806,7 +806,6 @@ bool Transaction::prepare_rand_seed(td::BitArray<256>& rand_seed, const ComputeP } Ref Transaction::prepare_vm_c7(const ComputePhaseConfig& cfg) const { - // TODO: fix initialization of c7 td::BitArray<256> rand_seed; td::RefInt256 rand_seed_int{true}; if (!(prepare_rand_seed(rand_seed, cfg) && rand_seed_int.unique_write().import_bits(rand_seed.cbits(), 256, false))) { @@ -1305,9 +1304,9 @@ bool Transaction::check_rewrite_dest_addr(Ref& dest_addr, const A int Transaction::try_action_send_msg(const vm::CellSlice& cs0, ActionPhase& ap, const ActionPhaseConfig& cfg, int redoing) { block::gen::OutAction::Record_action_send_msg act_rec; - // mode: +128 = attach all remaining balance, +64 = attach all remaining balance of the inbound message, +1 = pay message fees, +2 = skip if message cannot be sent + // mode: +128 = attach all remaining balance, +64 = attach all remaining balance of the inbound message, +32 = delete smart contract if balance becomes zero, +1 = pay message fees, +2 = skip if message cannot be sent vm::CellSlice cs{cs0}; - if (!tlb::unpack_exact(cs, act_rec) || (act_rec.mode & ~0xc3) || (act_rec.mode & 0xc0) == 0xc0) { + if (!tlb::unpack_exact(cs, act_rec) || (act_rec.mode & ~0xe3) || (act_rec.mode & 0xc0) == 0xc0) { return -1; } bool skip_invalid = (act_rec.mode & 2); @@ -1574,7 +1573,7 @@ int Transaction::try_action_send_msg(const vm::CellSlice& cs0, ActionPhase& ap, ap.total_action_fees += fees_collected; ap.total_fwd_fees += fees_total; - if (act_rec.mode & 0x80) { + if ((act_rec.mode & 0xa0) == 0xa0) { CHECK(ap.remaining_balance.is_zero()); ap.acc_delete_req = ap.reserved_balance.is_zero(); } diff --git a/crypto/func/builtins.cpp b/crypto/func/builtins.cpp index f9434b5b..dd156f24 100644 --- a/crypto/func/builtins.cpp +++ b/crypto/func/builtins.cpp @@ -50,15 +50,15 @@ void define_builtin_func(std::string name, TypeExpr* func_type, const T& func, b } template -void define_builtin_func_x(std::string name, TypeExpr* func_type, const T& func, std::initializer_list arg_order, - std::initializer_list ret_order = {}, bool impure = false) { +void define_builtin_func(std::string name, TypeExpr* func_type, const T& func, std::initializer_list arg_order, + std::initializer_list ret_order = {}, bool impure = false) { SymDef* def = predefine_builtin_func(name, func_type); def->value = new SymValAsmFunc{func_type, func, arg_order, ret_order, impure}; } -void define_builtin_func_x(std::string name, TypeExpr* func_type, const AsmOp& macro, - std::initializer_list arg_order, std::initializer_list ret_order = {}, - bool impure = false) { +void define_builtin_func(std::string name, TypeExpr* func_type, const AsmOp& macro, + std::initializer_list arg_order, std::initializer_list ret_order = {}, + bool impure = false) { SymDef* def = predefine_builtin_func(name, func_type); def->value = new SymValAsmFunc{func_type, make_simple_compile(macro), arg_order, ret_order, impure}; } @@ -429,10 +429,14 @@ AsmOp compile_mul(std::vector& res, std::vector& args) { } return exec_arg_op("MULCONST", y.int_const, 1); } - if (k >= 0) { + if (k > 0) { y.unused(); return exec_arg_op("LSHIFT#", k, 1); } + if (k == 0) { + y.unused(); + return AsmOp::Nop(); + } } if (x.is_int_const()) { int k = is_pos_pow2(x.int_const); @@ -451,10 +455,14 @@ AsmOp compile_mul(std::vector& res, std::vector& args) { } return exec_arg_op("MULCONST", x.int_const, 1); } - if (k >= 0) { + if (k > 0) { x.unused(); return exec_arg_op("LSHIFT#", k, 1); } + if (k == 0) { + x.unused(); + return AsmOp::Nop(); + } } return exec_op("MUL", 2); } @@ -848,10 +856,7 @@ void define_builtins() { auto X = TypeExpr::new_var(); auto Y = TypeExpr::new_var(); auto Z = TypeExpr::new_var(); - auto T = TypeExpr::new_var(); auto XY = TypeExpr::new_tensor({X, Y}); - auto XYZ = TypeExpr::new_tensor({X, Y, Z}); - auto XYZT = TypeExpr::new_tensor({X, Y, Z, T}); auto arith_bin_op = TypeExpr::new_map(Int2, Int); auto arith_un_op = TypeExpr::new_map(Int, Int); auto impure_bin_op = TypeExpr::new_map(Int2, Unit); @@ -869,16 +874,20 @@ void define_builtins() { define_builtin_func("-_", arith_un_op, compile_negate); define_builtin_func("_*_", arith_bin_op, compile_mul); define_builtin_func("_/_", arith_bin_op, std::bind(compile_div, _1, _2, -1)); - define_builtin_func("_/~_", arith_bin_op, std::bind(compile_div, _1, _2, 0)); - define_builtin_func("_/^_", arith_bin_op, std::bind(compile_div, _1, _2, 1)); + define_builtin_func("_~/_", arith_bin_op, std::bind(compile_div, _1, _2, 0)); + define_builtin_func("_^/_", arith_bin_op, std::bind(compile_div, _1, _2, 1)); define_builtin_func("_%_", arith_bin_op, std::bind(compile_mod, _1, _2, -1)); - define_builtin_func("_%~_", arith_bin_op, std::bind(compile_mod, _1, _2, 0)); - define_builtin_func("_%^_", arith_bin_op, std::bind(compile_mod, _1, _2, -1)); + define_builtin_func("_~%_", arith_bin_op, std::bind(compile_mod, _1, _2, 0)); + define_builtin_func("_^%_", arith_bin_op, std::bind(compile_mod, _1, _2, 1)); define_builtin_func("_/%_", TypeExpr::new_map(Int2, Int2), AsmOp::Custom("DIVMOD", 2, 2)); + define_builtin_func("divmod", TypeExpr::new_map(Int2, Int2), AsmOp::Custom("DIVMOD", 2, 2)); + define_builtin_func("~divmod", TypeExpr::new_map(Int2, Int2), AsmOp::Custom("DIVMOD", 2, 2)); + define_builtin_func("moddiv", TypeExpr::new_map(Int2, Int2), AsmOp::Custom("DIVMOD", 2, 2), {}, {1, 0}); + define_builtin_func("~moddiv", TypeExpr::new_map(Int2, Int2), AsmOp::Custom("DIVMOD", 2, 2), {}, {1, 0}); define_builtin_func("_<<_", arith_bin_op, compile_lshift); define_builtin_func("_>>_", arith_bin_op, std::bind(compile_rshift, _1, _2, -1)); - define_builtin_func("_>>~_", arith_bin_op, std::bind(compile_rshift, _1, _2, 0)); - define_builtin_func("_>>^_", arith_bin_op, std::bind(compile_rshift, _1, _2, 1)); + define_builtin_func("_~>>_", arith_bin_op, std::bind(compile_rshift, _1, _2, 0)); + define_builtin_func("_^>>_", arith_bin_op, std::bind(compile_rshift, _1, _2, 1)); define_builtin_func("_&_", arith_bin_op, AsmOp::Custom("AND", 2)); define_builtin_func("_|_", arith_bin_op, AsmOp::Custom("OR", 2)); define_builtin_func("_^_", arith_bin_op, AsmOp::Custom("XOR", 2)); @@ -887,15 +896,15 @@ void define_builtins() { define_builtin_func("^_-=_", arith_bin_op, compile_sub); define_builtin_func("^_*=_", arith_bin_op, compile_mul); define_builtin_func("^_/=_", arith_bin_op, std::bind(compile_div, _1, _2, -1)); - define_builtin_func("^_/~=_", arith_bin_op, std::bind(compile_div, _1, _2, 0)); - define_builtin_func("^_/^=_", arith_bin_op, std::bind(compile_div, _1, _2, 1)); + define_builtin_func("^_~/=_", arith_bin_op, std::bind(compile_div, _1, _2, 0)); + define_builtin_func("^_^/=_", arith_bin_op, std::bind(compile_div, _1, _2, 1)); define_builtin_func("^_%=_", arith_bin_op, std::bind(compile_mod, _1, _2, -1)); - define_builtin_func("^_%~=_", arith_bin_op, std::bind(compile_mod, _1, _2, 0)); - define_builtin_func("^_%^=_", arith_bin_op, std::bind(compile_mod, _1, _2, 1)); + define_builtin_func("^_~%=_", arith_bin_op, std::bind(compile_mod, _1, _2, 0)); + define_builtin_func("^_^%=_", arith_bin_op, std::bind(compile_mod, _1, _2, 1)); define_builtin_func("^_<<=_", arith_bin_op, compile_lshift); define_builtin_func("^_>>=_", arith_bin_op, std::bind(compile_rshift, _1, _2, -1)); - define_builtin_func("^_>>~=_", arith_bin_op, std::bind(compile_rshift, _1, _2, 0)); - define_builtin_func("^_>>^=_", arith_bin_op, std::bind(compile_rshift, _1, _2, 1)); + define_builtin_func("^_~>>=_", arith_bin_op, std::bind(compile_rshift, _1, _2, 0)); + define_builtin_func("^_^>>=_", arith_bin_op, std::bind(compile_rshift, _1, _2, 1)); define_builtin_func("^_&=_", arith_bin_op, AsmOp::Custom("AND", 2)); define_builtin_func("^_|=_", arith_bin_op, AsmOp::Custom("OR", 2)); define_builtin_func("^_^=_", arith_bin_op, AsmOp::Custom("XOR", 2)); @@ -915,42 +924,18 @@ void define_builtins() { define_builtin_func("nil", Tuple, AsmOp::Const("PUSHNULL")); define_builtin_func("Nil", Tuple, AsmOp::Const("NIL")); define_builtin_func("null?", TypeExpr::new_forall({X}, TypeExpr::new_map(X, Int)), compile_is_null); - define_builtin_func("cons", TypeExpr::new_forall({X}, TypeExpr::new_map(TypeExpr::new_tensor(X, Tuple), Tuple)), - AsmOp::Custom("CONS", 2, 1)); - define_builtin_func("uncons", TypeExpr::new_forall({X}, TypeExpr::new_map(Tuple, TypeExpr::new_tensor(X, Tuple))), - AsmOp::Custom("UNCONS", 1, 2)); - define_builtin_func_x("list_next", - TypeExpr::new_forall({X}, TypeExpr::new_map(Tuple, TypeExpr::new_tensor(Tuple, X))), - AsmOp::Custom("UNCONS", 1, 2), {}, {1, 0}); - define_builtin_func("car", TypeExpr::new_forall({X}, TypeExpr::new_map(Tuple, X)), AsmOp::Custom("CAR", 1, 1)); - define_builtin_func("cdr", TypeExpr::new_map(Tuple, Tuple), AsmOp::Custom("CDR", 1, 1)); - define_builtin_func("pair", TypeExpr::new_forall({X, Y}, TypeExpr::new_map(XY, Tuple)), AsmOp::Custom("PAIR", 2, 1)); - define_builtin_func("unpair", TypeExpr::new_forall({X, Y}, TypeExpr::new_map(Tuple, XY)), - AsmOp::Custom("UNPAIR", 1, 2)); - define_builtin_func("triple", TypeExpr::new_forall({X, Y, Z}, TypeExpr::new_map(XYZ, Tuple)), - AsmOp::Custom("TRIPLE", 3, 1)); - define_builtin_func("untriple", TypeExpr::new_forall({X, Y, Z}, TypeExpr::new_map(Tuple, XYZ)), - AsmOp::Custom("UNTRIPLE", 1, 3)); - define_builtin_func("tuple4", TypeExpr::new_forall({X, Y, Z, T}, TypeExpr::new_map(XYZT, Tuple)), - AsmOp::Custom("4 TUPLE", 4, 1)); - define_builtin_func("untuple4", TypeExpr::new_forall({X, Y, Z, T}, TypeExpr::new_map(Tuple, XYZT)), - AsmOp::Custom("4 UNTUPLE", 1, 4)); - define_builtin_func("first", TypeExpr::new_forall({X}, TypeExpr::new_map(Tuple, X)), AsmOp::Custom("FIRST", 1, 1)); - define_builtin_func("second", TypeExpr::new_forall({X}, TypeExpr::new_map(Tuple, X)), AsmOp::Custom("SECOND", 1, 1)); - define_builtin_func("third", TypeExpr::new_forall({X}, TypeExpr::new_map(Tuple, X)), AsmOp::Custom("THIRD", 1, 1)); - define_builtin_func("fourth", TypeExpr::new_forall({X}, TypeExpr::new_map(Tuple, X)), AsmOp::Custom("3 INDEX", 1, 1)); define_builtin_func("throw", impure_un_op, compile_throw, true); define_builtin_func("throw_if", impure_bin_op, std::bind(compile_cond_throw, _1, _2, true), true); define_builtin_func("throw_unless", impure_bin_op, std::bind(compile_cond_throw, _1, _2, false), true); - define_builtin_func_x("load_int", fetch_int_op, std::bind(compile_fetch_int, _1, _2, true, true), {}, {1, 0}); - define_builtin_func_x("load_uint", fetch_int_op, std::bind(compile_fetch_int, _1, _2, true, false), {}, {1, 0}); + define_builtin_func("load_int", fetch_int_op, std::bind(compile_fetch_int, _1, _2, true, true), {}, {1, 0}); + define_builtin_func("load_uint", fetch_int_op, std::bind(compile_fetch_int, _1, _2, true, false), {}, {1, 0}); define_builtin_func("preload_int", prefetch_int_op, std::bind(compile_fetch_int, _1, _2, false, true)); define_builtin_func("preload_uint", prefetch_int_op, std::bind(compile_fetch_int, _1, _2, false, false)); - define_builtin_func_x("store_int", store_int_op, std::bind(compile_store_int, _1, _2, true), {1, 0, 2}); - define_builtin_func_x("store_uint", store_int_op, std::bind(compile_store_int, _1, _2, false), {1, 0, 2}); - define_builtin_func_x("~store_int", store_int_method, std::bind(compile_store_int, _1, _2, true), {1, 0, 2}); - define_builtin_func_x("~store_uint", store_int_method, std::bind(compile_store_int, _1, _2, false), {1, 0, 2}); - define_builtin_func_x("load_bits", fetch_slice_op, std::bind(compile_fetch_slice, _1, _2, true), {}, {1, 0}); + define_builtin_func("store_int", store_int_op, std::bind(compile_store_int, _1, _2, true), {1, 0, 2}); + define_builtin_func("store_uint", store_int_op, std::bind(compile_store_int, _1, _2, false), {1, 0, 2}); + define_builtin_func("~store_int", store_int_method, std::bind(compile_store_int, _1, _2, true), {1, 0, 2}); + define_builtin_func("~store_uint", store_int_method, std::bind(compile_store_int, _1, _2, false), {1, 0, 2}); + define_builtin_func("load_bits", fetch_slice_op, std::bind(compile_fetch_slice, _1, _2, true), {}, {1, 0}); define_builtin_func("preload_bits", prefetch_slice_op, std::bind(compile_fetch_slice, _1, _2, false)); define_builtin_func("int_at", TypeExpr::new_map(TupleInt, Int), compile_tuple_at); define_builtin_func("cell_at", TypeExpr::new_map(TupleInt, Cell), compile_tuple_at); @@ -967,13 +952,12 @@ void define_builtins() { AsmOp::Custom("s0 DUMP", 1, 1)); define_builtin_func("run_method0", TypeExpr::new_map(Int, Unit), [](auto a, auto b, auto c) { return compile_run_method(a, b, c, 0, false); }, true); - define_builtin_func_x("run_method1", - TypeExpr::new_forall({X}, TypeExpr::new_map(TypeExpr::new_tensor({Int, X}), Unit)), - [](auto a, auto b, auto c) { return compile_run_method(a, b, c, 1, false); }, {1, 0}, {}, true); - define_builtin_func_x( + define_builtin_func("run_method1", TypeExpr::new_forall({X}, TypeExpr::new_map(TypeExpr::new_tensor({Int, X}), Unit)), + [](auto a, auto b, auto c) { return compile_run_method(a, b, c, 1, false); }, {1, 0}, {}, true); + define_builtin_func( "run_method2", TypeExpr::new_forall({X, Y}, TypeExpr::new_map(TypeExpr::new_tensor({Int, X, Y}), Unit)), [](auto a, auto b, auto c) { return compile_run_method(a, b, c, 2, false); }, {1, 2, 0}, {}, true); - define_builtin_func_x( + define_builtin_func( "run_method3", TypeExpr::new_forall({X, Y, Z}, TypeExpr::new_map(TypeExpr::new_tensor({Int, X, Y, Z}), Unit)), [](auto a, auto b, auto c) { return compile_run_method(a, b, c, 3, false); }, {1, 2, 3, 0}, {}, true); } diff --git a/crypto/func/func.h b/crypto/func/func.h index 77d1efd7..d1481299 100644 --- a/crypto/func/func.h +++ b/crypto/func/func.h @@ -67,6 +67,8 @@ enum Keyword { _RshiftC, _DivR, _DivC, + _ModR, + _ModC, _DivMod, _PlusLet, _MinusLet, @@ -75,6 +77,8 @@ enum Keyword { _DivRLet, _DivCLet, _ModLet, + _ModRLet, + _ModCLet, _LshiftLet, _RshiftLet, _RshiftRLet, @@ -90,6 +94,7 @@ enum Keyword { _Tuple, _Type, _Mapsto, + _Forall, _Asm, _Impure, _Extern, @@ -128,7 +133,7 @@ class IdSc { */ struct TypeExpr { - enum te_type { te_Unknown, te_Indirect, te_Atomic, te_Tensor, te_Map, te_Type, te_ForAll } constr; + enum te_type { te_Unknown, te_Var, te_Indirect, te_Atomic, te_Tensor, te_Map, te_Type, te_ForAll } constr; enum { _Int = Keyword::_Int, _Cell = Keyword::_Cell, @@ -173,6 +178,9 @@ struct TypeExpr { bool is_int() const { return is_atomic(_Int); } + bool is_var() const { + return constr == te_Var; + } bool has_fixed_width() const { return minw == maxw; } @@ -215,7 +223,10 @@ struct TypeExpr { return new_tensor({te1, te2, te3}); } static TypeExpr* new_var() { - return new TypeExpr{te_Unknown, --type_vars, 1}; + return new TypeExpr{te_Var, --type_vars, 1}; + } + static TypeExpr* new_var(int idx) { + return new TypeExpr{te_Var, idx, 1}; } static TypeExpr* new_forall(std::vector list, TypeExpr* body) { return new TypeExpr{te_ForAll, body, std::move(list)}; @@ -724,6 +735,16 @@ struct SymValCodeFunc : SymValFunc { } }; +struct SymValType : sym::SymValBase { + TypeExpr* sym_type; + SymValType(int _type, int _idx, TypeExpr* _stype = nullptr) : sym::SymValBase(_type, _idx), sym_type(_stype) { + } + ~SymValType() override = default; + TypeExpr* get_type() const { + return sym_type; + } +}; + extern int glob_func_cnt, undef_func_cnt; extern std::vector glob_func; diff --git a/crypto/func/keywords.cpp b/crypto/func/keywords.cpp index b2b6120a..c640f4fe 100644 --- a/crypto/func/keywords.cpp +++ b/crypto/func/keywords.cpp @@ -54,6 +54,7 @@ void define_keywords() { .add_kw_char('>') .add_kw_char('&') .add_kw_char('|') + .add_kw_char('^') .add_kw_char('~'); using Kw = funC::Keyword; @@ -64,22 +65,26 @@ void define_keywords() { .add_keyword("<=>", Kw::_Spaceship) .add_keyword("<<", Kw::_Lshift) .add_keyword(">>", Kw::_Rshift) - .add_keyword(">>~", Kw::_RshiftR) - .add_keyword(">>^", Kw::_RshiftC) - .add_keyword("/~", Kw::_DivR) - .add_keyword("/^", Kw::_DivC) + .add_keyword("~>>", Kw::_RshiftR) + .add_keyword("^>>", Kw::_RshiftC) + .add_keyword("~/", Kw::_DivR) + .add_keyword("^/", Kw::_DivC) + .add_keyword("~%", Kw::_ModR) + .add_keyword("^%", Kw::_ModC) .add_keyword("/%", Kw::_DivMod) .add_keyword("+=", Kw::_PlusLet) .add_keyword("-=", Kw::_MinusLet) .add_keyword("*=", Kw::_TimesLet) .add_keyword("/=", Kw::_DivLet) + .add_keyword("~/=", Kw::_DivRLet) + .add_keyword("^/=", Kw::_DivCLet) .add_keyword("%=", Kw::_ModLet) - .add_keyword("/~=", Kw::_DivRLet) - .add_keyword("/^=", Kw::_DivCLet) + .add_keyword("~%=", Kw::_ModRLet) + .add_keyword("^%=", Kw::_ModCLet) .add_keyword("<<=", Kw::_LshiftLet) .add_keyword(">>=", Kw::_RshiftLet) - .add_keyword(">>~=", Kw::_RshiftRLet) - .add_keyword(">>^=", Kw::_RshiftCLet) + .add_keyword("~>>=", Kw::_RshiftRLet) + .add_keyword("^>>=", Kw::_RshiftCLet) .add_keyword("&=", Kw::_AndLet) .add_keyword("|=", Kw::_OrLet) .add_keyword("^=", Kw::_XorLet); @@ -103,7 +108,9 @@ void define_keywords() { .add_keyword("builder", Kw::_Builder) .add_keyword("cont", Kw::_Cont) .add_keyword("tuple", Kw::_Tuple) - .add_keyword("->", Kw::_Mapsto); + .add_keyword("type", Kw::_Type) + .add_keyword("->", Kw::_Mapsto) + .add_keyword("forall", Kw::_Forall); sym::symbols.add_keyword("extern", Kw::_Extern) .add_keyword("asm", Kw::_Asm) diff --git a/crypto/func/parse-func.cpp b/crypto/func/parse-func.cpp index 29c79283..e0407791 100644 --- a/crypto/func/parse-func.cpp +++ b/crypto/func/parse-func.cpp @@ -89,6 +89,15 @@ TypeExpr* parse_type1(Lexer& lex) { case '_': lex.next(); return TypeExpr::new_hole(); + case _Ident: { + auto sym = sym::lookup_symbol(lex.cur().val); + if (sym && dynamic_cast(sym->value)) { + auto val = dynamic_cast(sym->value); + lex.next(); + return val->get_type(); + } + lex.cur().error_at("`", "` is not a type identifier"); + } } lex.expect('('); if (lex.tp() == ')') { @@ -133,7 +142,14 @@ FormalArg parse_formal_arg(Lexer& lex, int fa_idx) { } else if (lex.tp() != _Ident) { arg_type = parse_type(lex); } else { - arg_type = TypeExpr::new_hole(); + auto sym = sym::lookup_symbol(lex.cur().val); + if (sym && dynamic_cast(sym->value)) { + auto val = dynamic_cast(sym->value); + lex.next(); + arg_type = val->get_type(); + } else { + arg_type = TypeExpr::new_hole(); + } } if (lex.tp() == '_' || lex.tp() == ',' || lex.tp() == ')') { if (lex.tp() == '_') { @@ -147,6 +163,9 @@ FormalArg parse_formal_arg(Lexer& lex, int fa_idx) { } loc = lex.cur().loc; SymDef* new_sym_def = sym::define_symbol(lex.cur().val, true, loc); + if (!new_sym_def) { + lex.cur().error_at("cannot define symbol `", "`"); + } if (new_sym_def->value) { lex.cur().error_at("redefined formal parameter `", "`"); } @@ -295,6 +314,15 @@ Expr* parse_expr100(Lexer& lex, CodeBlob& code, bool nv) { return res; } if (t == _Ident) { + auto sym = sym::lookup_symbol(lex.cur().val); + if (sym && dynamic_cast(sym->value)) { + auto val = dynamic_cast(sym->value); + Expr* res = new Expr{Expr::_Type, lex.cur().loc}; + res->flags = Expr::_IsType; + res->e_type = val->get_type(); + lex.next(); + return res; + } Expr* res = new Expr{Expr::_Var, lex.cur().loc}; if (nv) { res->val = ~lex.cur().val; @@ -302,14 +330,14 @@ Expr* parse_expr100(Lexer& lex, CodeBlob& code, bool nv) { res->flags = Expr::_IsLvalue | Expr::_IsNewVar; // std::cerr << "defined new variable " << lex.cur().str << " : " << res->e_type << std::endl; } else { - res->sym = sym::lookup_symbol(lex.cur().val); - if (!res->sym) { + if (!sym) { check_global_func(lex.cur()); - res->sym = sym::lookup_symbol(lex.cur().val); + sym = sym::lookup_symbol(lex.cur().val); } + res->sym = sym; SymVal* val = nullptr; - if (res->sym) { - val = dynamic_cast(res->sym->value); + if (sym) { + val = dynamic_cast(sym->value); } if (!val) { lex.cur().error_at("undefined identifier `", "`"); @@ -463,7 +491,7 @@ Expr* parse_expr75(Lexer& lex, CodeBlob& code, bool nv) { Expr* parse_expr30(Lexer& lex, CodeBlob& code, bool nv) { Expr* res = parse_expr75(lex, code, nv); while (lex.tp() == '*' || lex.tp() == '/' || lex.tp() == '%' || lex.tp() == _DivMod || lex.tp() == _DivC || - lex.tp() == _DivR || lex.tp() == '&') { + lex.tp() == _DivR || lex.tp() == _ModC || lex.tp() == _ModR || lex.tp() == '&') { res->chk_rvalue(lex.cur()); int t = lex.tp(); sym_idx_t name = symbols.lookup_add(std::string{"_"} + lex.cur().str + "_"); @@ -481,7 +509,7 @@ Expr* parse_expr30(Lexer& lex, CodeBlob& code, bool nv) { return res; } -// parse [-] E { (+ | - | `|` ) E } +// parse [-] E { (+ | - | `|` | ^) E } Expr* parse_expr20(Lexer& lex, CodeBlob& code, bool nv) { Expr* res; int t = lex.tp(); @@ -500,7 +528,7 @@ Expr* parse_expr20(Lexer& lex, CodeBlob& code, bool nv) { } else { res = parse_expr30(lex, code, nv); } - while (lex.tp() == '-' || lex.tp() == '+' || lex.tp() == '|') { + while (lex.tp() == '-' || lex.tp() == '+' || lex.tp() == '|' || lex.tp() == '^') { res->chk_rvalue(lex.cur()); t = lex.tp(); sym_idx_t name = symbols.lookup_add(std::string{"_"} + lex.cur().str + "_"); @@ -586,8 +614,8 @@ Expr* parse_expr10(Lexer& lex, CodeBlob& code, bool nv) { auto x = parse_expr13(lex, code, nv); int t = lex.tp(); if (t == _PlusLet || t == _MinusLet || t == _TimesLet || t == _DivLet || t == _DivRLet || t == _DivCLet || - t == _ModLet || t == _LshiftLet || t == _RshiftLet || t == _RshiftCLet || t == _RshiftRLet || t == _AndLet || - t == _OrLet || t == _XorLet) { + t == _ModLet || t == _ModCLet || t == _ModRLet || t == _LshiftLet || t == _RshiftLet || t == _RshiftCLet || + t == _RshiftRLet || t == _AndLet || t == _OrLet || t == _XorLet) { x->chk_lvalue(lex.cur()); x->chk_rvalue(lex.cur()); sym_idx_t name = symbols.lookup_add(std::string{"^_"} + lex.cur().str + "_"); @@ -960,9 +988,76 @@ SymValAsmFunc* parse_asm_func_body(Lexer& lex, TypeExpr* func_type, const Formal return res; } +std::vector parse_type_var_list(Lexer& lex) { + std::vector res; + lex.expect(_Forall); + int idx = 0; + while (true) { + if (lex.tp() == _Type) { + lex.next(); + } + if (lex.tp() != _Ident) { + throw src::ParseError{lex.cur().loc, "free type identifier expected"}; + } + auto loc = lex.cur().loc; + SymDef* new_sym_def = sym::define_symbol(lex.cur().val, true, loc); + if (new_sym_def->value) { + lex.cur().error_at("redefined type variable `", "`"); + } + auto var = TypeExpr::new_var(idx); + new_sym_def->value = new SymValType{SymVal::_Typename, idx++, var}; + res.push_back(var); + lex.next(); + if (lex.tp() != ',') { + break; + } + lex.next(); + } + lex.expect(_Mapsto); + return res; +} + +void type_var_usage(TypeExpr* expr, const std::vector& typevars, std::vector& used) { + if (expr->constr != TypeExpr::te_Var) { + for (auto arg : expr->args) { + type_var_usage(arg, typevars, used); + } + return; + } + for (std::size_t i = 0; i < typevars.size(); i++) { + if (typevars[i] == expr) { + used.at(i) = true; + return; + } + } + return; +} + +TypeExpr* compute_type_closure(TypeExpr* expr, const std::vector& typevars) { + if (typevars.empty()) { + return expr; + } + std::vector used(typevars.size(), false); + type_var_usage(expr, typevars, used); + std::vector used_vars; + for (std::size_t i = 0; i < typevars.size(); i++) { + if (used.at(i)) { + used_vars.push_back(typevars[i]); + } + } + if (!used_vars.empty()) { + expr = TypeExpr::new_forall(std::move(used_vars), expr); + } + return expr; +} + void parse_func_def(Lexer& lex) { SrcLocation loc{lex.cur().loc}; sym::open_scope(lex); + std::vector type_vars; + if (lex.tp() == _Forall) { + type_vars = parse_type_var_list(lex); + } auto ret_type = parse_type(lex); if (lex.tp() != _Ident) { throw src::ParseError{lex.cur().loc, "function name identifier expected"}; @@ -1010,6 +1105,7 @@ void parse_func_def(Lexer& lex) { lex.expect('{', "function body block expected"); } TypeExpr* func_type = TypeExpr::new_map(extract_total_arg_type(arg_list), ret_type); + func_type = compute_type_closure(func_type, type_vars); if (verbosity >= 1) { std::cerr << "function " << func_name.str << " : " << func_type << std::endl; } diff --git a/crypto/func/test/a6.fc b/crypto/func/test/a6.fc index 06eeed9f..3a387aac 100644 --- a/crypto/func/test/a6.fc +++ b/crypto/func/test/a6.fc @@ -59,20 +59,20 @@ operator _/%_ infix 20; return (x / y, x % y); } -} -{- -< type A, type B, type C > + +forall A, B, C -> (B, C, A) rot (A x, B y, C z) { return (y, z, x); } --} + int ataninv(int base, int q) { ;; computes base*atan(1/q) - base /~= q; + base ~/= q; q *= - q; int sum = 0; int n = 1; do { - sum += base /~ n; - base /~= q; + sum += base ~/ n; + base ~/= q; n += 2; } until base == 0; return sum; @@ -81,5 +81,9 @@ int ataninv(int base, int q) { ;; computes base*atan(1/q) int calc_pi() { int base = 64; repeat (70) { base *= 10; } - return (ataninv(base << 2, 5) - ataninv(base, 239)) >>~ 4; + return (ataninv(base << 2, 5) - ataninv(base, 239)) ~>> 4; +} + +int main() { + return calc_pi(); } diff --git a/crypto/func/test/a6_3.fc b/crypto/func/test/a6_3.fc new file mode 100644 index 00000000..7c8ff3af --- /dev/null +++ b/crypto/func/test/a6_3.fc @@ -0,0 +1,22 @@ +forall A, B, C -> +(B, C, A) rot(A x, B y, C z) { + return (y, z, x); +} + +forall A, B, C -> +_ rot2(A x, B y, C z) { + return rot(rot(x, y, z)); +} + +_ test() { + return rot2(2, 3, 9); +} + +_ test2(cell x, slice y, tuple z) { + return rot2(x, y, z); +} + +forall A -> +_ test3(cell x, A y, int z) { + return rot2(x, y, z); +} diff --git a/crypto/func/unify-types.cpp b/crypto/func/unify-types.cpp index fd841a0f..698d21fe 100644 --- a/crypto/func/unify-types.cpp +++ b/crypto/func/unify-types.cpp @@ -153,7 +153,7 @@ bool TypeExpr::remove_forall(TypeExpr*& te) { bool TypeExpr::remove_forall_in(TypeExpr*& te, TypeExpr* te2, const std::vector& new_vars) { assert(te); assert(te2 && te2->constr == te_ForAll); - if (te->constr == te_Unknown) { + if (te->constr == te_Var) { for (std::size_t i = 0; i < new_vars.size(); i++) { if (te == te2->args[i + 1]) { te = new_vars[i]; @@ -201,12 +201,14 @@ std::ostream& operator<<(std::ostream& os, TypeExpr* type_expr) { std::ostream& TypeExpr::print(std::ostream& os, int lex_level) { switch (constr) { case te_Unknown: - if (value >= 0) { - return os << "??" << value; - } else if (value >= -26) { - return os << (char)(64 - value); + return os << "??" << value; + case te_Var: + if (value >= -26 && value < 0) { + return os << "_" << (char)(91 + value); + } else if (value >= 0 && value < 26) { + return os << (char)(65 + value); } else { - return os << "TVAR" << -value; + return os << "TVAR" << value; } case te_Indirect: return os << args[0]; diff --git a/crypto/smartcont/auto/config-code.cpp b/crypto/smartcont/auto/config-code.cpp deleted file mode 100644 index 4b04b77b..00000000 --- a/crypto/smartcont/auto/config-code.cpp +++ /dev/null @@ -1 +0,0 @@ -with_tvm_code("config", "te6ccgECEwEAAhQAART/APSkE/Sg8sgLAQIBIAIDAgLPBAUCAvEPEAIBIAYHAgEgDA0CASAICQIBIAoLAOkAdDTA/pAMCD6RAGkA3GwE7EjxwCxkl8D4ALTH9M/IoIQTlZTVLqOPTIB1NFx+DMgbpIwf5TQ1wv/4gNwBLqbMiHwAiH4I7wCvLCRAuKdgCRY8AGCEO52T0vwBOAxghDudk9v8AXgECRfBCDAAAGDHrCx8qWAAJTtRNDUUDOAIPQVyMwBzxbJ7VSAAMzQ0wcBwBHyidMf0x/TD9MPMCDCAPKJvvKJgACscIAYyMsFUAXPFhTLbssfyz/JAfsAgAgEgDg4AW0cfgz0NcL//gjghBOQ29kcIIAxP/IyxAUy/+DHfoCE8tqEssfyz8BzxbJcPsAgACSAQPADgAK0MO1E0NSAIIAkUzH0aiBukxAjW444INAg10nCJ44p0wfXCx8BwBH4IxK+sI4VAYAiVBBE9G5UUyH0bjCAJEAT9FowkxAjW+KUEDRfA+LiyMwBzxbJ7VSABASARAf6DCNcYINMf0x/TH/gjErnyY+1E0NTTH9P/0VFBuvKhBfkBVBBj+RDyovgAIoIQQ2ZQIbqcMgHTH9TRQBSAIPQVjjcighBOQ29kupYyAdTR+wSOJCKCEFBiSyG6lTEx0//RjhMighBOQ+8FupQyAfAGlDAB8mDi4uIC4gGkyBLMEgAOyx/L/8ntVA=="); diff --git a/crypto/smartcont/auto/config-code.fif b/crypto/smartcont/auto/config-code.fif deleted file mode 100644 index 1a4084fa..00000000 --- a/crypto/smartcont/auto/config-code.fif +++ /dev/null @@ -1,323 +0,0 @@ -// automatically generated from `smartcont/stdlib.fc` `smartcont/config-code.fc` -PROGRAM{ - DECLPROC set_conf_param - DECLPROC check_validator_set - DECLPROC send_answer - DECLPROC send_confirmation - DECLPROC send_error - DECLPROC recv_internal - DECLPROC change_elector_code - DECLPROC recv_external - DECLPROC run_ticktock - set_conf_param PROC:<{ - // index value - c4 PUSH // index value _3 - CTOS // index value cs - LDREF // index value cfg_dict cs - s3 s3 XCHG2 - 32 PUSHINT // cs value index cfg_dict _9=32 - DICTISETREF // cs cfg_dict - NEWC // cs cfg_dict _11 - STREF // cs _12 - SWAP // _12 cs - STSLICER // _13 - ENDC // _14 - c4 POP - }> - check_validator_set PROC:<{ - // vset - CTOS // cs - 8 LDU // _4 cs - SWAP // cs _4 - 17 EQINT // cs _8 - 9 THROWIFNOT - 32 LDU // utime_since cs - 32 LDU // utime_since utime_until cs - 16 LDU // utime_since utime_until total cs - 16 LDU // utime_since utime_until total _42 _41 - DROP // utime_since utime_until total main - DUP // utime_since utime_until total main main - 0 GTINT // utime_since utime_until total main _28 - 9 THROWIFNOT - GEQ // utime_since utime_until _31 - 9 THROWIFNOT - }> - send_answer PROC:<{ - // addr query_id ans_tag mode - 0 PUSHINT // addr query_id ans_tag mode _4=0 - 24 PUSHINT // addr query_id ans_tag mode _4=0 _5=24 - NEWC // addr query_id ans_tag mode _4=0 _5=24 _6 - 6 STU // addr query_id ans_tag mode _4=0 _8 - s0 s5 XCHG2 // _4=0 query_id ans_tag mode _8 addr - STSLICER // _4=0 query_id ans_tag mode _9 - s1 s4 XCHG // mode query_id ans_tag _4=0 _9 - 111 STU // mode query_id ans_tag _23 - 32 STU // mode query_id _25 - 64 STU // mode _27 - ENDC // mode _28 - SWAP // _28 mode - SENDRAWMSG - }> - send_confirmation PROC:<{ - // addr query_id ans_tag - 64 PUSHINT // addr query_id ans_tag _3=64 - send_answer CALLDICT - }> - send_error PROC:<{ - // addr query_id ans_tag - 64 PUSHINT // addr query_id ans_tag _3=64 - send_answer CALLDICT - }> - recv_internal PROC:<{ - // in_msg_cell in_msg - SWAP // in_msg in_msg_cell - CTOS // in_msg cs - 4 LDU // in_msg flags cs - LDMSGADDR // in_msg flags _74 _73 - DROP // in_msg flags s_addr - DUP // in_msg flags s_addr s_addr - REWRITESTDADDR // in_msg flags s_addr src_wc src_addr - SWAP // in_msg flags s_addr src_addr src_wc - INC // in_msg flags s_addr src_addr _15 - s0 s3 XCHG - 1 PUSHINT // in_msg _15 s_addr src_addr flags _16=1 - AND // in_msg _15 s_addr src_addr _17 - s1 s3 XCHG // in_msg src_addr s_addr _15 _17 - OR // in_msg src_addr s_addr _18 - s3 PUSH // in_msg src_addr s_addr _18 in_msg - SEMPTY // in_msg src_addr s_addr _18 _19 - OR // in_msg src_addr s_addr _20 - IFJMP:<{ // in_msg src_addr s_addr - 3 BLKDROP // - }> // in_msg src_addr s_addr - s0 s2 XCHG // s_addr src_addr in_msg - 32 LDU // s_addr src_addr tag in_msg - 64 LDU // s_addr src_addr tag query_id in_msg - s2 PUSH - 1314280276 PUSHINT // s_addr src_addr tag query_id in_msg tag _29=1314280276 - EQUAL // s_addr src_addr tag query_id in_msg _30 - IFJMP:<{ // s_addr src_addr tag query_id in_msg - s2 POP // s_addr src_addr in_msg query_id - SWAP // s_addr src_addr query_id in_msg - LDREF // s_addr src_addr query_id vset in_msg - ENDS - 1 PUSHINT // s_addr src_addr query_id vset _36=1 - CONFIGOPTPARAM // s_addr src_addr query_id vset elector_param - DUP // s_addr src_addr query_id vset elector_param elector_param - ISNULL // s_addr src_addr query_id vset elector_param _39 - IF:<{ // s_addr src_addr query_id vset elector_param - DROP // s_addr src_addr query_id vset - -1 PUSHINT // s_addr src_addr query_id vset _40=-1 - }>ELSE<{ // s_addr src_addr query_id vset elector_param - CTOS // s_addr src_addr query_id vset _42 - 256 PLDU // s_addr src_addr query_id vset _40 - }> // s_addr src_addr query_id vset elector_addr - s0 s3 XCHG - FALSE - s0 s4 XCHG // s_addr ok query_id vset src_addr elector_addr - EQUAL // s_addr ok query_id vset _47 - IF:<{ // s_addr ok query_id vset - s2 POP // s_addr vset query_id - OVER // s_addr vset query_id vset - check_validator_set CALLDICT // s_addr vset query_id t_since t_until - OVER - NOW // s_addr vset query_id t_since t_until t_since t - GREATER // s_addr vset query_id t_since t_until _53 - s0 s2 XCHG // s_addr vset query_id _53 t_until t_since - GREATER // s_addr vset query_id _53 _54 - AND // s_addr vset query_id ok - }>ELSE<{ - s0 s2 XCHG // s_addr vset query_id ok - }> - IFJMP:<{ // s_addr vset query_id - 36 PUSHINT // s_addr vset query_id _56=36 - ROT // s_addr query_id _56=36 vset - set_conf_param CALLDICT - 4000730955 PUSHINT // s_addr query_id _58=4000730955 - send_confirmation CALLDICT - }> // s_addr vset query_id - NIP // s_addr query_id - 4000730991 PUSHINT // s_addr query_id _60=4000730991 - send_error CALLDICT - }> // s_addr src_addr tag query_id in_msg - s2 s4 XCHG - 4 BLKDROP // tag - DUP // tag tag - 0 EQINT // tag _64 - SWAP - 31 PUSHPOW2 // _64 tag _67 - AND // _64 _68 - OR // _69 - 37 THROWIFNOT - }> - change_elector_code PROC:<{ - // cs - 1 PUSHINT // cs _2=1 - CONFIGOPTPARAM // cs _3 - CTOS // cs _4 - 256 PLDU // cs dest_addr - NOW // cs dest_addr query_id - 1313042276 PUSHINT // cs dest_addr query_id _9=1313042276 - 0 PUSHINT // cs dest_addr query_id _9=1313042276 _10=0 - 50431 PUSHINT // cs dest_addr query_id _9=1313042276 _10=0 _11=50431 - NEWC // cs dest_addr query_id _9=1313042276 _10=0 _11=50431 _12 - 17 STU // cs dest_addr query_id _9=1313042276 _10=0 _14 - s1 s4 XCHG // cs _10=0 query_id _9=1313042276 dest_addr _14 - 256 STU // cs _10=0 query_id _9=1313042276 _16 - 30 PUSHPOW2 // cs _10=0 query_id _9=1313042276 _16 _19 - STGRAMS // cs _10=0 query_id _9=1313042276 _20 - s1 s3 XCHG // cs _9=1313042276 query_id _10=0 _20 - 107 STU // cs _9=1313042276 query_id _34 - s1 s2 XCHG // cs query_id _9=1313042276 _34 - 32 STU // cs query_id _36 - 64 STU // cs _38 - SWAP // _38 cs - STSLICER // _39 - ENDC // _40 - 0 PUSHINT // _40 _41=0 - SENDRAWMSG - }> - recv_external PROC:<{ - // in_msg - 9 PUSHPOW2 // in_msg _3=512 - LDSLICEX // signature in_msg - DUP // signature in_msg cs - 32 LDU // signature in_msg action cs - 32 LDU // signature in_msg action msg_seqno cs - 32 LDU // signature in_msg action msg_seqno valid_until cs - NOW // signature in_msg action msg_seqno valid_until cs _19 - s1 s2 XCHG // signature in_msg action msg_seqno cs valid_until _19 - LESS // signature in_msg action msg_seqno cs _20 - 35 THROWIF - c4 PUSH // signature in_msg action msg_seqno cs _23 - CTOS // signature in_msg action msg_seqno cs cs2 - LDREF // signature in_msg action msg_seqno cs cfg_dict cs2 - 32 LDU // signature in_msg action msg_seqno cs cfg_dict stored_seqno cs2 - 256 LDU // signature in_msg action msg_seqno cs cfg_dict stored_seqno public_key cs2 - ENDS - s4 s1 XCPU // signature in_msg action public_key cs cfg_dict stored_seqno msg_seqno stored_seqno - EQUAL // signature in_msg action public_key cs cfg_dict stored_seqno _38 - 33 THROWIFNOT - s0 s5 XCHG // signature stored_seqno action public_key cs cfg_dict in_msg - HASHSU // signature stored_seqno action public_key cs cfg_dict _41 - s0 s6 s3 XC2PU // cfg_dict stored_seqno action public_key cs _41 signature public_key - CHKSIGNU // cfg_dict stored_seqno action public_key cs _42 - 34 THROWIFNOT - ACCEPT - s2 PUSH - 1130778657 PUSHINT // cfg_dict stored_seqno action public_key cs action _45=1130778657 - EQUAL // cfg_dict stored_seqno action public_key cs _46 - IF:<{ // cfg_dict stored_seqno action public_key cs - s2 POP // cfg_dict stored_seqno cs public_key - SWAP // cfg_dict stored_seqno public_key cs - 32 LDU // cfg_dict stored_seqno public_key param_index cs - LDREF // cfg_dict stored_seqno public_key param_index param_value cs - ENDS - s0 s1 s4 XCHG3 - 32 PUSHINT // public_key stored_seqno param_value param_index cfg_dict _56=32 - DICTISETREF // public_key stored_seqno cfg_dict - }>ELSE<{ // cfg_dict stored_seqno action public_key cs - s2 PUSH - 1313042276 PUSHINT // cfg_dict stored_seqno action public_key cs action _58=1313042276 - EQUAL // cfg_dict stored_seqno action public_key cs _59 - IF:<{ // cfg_dict stored_seqno action public_key cs - s2 POP // cfg_dict stored_seqno cs public_key - SWAP // cfg_dict stored_seqno public_key cs - LDREF // cfg_dict stored_seqno public_key new_code cs - ENDS - SETCODE - }>ELSE<{ // cfg_dict stored_seqno action public_key cs - s2 PUSH - 1348619041 PUSHINT // cfg_dict stored_seqno action public_key cs action _65=1348619041 - EQUAL // cfg_dict stored_seqno action public_key cs _66 - IF:<{ // cfg_dict stored_seqno action public_key cs - NIP - NIP // cfg_dict stored_seqno cs - 256 LDU // cfg_dict stored_seqno public_key cs - ENDS - }>ELSE<{ // cfg_dict stored_seqno action public_key cs - s2 PUSH - 1313074949 PUSHINT // cfg_dict stored_seqno action public_key cs action _71=1313074949 - EQUAL // cfg_dict stored_seqno action public_key cs _72 - IF:<{ // cfg_dict stored_seqno action public_key cs - s2 POP // cfg_dict stored_seqno cs public_key - SWAP // cfg_dict stored_seqno public_key cs - change_elector_code CALLDICT - }>ELSE<{ // cfg_dict stored_seqno action public_key cs - DROP // cfg_dict stored_seqno action public_key - SWAP // cfg_dict stored_seqno public_key action - 32 THROWIF - }> - }> - }> - s0 s2 XCHG // public_key stored_seqno cfg_dict - }> - SWAP // public_key cfg_dict stored_seqno - INC // public_key cfg_dict _77 - NEWC // public_key cfg_dict _77 _78 - s1 s2 XCHG // public_key _77 cfg_dict _78 - STREF // public_key _77 _79 - 32 STU // public_key _81 - 256 STU // _83 - ENDC // _84 - c4 POP - }> - run_ticktock PROC:<{ - // is_tock - DROP // - c4 PUSH // _2 - CTOS // cs - LDREF // cfg_dict cs - 32 PUSHINT // cfg_dict cs kl=32 - 36 PUSHINT // cfg_dict cs kl=32 _10=36 - s3 s1 PUSH2 // cfg_dict cs kl=32 _10=36 cfg_dict kl=32 - DICTIGETOPTREF // cfg_dict cs kl=32 next_vset - DUP // cfg_dict cs kl=32 next_vset next_vset - ISNULL // cfg_dict cs kl=32 next_vset _12 - IFNOT:<{ // cfg_dict cs kl=32 next_vset - DUP // cfg_dict cs kl=32 next_vset next_vset - CTOS // cfg_dict cs kl=32 next_vset ds - DUP // cfg_dict cs kl=32 next_vset ds ds - SBITS // cfg_dict cs kl=32 next_vset ds _15 - 39 GTINT // cfg_dict cs kl=32 next_vset ds _17 - IF:<{ // cfg_dict cs kl=32 next_vset ds - 8 LDU // cfg_dict cs kl=32 next_vset tag ds - 32 PLDU // cfg_dict cs kl=32 next_vset tag since - SWAP // cfg_dict cs kl=32 next_vset since tag - 17 EQINT // cfg_dict cs kl=32 next_vset since _26 - NOW // cfg_dict cs kl=32 next_vset since _26 _27 - s1 s2 XCHG // cfg_dict cs kl=32 next_vset _26 since _27 - GEQ // cfg_dict cs kl=32 next_vset _26 _28 - AND // cfg_dict cs kl=32 next_vset _29 - IF:<{ // cfg_dict cs kl=32 next_vset - SWAP - 34 PUSHINT - s0 s4 s4 XC2PU // kl=32 cs next_vset _32=34 cfg_dict kl=32 - DICTISETGETOPTREF // kl=32 cs cfg_dict cur_vset - s3 s1 s0 PUXCPU // kl=32 cs cur_vset _35=32 cfg_dict kl=32 - DICTISETGETOPTREF // kl=32 cs _51 _52 - DROP // kl=32 cs cfg_dict - 36 PUSHINT // kl=32 cs cfg_dict _38=36 - s0 s1 s3 XCHG3 // cs _38=36 cfg_dict kl=32 - DICTIDEL // cs _53 _54 - DROP // cs cfg_dict - }>ELSE<{ - s2 s3 XCHG - 2DROP // cs cfg_dict - }> - }>ELSE<{ - s3 s4 XCHG - 3 BLKDROP // cs cfg_dict - }> - }>ELSE<{ - s2 s3 XCHG - 2DROP // cs cfg_dict - }> - NEWC // cs cfg_dict _40 - STREF // cs _41 - SWAP // _41 cs - STSLICER // _42 - ENDC // _43 - c4 POP - }> -}END>c diff --git a/crypto/smartcont/auto/elector-code.cpp b/crypto/smartcont/auto/elector-code.cpp deleted file mode 100644 index eb520f79..00000000 --- a/crypto/smartcont/auto/elector-code.cpp +++ /dev/null @@ -1 +0,0 @@ -with_tvm_code("elector-code", "te6ccgECVAEACrkAART/APSkE/Sg8sgLAQIBIAIDAgFIBAUAUaX//xh2omh6AnoCETdKrPgN+SBOKjgQ+At5ICz4DPkgcXgL+SB4DRhAAgLFBgcCASAKCwIBywgJACyqgjGCEE5Db2SCEM5Db2RwQzCAQPAGAgEgEBECASAzNAIDeqAMDQIBbg4PACSqB+1E0PQFIG6SMHCU0NcLH+IAQqss7UTQ9AUgbpJbcODwAxAmXwaDB/QOb6GT+gAwkjBw4gBzsKV7UTQ9AUgbpIwbeDwAxAmXwZthP+OHiKDB/R+b6FvoSCcAvoAMFIQbwJQA28Cklow4gGzEuYwMYAAzs+A7UTQ9AQx9AQwgwf0Dm+hk/oAMJIwcOKACASASEwIBICMkAgEgFBUCASAdHgIBIBYXAgEgGxwBASAYACE7UTQ9AT0BPQE+gDTH9P/0YAL8AdDTAwFxsJJfA+D6QDAhxwCUMQHwEOAB0x8hwACUWwHwEODTPyKCEE5zdEu6lTIQI/AL4DQhghBHZXQkupMT8BHgIYIQTkNvZLqOGVRSRPASloIQzkNvZJKEH+JwEDRDMIBA8AbgIYIQ7nZPS7oighDudk9vulIQsYrgMDMgGRoADDIQIwHwDwAkgx6wm4QfcBA0QzCAQPAG4V8DACkyBb0ABT0ABL0AAH6Assfy//J7VSAAITQ0x/TH/oA+gD0BNIA0gDRgAgEgHyACASAhIgArMgXyx8Vyx9QA/oCAfoC9ADKAMoAyYAAdIAP+DPQ0h/SH9If1wofgAEUcIAYyMsFUAfPFlj6AhXLahPLH8s/IcL/kssfkTHiyQH7AIAAbIIQ7m9FTHBDMIBA8AaACASAlJgIBIC0uAgEgJygCASApKgAjIIQ83RITIIQO5rKAEMwcvAGgAEcghBOVlNUcIIAxP/IyxAVy/+DHfoCFMtqE8sfEss/zMlx+wCAAMxTEoMH9A5voZT6ADCgkTDiyAH6AgKDB/RDgAQEgKwH+I/pE7UTQ9AQhbgSkFLGXEDVfBXDwB+AE0//TH9Mf0//UAdCDCNcZAdGCEGVMUHTIyx9SQMsfUjDLH1Jgy/9SIMv/ydBRFfkRlxBoXwhx8AfhIYMPuZcQaF8IdvAH4AfwAzEF/iANghA7msoAoSCqCyO5mBC8XwwxcvAH4FEioCwA/lF9vZcQrF8Mc/AH4ASXEJtfC3DwB+BTY4MH9A5voSCfMPoAWaAB0z8x0/8wUoC9kTHilxCbXwt08AfgUwG5lxCbXwt18AfgIPKs+AD4I8hY+gLLHxTLHxbL/xjL/0A3gwf0Q3AQVxA0ECMQJnDwBMj0AAHPFsntVCCTcPAI4FsCASAvMAIBIDEyAHkcCB/jjAkgwf0fG+hb6EgjhwC0//TPzH6ANIA0ZQxUTOgl1QYiPAKBwPiUEOgk1BCMOIBsxPmMDMBuvK7gAKEcFMAf447JoMH9HxvoW+hII4nAtP/0z8x+gDSANGUMVEzoI4RVHcIqYRRZqBSF6BLsPAKCQPiUFOgk1BSMOIBsxTmMDUDulMhu7DyuxKgAaGAAVwBgCD0Zm+hkjBw4dM/MdP/MfQE+gD6APQEMdEgwgCUEDTwDZUwECPwDOISgAKMMgL6RHD4M9DXC//tRND0BASkWr2xIW6xkl8E4PADBV8FUhW9BLMUsZJfA+D4AAGRW44d9AT0BPoAQzTwDnDIygAT9AD0AFmg+gIBzxbJ7VTigAgEgNTYCAUhOTwIBIDc4AgEgPT4CASA5OgIBIDs8AKU8AEH+kQBpLEhwACxlwWgVRMB8ALgUwKAIPQOb6GOJ9M/0//0BPoA+gALoMgVyz8Ty//0AAH6AgH6AlAGzxYBgCBURkT0Q5QwBaAB4hA1QUPwAoADZDEh+kQBpJ8wghD////+cBA0E4BA8Abg7UTQ9AT0BFAzgwf0Zm+hjhBfBIIQ/////nAQNBOAQPAG4TYF+gDRyBL0ABX0AAHPFsntVIIQ+W9zJHCAGMjLBVAEzxZQBPoCEstqEssfyz/JgED7AIABpHD4MyBuk18EcODQ1wv/I/pEAaQCvbGTXwNw4PgAAdQh+wQgxwCSXwSZAe1TAfEGgvIA4n+AAAxwgAgEgP0ACASBJSgA1HACjhMCbyIhbxACbxEkqKsPErYIEqBY5DAxgAQEgQQP+gBD4M9DTD9MPMdMP0XG2CXBtf45GKYMH9HxvoW+hII4wAvoA0x/TH9P/0//RA6PIFct/FMofUkDL/8nQURq2CMjLHxPL/8v/QBSBAaD0QQOklBA0WjDiAbNDMOYwNFi2CFMBuZZfB21tcCDgbYrmMzSlXJJvEeRwIIrmMjI0NEJDRABqA4EBoPSSb6FvoSCOIAHTf1EZtggB0x8x1wv/A9Mf0/8x1wv/QTAUbwRQBW8Ck0YWW+IEsxQASgJvIgFvEASkU0i+jhBUZQbwFFMCvJMyMiKSEzDik1A0MOJTNr4BXiLAAFJDuRKxll8EbW1wIOAg/iAipZJvEeRvEG8QcCBtbYrmMzMzNVIUuvKxECMBRQL+BW8iAW8kUxyDB/QOb6HyvfoAMdM/MdcL/1OLuY5XUTmoqw9SQLYIUUShJKo7LakEUYWgghCOgSeKI5KAc5KAU+LIywfLH1JAy/9SkMs/I5MTy/+TUAMw4gGAEFRKmfRDcCTIy/8Zyz9QBfoCF8oAQBmDB/RDlgoQRgNfA+IjikZHAAhLc/AKARiK4gOkKW4QShBGREBIAAZLc1sBASBLAa08AGAIvgz+QBTAbqTXwdw4CKOL1MkgCD0Dm+hjh/THzEg0x/T/zBQBLryufgjUAOgyMsfWM8WQASAIPRDlBUTXwPik0QUW+J/iuYgbpIwcJDiUAPwAn+BNAf4B8AM0+CMluZNfCHDgcPgzbpRfCPAT4IAR+DPQ+gD6APoA0x/RU2G5lF8M8BPgBJRfC/AT4AaTXwpw4BA4KFEyUHfwFSDAACCzKgYQWhBJEDhMzPAEIo4TMjIyMjLIEvQA9AABzxbJ7VTwE+HwBTL4IwGgpsQotgmAEPgz0IAQTADI1yHXCw9SYLYIUxOggBHIywdSMMsfyx8Xyw8Wyw8J0BnPFslw+DPQ1wv/UxjwCQn0BHAL+QBQY6ApoMjLHxnLH8v/FfQAUAP6AnD6AhbKAEA0gCD0Q8gT9AD0APQAAc8Wye1UfwCkIYAg9HxvoW+hII4/AtM/0/9TF7qOLTQD9AT6APoAKKsCUZmhUCmgyBXLPxbL/xL0AAH6AgH6AljPFgGAIFRBRPRDcJYQNRA0XwPik0MDMOKzEgIBIFBRAgEgUlMAGQhbpJbcJUB+QABuuKAAlQB8AMFXwWTXwNw4QL0BFExgCD0Dm+hk18EcOGAQNch1wv/gCL4MyHwGIAk+DNY8BixjhNwyMoAEvQA9AABzxbJ7VTwFzB/4F8DcIACTPABf44+JIAg9HxvoW+hII4kAtMfMPgju1MUvbCOETFUFUTwDhSgVHYTVHNY8AJwlEYVUETilhA3FkUFMOKzECYQRRTmBl8GbrOAA4QxgCT4M26SW3Dhcfgz0NcL//go+kQBpAK9sZJbcOCAIvgzIG6TXwNw4PAFMDIC0IAo1yHXCx/4I1EToVy5k18GcOBcocE8kTGRMOKAEfgz0PoAMAOg/iBSAqFwbXAQRRA0cPAEyPQA9AABzxbJ7VR/g"); diff --git a/crypto/smartcont/auto/elector-code.fif b/crypto/smartcont/auto/elector-code.fif deleted file mode 100644 index d964063b..00000000 --- a/crypto/smartcont/auto/elector-code.fif +++ /dev/null @@ -1,1712 +0,0 @@ -// automatically generated from `smartcont/stdlib.fc` `smartcont/elector-code.fc` -PROGRAM{ - DECLPROC load_data - DECLPROC store_data - DECLPROC unpack_elect - DECLPROC pack_elect - DECLPROC get_validator_conf - DECLPROC send_message_back - DECLPROC return_stake - DECLPROC send_confirmation - DECLPROC send_validator_set_to_config - DECLPROC ~credit_to - DECLPROC process_new_stake - DECLPROC unfreeze_without_bonuses - DECLPROC unfreeze_with_bonuses - DECLPROC unfreeze_all - DECLPROC config_set_confirmed - DECLPROC process_simple_transfer - DECLPROC recover_stake - 1666 DECLMETHOD after_code_upgrade - DECLPROC upgrade_code - DECLPROC recv_internal - DECLPROC postpone_elections - DECLPROC compute_total_stake - DECLPROC try_elect - DECLPROC conduct_elections - DECLPROC update_active_vset_id - DECLPROC cell_hash_eq? - DECLPROC validator_set_installed - DECLPROC check_unfreeze - DECLPROC announce_new_elections - DECLPROC run_ticktock - 86535 DECLMETHOD active_election_id - 87852 DECLMETHOD participates_in - 123541 DECLMETHOD participant_list - 130944 DECLMETHOD compute_returned_stake - load_data PROC:<{ - // - c4 PUSH // _1 - CTOS // cs - LDDICT // _4 cs - LDDICT // _4 _6 cs - LDDICT // _4 _6 _8 cs - LDGRAMS // _4 _6 _8 _10 cs - 32 LDU // _4 _6 _8 _10 _12 cs - 256 LDU // res res res res res res cs - ENDS - }> - store_data PROC:<{ - // elect credits past_elect grams active_id active_hash - NEWC // elect credits past_elect grams active_id active_hash _6 - s1 s6 XCHG // active_hash credits past_elect grams active_id elect _6 - STDICT // active_hash credits past_elect grams active_id _7 - s1 s4 XCHG // active_hash active_id past_elect grams credits _7 - STDICT // active_hash active_id past_elect grams _8 - s1 s2 XCHG // active_hash active_id grams past_elect _8 - STDICT // active_hash active_id grams _9 - SWAP // active_hash active_id _9 grams - STGRAMS // active_hash active_id _10 - 32 STU // active_hash _12 - 256 STU // _14 - ENDC // _15 - c4 POP - }> - unpack_elect PROC:<{ - // elect - CTOS // es - 32 LDU // _4 es - 32 LDU // _4 _7 es - LDGRAMS // _4 _7 _10 es - LDGRAMS // _4 _7 _10 _12 es - LDDICT // _4 _7 _10 _12 _14 es - 1 LDI // _4 _7 _10 _12 _14 _16 es - 1 LDI // res res res res res res res es - ENDS - }> - pack_elect PROC:<{ - // elect_at elect_close min_stake total_stake members failed finished - NEWC // elect_at elect_close min_stake total_stake members failed finished _7 - s1 s7 XCHG // finished elect_close min_stake total_stake members failed elect_at _7 - 32 STU // finished elect_close min_stake total_stake members failed _9 - s1 s5 XCHG // finished failed min_stake total_stake members elect_close _9 - 32 STU // finished failed min_stake total_stake members _11 - s0 s3 XCHG2 // finished failed members total_stake _11 min_stake - STGRAMS // finished failed members total_stake _12 - SWAP // finished failed members _12 total_stake - STGRAMS // finished failed members _13 - STDICT // finished failed _14 - 1 STI // finished _16 - 1 STI // _18 - ENDC // _19 - }> - get_validator_conf PROC:<{ - // - 15 PUSHINT // _1=15 - CONFIGOPTPARAM // _2 - CTOS // cs - 32 LDI // _4 cs - 32 LDI // _4 _7 cs - 32 LDI // _4 _7 _10 cs - 32 PLDI // _4 _7 _10 _14 - }> - send_message_back PROC:<{ - // addr ans_tag query_id body grams mode - 0 PUSHINT // addr ans_tag query_id body grams mode _7=0 - 24 PUSHINT // addr ans_tag query_id body grams mode _7=0 _8=24 - NEWC // addr ans_tag query_id body grams mode _7=0 _8=24 _9 - 6 STU // addr ans_tag query_id body grams mode _7=0 _11 - s0 s7 XCHG2 // _7=0 ans_tag query_id body grams mode _11 addr - STSLICER // _7=0 ans_tag query_id body grams mode _12 - ROT // _7=0 ans_tag query_id body mode _12 grams - STGRAMS // _7=0 ans_tag query_id body mode _13 - s1 s5 XCHG // mode ans_tag query_id body _7=0 _13 - 107 STU // mode ans_tag query_id body _27 - s1 s3 XCHG // mode body query_id ans_tag _27 - 32 STU // mode body query_id _29 - 64 STU // mode body msg - OVER // mode body msg body - -1 GTINT // mode body msg _33 - IF:<{ // mode body msg - 32 STU // mode msg - }>ELSE<{ - NIP // mode msg - }> - ENDC // mode _37 - SWAP // _37 mode - SENDRAWMSG - }> - return_stake PROC:<{ - // addr query_id reason - 4000269644 PUSHINT // addr query_id reason _3=4000269644 - 0 PUSHINT // addr query_id reason _3=4000269644 _4=0 - s3 s3 s0 XCHG3 - 64 PUSHINT // addr _3=4000269644 query_id reason _4=0 _5=64 - send_message_back CALLDICT - }> - send_confirmation PROC:<{ - // addr query_id comment - 4084484172 PUSHINT // addr query_id comment _3=4084484172 - 1000000000 PUSHINT // addr query_id comment _3=4084484172 _4=1000000000 - s3 s3 s0 XCHG3 - 2 PUSHINT // addr _3=4084484172 query_id comment _4=1000000000 _5=2 - send_message_back CALLDICT - }> - send_validator_set_to_config PROC:<{ - // config_addr vset query_id - 1314280276 PUSHINT // config_addr vset query_id _4=1314280276 - 0 PUSHINT // config_addr vset query_id _4=1314280276 _5=0 - 50431 PUSHINT // config_addr vset query_id _4=1314280276 _5=0 _6=50431 - NEWC // config_addr vset query_id _4=1314280276 _5=0 _6=50431 _7 - 17 STU // config_addr vset query_id _4=1314280276 _5=0 _9 - s1 s5 XCHG // _5=0 vset query_id _4=1314280276 config_addr _9 - 256 STU // _5=0 vset query_id _4=1314280276 _11 - 30 PUSHPOW2 // _5=0 vset query_id _4=1314280276 _11 _14 - STGRAMS // _5=0 vset query_id _4=1314280276 _15 - s1 s4 XCHG // _4=1314280276 vset query_id _5=0 _15 - 107 STU // _4=1314280276 vset query_id _29 - s1 s3 XCHG // query_id vset _4=1314280276 _29 - 32 STU // query_id vset _31 - s1 s2 XCHG // vset query_id _31 - 64 STU // vset _33 - STREF // msg - ENDC // _35 - 1 PUSHINT // _35 _36=1 - SENDRAWMSG - }> - ~credit_to PROC:<{ - // credits addr amount - s1 s2 PUSH2 - 8 PUSHPOW2 // credits addr amount addr credits _5=256 - DICTUGET - NULLSWAPIFNOT // credits addr amount val f - IF:<{ // credits addr amount val - LDGRAMS // credits addr amount _18 _17 - DROP // credits addr amount _7 - ADD // credits addr amount - }>ELSE<{ - DROP // credits addr amount - }> - NEWC // credits addr amount _11 - SWAP // credits addr _11 amount - STGRAMS // credits addr _12 - s0 s2 XCHG - 8 PUSHPOW2 // _12 addr credits _13=256 - DICTUSETB // credits - }> - process_new_stake PROC:<{ - // s_addr msg_value cs query_id - s3 PUSH // s_addr msg_value cs query_id s_addr - REWRITESTDADDR // s_addr msg_value cs query_id src_wc src_addr - c4 PUSH // s_addr msg_value cs query_id src_wc src_addr _8 - CTOS // s_addr msg_value cs query_id src_wc src_addr ds - LDDICT // s_addr msg_value cs query_id src_wc src_addr elect ds - OVER // s_addr msg_value cs query_id src_wc src_addr elect ds elect - ISNULL // s_addr msg_value cs query_id src_wc src_addr elect ds _13 - s0 s4 XCHG // s_addr msg_value cs query_id _13 src_addr elect ds src_wc - INC // s_addr msg_value cs query_id _13 src_addr elect ds _15 - s1 s4 XCHG // s_addr msg_value cs query_id ds src_addr elect _13 _15 - OR // s_addr msg_value cs query_id ds src_addr elect _16 - IFJMP:<{ // s_addr msg_value cs query_id ds src_addr elect - s3 s5 XCHG - 5 BLKDROP // s_addr query_id - 0 PUSHINT // s_addr query_id _17=0 - return_stake CALLDICT - }> // s_addr msg_value cs query_id ds src_addr elect - s0 s4 XCHG // s_addr msg_value elect query_id ds src_addr cs - 256 LDU // s_addr msg_value elect query_id ds src_addr validator_pubkey cs - 32 LDU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at cs - 32 LDU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor cs - 256 LDU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr cs - LDREF // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr _36 cs - SWAP // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr cs _36 - CTOS // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr cs _38 - 9 PUSHPOW2 // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr cs _38 _39=512 - PLDSLICEX // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr cs signature - SWAP // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature cs - ENDS - 1699500148 PUSHINT // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _42=1699500148 - NEWC // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _42=1699500148 _43 - 32 STU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _45 - s4 s(-1) PUXC // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature stake_at _45 - 32 STU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _47 - s3 s(-1) PUXC // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature max_factor _47 - 32 STU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _49 - s6 s(-1) PUXC // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature src_addr _49 - 256 STU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _51 - s2 s(-1) PUXC // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature adnl_addr _51 - 256 STU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _53 - ENDC // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _54 - CTOS // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr signature _55 - s1 s5 XCPU // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr _55 signature validator_pubkey - CHKSIGNS // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr _56 - IFNOTJMP:<{ // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr - s6 s8 XCHG - 8 BLKDROP // s_addr query_id - 1 PUSHINT // s_addr query_id _57=1 - return_stake CALLDICT - }> // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr - OVER - 16 PUSHPOW2 // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr max_factor _59=65536 - LESS // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr _60 - IFJMP:<{ // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr - s6 s8 XCHG - 8 BLKDROP // s_addr query_id - 6 PUSHINT // s_addr query_id _61=6 - return_stake CALLDICT - }> // s_addr msg_value elect query_id ds src_addr validator_pubkey stake_at max_factor adnl_addr - s0 s7 XCHG // s_addr msg_value adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor elect - unpack_elect CALLDICT // s_addr msg_value adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor _146 _147 _148 _149 _150 _151 _152 - NIP // s_addr msg_value adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor elect_at elect_close min_stake total_stake members finished - s0 s5 XCHG // s_addr msg_value adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members elect_at - s0 DUMP // s_addr msg_value adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members elect_at - s0 s13 XCHG - 1000000000 PUSHINT // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value _73=1000000000 - SUB // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value - DUP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value msg_value - 12 LSHIFT# // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value _76 - s3 PUSH // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value _76 total_stake - LESS // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value _77 - IFJMP:<{ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value - s11 s12 XCHG - 12 BLKDROP - NIP // s_addr query_id - 2 PUSHINT // s_addr query_id _78=2 - return_stake CALLDICT - }> // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake total_stake members msg_value - s2 s2 XCPU // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake msg_value members total_stake msg_value - ADD // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey stake_at max_factor finished elect_close min_stake msg_value members total_stake - s7 s13 XCPU // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor finished elect_close min_stake msg_value members stake_at elect_at - NEQ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor finished elect_close min_stake msg_value members _81 - IFJMP:<{ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor finished elect_close min_stake msg_value members - s10 s12 XCHG - 12 BLKDROP // s_addr query_id - 3 PUSHINT // s_addr query_id _82=3 - return_stake CALLDICT - }> // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor finished elect_close min_stake msg_value members - s0 s4 XCHG // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value finished - IFJMP:<{ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value - s9 s11 XCHG - 11 BLKDROP // s_addr query_id - 0 PUSHINT // s_addr query_id _84=0 - return_stake CALLDICT - }> // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value - s6 s3 PUSH2 - 8 PUSHPOW2 // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value validator_pubkey members _88=256 - DICTUGET - NULLSWAPIFNOT // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value mem found - DUP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value mem found found - IF:<{ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value mem found - DROP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value mem - LDGRAMS // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value _90 mem - -ROT // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake mem msg_value _90 - ADD // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake mem msg_value - SWAP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value mem - 64 LDU // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value _158 _157 - NIP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value mem - 256 LDU // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value _160 _159 - DROP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value _96 - s8 s(-1) PUXC // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value src_addr _96 - NEQ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value found - }>ELSE<{ - NIP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value found - }> - IFJMP:<{ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value - s9 s11 XCHG - 11 BLKDROP // s_addr query_id - 4 PUSHINT // s_addr query_id _100=4 - return_stake CALLDICT - }> // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value - s0 s1 PUSH2 // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value msg_value min_stake - LESS // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value _102 - IFJMP:<{ // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value - s9 s11 XCHG - 11 BLKDROP // s_addr query_id - 5 PUSHINT // s_addr query_id _103=5 - return_stake CALLDICT - }> // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value - DUP // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value msg_value - 44 THROWIFNOT - ACCEPT - NOW // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value _109 - NEWC // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake msg_value _109 _110 - ROT // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake _109 _110 msg_value - STGRAMS // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake _109 _111 - 32 STU // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake max_factor members elect_close min_stake _113 - s1 s4 XCHG // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake min_stake members elect_close max_factor _113 - 32 STU // s_addr elect_at adnl_addr query_id ds src_addr validator_pubkey total_stake min_stake members elect_close _115 - s1 s6 XCHG // s_addr elect_at adnl_addr query_id ds elect_close validator_pubkey total_stake min_stake members src_addr _115 - 256 STU // s_addr elect_at adnl_addr query_id ds elect_close validator_pubkey total_stake min_stake members _117 - s1 s8 XCHG // s_addr elect_at members query_id ds elect_close validator_pubkey total_stake min_stake adnl_addr _117 - 256 STU // s_addr elect_at members query_id ds elect_close validator_pubkey total_stake min_stake _119 - s0 s3 s7 XCHG3 - 8 PUSHPOW2 // s_addr elect_at total_stake query_id ds elect_close min_stake _119 validator_pubkey members _120=256 - DICTUSETB // s_addr elect_at total_stake query_id ds elect_close min_stake members - FALSE // s_addr elect_at total_stake query_id ds elect_close min_stake members _122 - s5 s7 XCHG - s3 s4 XCHG - s2 s3 XCHG - s2 s6 XCHG - FALSE // s_addr query_id ds elect_at elect_close min_stake total_stake members _122 _123 - pack_elect CALLDICT // s_addr query_id ds elect - NEWC // s_addr query_id ds elect _125 - STDICT // s_addr query_id ds _126 - SWAP // s_addr query_id _126 ds - STSLICER // s_addr query_id _127 - ENDC // s_addr query_id _128 - c4 POP - DUP // s_addr query_id query_id - IFJMP:<{ // s_addr query_id - 0 PUSHINT // s_addr query_id _130=0 - send_confirmation CALLDICT - }> // s_addr query_id - 2DROP // - }> - unfreeze_without_bonuses PROC:<{ - // credits freeze_dict tot_stakes - 0 PUSHINT // credits freeze_dict tot_stakes _5=0 - DUP // credits freeze_dict tot_stakes total=0 recovered=0 - -1 PUSHINT // credits freeze_dict tot_stakes total=0 recovered=0 pubkey=-1 - UNTIL:<{ - s4 PUSH - 8 PUSHPOW2 // credits freeze_dict tot_stakes total recovered pubkey freeze_dict _10=256 - DICTUGETNEXT - NULLSWAPIFNOT - NULLSWAPIFNOT // credits freeze_dict tot_stakes total recovered cs pubkey f - DUP // credits freeze_dict tot_stakes total recovered cs pubkey f f - IF:<{ // credits freeze_dict tot_stakes total recovered cs pubkey f - s0 s2 XCHG // credits freeze_dict tot_stakes total recovered f pubkey cs - 256 LDU // credits freeze_dict tot_stakes total recovered f pubkey _16 cs - 64 LDU // credits freeze_dict tot_stakes total recovered f pubkey _16 _42 _41 - NIP // credits freeze_dict tot_stakes total recovered f pubkey _16 cs - LDGRAMS // credits freeze_dict tot_stakes total recovered f pubkey _16 _22 cs - 1 LDI // credits freeze_dict tot_stakes total recovered f pubkey addr stake banned cs - ENDS - IF:<{ // credits freeze_dict tot_stakes total recovered f pubkey addr stake - NIP // credits freeze_dict tot_stakes total recovered f pubkey stake - s3 s3 XCPU // credits freeze_dict tot_stakes total stake f pubkey recovered stake - ADD // credits freeze_dict tot_stakes total stake f pubkey recovered - }>ELSE<{ // credits freeze_dict tot_stakes total recovered f pubkey addr stake - s8 s8 s8 XC2PU // stake freeze_dict tot_stakes total recovered f pubkey credits addr stake - ~credit_to CALLDICT // stake freeze_dict tot_stakes total recovered f pubkey credits - s0 s7 XCHG - s0 s3 XCHG // credits freeze_dict tot_stakes total stake f pubkey recovered - }> - s4 s3 XCHG2 // credits freeze_dict tot_stakes pubkey recovered f total stake - ADD // credits freeze_dict tot_stakes pubkey recovered f total - }>ELSE<{ - s4 s2 XCHG2 - DROP // credits freeze_dict tot_stakes pubkey recovered f total - }> - SWAP // credits freeze_dict tot_stakes pubkey recovered total f - NOT // credits freeze_dict tot_stakes pubkey recovered total _32 - s1 s3 XCHG // credits freeze_dict tot_stakes total recovered pubkey _32 - }> // credits freeze_dict tot_stakes total recovered pubkey - DROP - s3 POP // credits recovered tot_stakes total - SWAP // credits recovered total tot_stakes - EQUAL // credits recovered _34 - 59 THROWIFNOT - }> - unfreeze_with_bonuses PROC:<{ - // credits freeze_dict tot_stakes tot_bonuses - 0 PUSHINT // credits freeze_dict tot_stakes tot_bonuses _7=0 - s0 s0 PUSH2 // credits freeze_dict tot_stakes tot_bonuses total=0 returned_bonuses=0 recovered=0 - -1 PUSHINT // credits freeze_dict tot_stakes tot_bonuses total=0 returned_bonuses=0 recovered=0 pubkey=-1 - UNTIL:<{ - s6 PUSH - 8 PUSHPOW2 // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered pubkey freeze_dict _12=256 - DICTUGETNEXT - NULLSWAPIFNOT - NULLSWAPIFNOT // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered cs pubkey f - DUP // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered cs pubkey f f - IF:<{ // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered cs pubkey f - s0 s2 XCHG // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey cs - 256 LDU // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey _18 cs - 64 LDU // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey _18 _52 _51 - NIP // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey _18 cs - LDGRAMS // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey _18 _24 cs - 1 LDI // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake banned cs - ENDS - IF:<{ // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake - NIP // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey stake - s3 s3 XCPU // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses stake f pubkey recovered stake - ADD // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses stake f pubkey recovered - }>ELSE<{ // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake - s7 s0 s8 PUSH3 // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake tot_bonuses stake tot_stakes - MULDIV // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake bonus - s6 s6 XCPU // credits freeze_dict tot_stakes tot_bonuses total bonus recovered f pubkey addr stake returned_bonuses bonus - ADD // credits freeze_dict tot_stakes tot_bonuses total bonus recovered f pubkey addr stake returned_bonuses - s1 s6 PUXC // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake stake bonus - ADD // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey addr stake _35 - s11 s11 s0 XCHG3 // stake freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey credits addr _35 - ~credit_to CALLDICT // stake freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered f pubkey credits - s0 s9 XCHG - s0 s3 XCHG // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses stake f pubkey recovered - }> - s5 s3 XCHG2 // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered f total stake - ADD // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered f total - }>ELSE<{ - s5 s2 XCHG2 - DROP // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered f total - }> - SWAP // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered total f - NOT // credits freeze_dict tot_stakes tot_bonuses pubkey returned_bonuses recovered total _38 - s1 s4 XCHG // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered pubkey _38 - }> // credits freeze_dict tot_stakes tot_bonuses total returned_bonuses recovered pubkey - DROP - s5 POP // credits recovered tot_stakes tot_bonuses total returned_bonuses - s0 s3 XCHG // credits recovered returned_bonuses tot_bonuses total tot_stakes - EQUAL // credits recovered returned_bonuses tot_bonuses _40 - s2 s1 PUSH2 // credits recovered returned_bonuses tot_bonuses _40 returned_bonuses tot_bonuses - LEQ // credits recovered returned_bonuses tot_bonuses _40 _41 - AND // credits recovered returned_bonuses tot_bonuses _42 - 59 THROWIFNOT - s1 s2 XCHG // credits returned_bonuses recovered tot_bonuses - ADD // credits returned_bonuses _44 - SWAP // credits _44 returned_bonuses - SUB // credits _45 - }> - unfreeze_all PROC:<{ - // credits past_elections elect_id - SWAP - 32 PUSHINT // credits elect_id past_elections _6=32 - DICTUDELGET - NULLSWAPIFNOT // credits past_elections fs f - IFNOTJMP:<{ // credits past_elections fs - DROP // credits past_elections - 0 PUSHINT // credits past_elections _8=0 - }> // credits past_elections fs - 64 LDU // credits past_elections _44 _43 - NIP // credits past_elections fs - 256 LDU // credits past_elections _46 _45 - NIP // credits past_elections fs - LDDICT // credits past_elections _21 fs - LDGRAMS // credits past_elections _21 _23 fs - LDGRAMS // credits past_elections _21 _23 _25 fs - LDDICT // credits past_elections _21 _23 _25 _54 _53 - NIP // credits past_elections fdict tot_stakes bonuses fs - ENDS - DUP // credits past_elections fdict tot_stakes bonuses bonuses - 0 GTINT // credits past_elections fdict tot_stakes bonuses _32 - IF:<{ // credits past_elections fdict tot_stakes bonuses - s3 s4 XCHG // past_elections credits fdict tot_stakes bonuses - unfreeze_with_bonuses CALLDICT // past_elections credits _33 - }>ELSE<{ // credits past_elections fdict tot_stakes bonuses - DROP // credits past_elections fdict tot_stakes - s2 s3 XCHG // past_elections credits fdict tot_stakes - unfreeze_without_bonuses CALLDICT // past_elections credits _33 - }> // past_elections credits unused_prizes - s1 s2 XCHG // credits past_elections unused_prizes - }> - config_set_confirmed PROC:<{ - // s_addr cs query_id ok - s2 POP // s_addr ok query_id - s0 s2 XCHG // query_id ok s_addr - REWRITESTDADDR // query_id ok src_wc src_addr - 0 PUSHINT // query_id ok src_wc src_addr _8=0 - CONFIGOPTPARAM // query_id ok src_wc src_addr _9 - CTOS // query_id ok src_wc src_addr _10 - 256 PLDU // query_id ok src_wc src_addr config_addr - c4 PUSH // query_id ok src_wc src_addr config_addr _14 - CTOS // query_id ok src_wc src_addr config_addr ds - LDDICT // query_id ok src_wc src_addr config_addr elect ds - s0 s4 XCHG // query_id ok ds src_addr config_addr elect src_wc - INC // query_id ok ds src_addr config_addr elect _20 - 2SWAP // query_id ok ds elect _20 src_addr config_addr - NEQ // query_id ok ds elect _20 _21 - OR // query_id ok ds elect _22 - OVER // query_id ok ds elect _22 elect - ISNULL // query_id ok ds elect _22 _23 - OR // query_id ok ds elect _24 - IFJMP:<{ // query_id ok ds elect - 4 BLKDROP // - }> // query_id ok ds elect - unpack_elect CALLDICT // query_id ok ds _63 _64 _65 _66 _67 _68 _69 - s0 s5 XCHG - 5 BLKDROP // query_id ok ds elect_at finished - s1 s4 PUXC // finished ok ds elect_at elect_at query_id - NEQ // finished ok ds elect_at _33 - s0 s4 XCHG // _33 ok ds elect_at finished - NOT // _33 ok ds elect_at _34 - s1 s4 XCHG // elect_at ok ds _33 _34 - OR // elect_at ok ds _35 - IFJMP:<{ // elect_at ok ds - 3 BLKDROP // - }> // elect_at ok ds - ACCEPT - SWAP // elect_at ds ok - IFNOT:<{ // elect_at ds - LDDICT // elect_at _40 ds - LDDICT // elect_at _40 _42 ds - LDGRAMS // elect_at credits past_elections grams ds - s3 s3 s4 XCHG3 // ds grams credits past_elections elect_at - unfreeze_all CALLDICT // ds grams credits past_elections unused_prizes - FALSE // ds grams credits past_elections unused_prizes _48 - NEWC // ds grams credits past_elections unused_prizes _48 _49 - 1 STI // ds grams credits past_elections unused_prizes _51 - s1 s3 XCHG // ds grams unused_prizes past_elections credits _51 - STDICT // ds grams unused_prizes past_elections _52 - STDICT // ds grams unused_prizes _53 - -ROT // ds _53 grams unused_prizes - ADD // ds _53 _54 - STGRAMS // ds _55 - SWAP // _55 ds - STSLICER // _56 - ENDC // _57 - c4 POP - }>ELSE<{ - 2DROP // - }> - }> - process_simple_transfer PROC:<{ - // s_addr msg_value - load_data CALLDICT // s_addr msg_value elect credits past_elect grams active_id active_hash - s0 s7 XCHG // active_hash msg_value elect credits past_elect grams active_id s_addr - REWRITESTDADDR // active_hash msg_value elect credits past_elect grams active_id src_wc src_addr - SWAP // active_hash msg_value elect credits past_elect grams active_id src_addr src_wc - INC // active_hash msg_value elect credits past_elect grams active_id src_addr _13 - OR // active_hash msg_value elect credits past_elect grams active_id _14 - OVER // active_hash msg_value elect credits past_elect grams active_id _14 active_id - 0 EQINT // active_hash msg_value elect credits past_elect grams active_id _14 _16 - OR // active_hash msg_value elect credits past_elect grams active_id _17 - IFJMP:<{ // active_hash msg_value elect credits past_elect grams active_id - s0 s5 XCHG // active_hash active_id elect credits past_elect grams msg_value - ADD // active_hash active_id elect credits past_elect grams - 2 4 BLKSWAP - SWAP // elect credits past_elect grams active_id active_hash - store_data CALLDICT - }> // active_hash msg_value elect credits past_elect grams active_id - s0 s2 PUSH2 - 32 PUSHINT // active_hash msg_value elect credits past_elect grams active_id active_id past_elect _22=32 - DICTUGET - NULLSWAPIFNOT // active_hash msg_value elect credits past_elect grams active_id fs f - IF:<{ // active_hash msg_value elect credits past_elect grams active_id fs - 64 LDU // active_hash msg_value elect credits past_elect grams active_id _30 fs - 256 LDU // active_hash msg_value elect credits past_elect grams active_id _30 _33 fs - LDDICT // active_hash msg_value elect credits past_elect grams active_id _30 _33 _36 fs - LDGRAMS // active_hash msg_value elect credits past_elect grams active_id _30 _33 _36 _38 fs - LDGRAMS // active_hash msg_value elect credits past_elect grams active_id data hash dict total_stake bonuses fs - s0 s11 XCHG // active_hash fs elect credits past_elect grams active_id data hash dict total_stake bonuses msg_value - ADD // active_hash fs elect credits past_elect grams active_id data hash dict total_stake bonuses - NEWC // active_hash fs elect credits past_elect grams active_id data hash dict total_stake bonuses _44 - s1 s5 XCHG // active_hash fs elect credits past_elect grams active_id bonuses hash dict total_stake data _44 - 64 STU // active_hash fs elect credits past_elect grams active_id bonuses hash dict total_stake _46 - s1 s3 XCHG // active_hash fs elect credits past_elect grams active_id bonuses total_stake dict hash _46 - 256 STU // active_hash fs elect credits past_elect grams active_id bonuses total_stake dict _48 - STDICT // active_hash fs elect credits past_elect grams active_id bonuses total_stake _49 - SWAP // active_hash fs elect credits past_elect grams active_id bonuses _49 total_stake - STGRAMS // active_hash fs elect credits past_elect grams active_id bonuses _50 - SWAP // active_hash fs elect credits past_elect grams active_id _50 bonuses - STGRAMS // active_hash fs elect credits past_elect grams active_id _51 - s0 s6 XCHG2 // active_hash active_id elect credits past_elect grams _51 fs - STSLICER // active_hash active_id elect credits past_elect grams _52 - SWAP - 32 PUSHINT - s6 s3 s3 PUXC2 // active_hash active_id elect credits grams _52 active_id past_elect _53=32 - DICTUSETB // active_hash active_id elect credits grams past_elect - }>ELSE<{ // active_hash msg_value elect credits past_elect grams active_id fs - DROP // active_hash msg_value elect credits past_elect grams active_id - s0 s5 XCHG // active_hash active_id elect credits past_elect grams msg_value - ADD // active_hash active_id elect credits past_elect grams - SWAP // active_hash active_id elect credits grams past_elect - }> - s3 s5 XCHG - s1 s4 s3 XCHG3 // elect credits past_elect grams active_id active_hash - store_data CALLDICT - }> - recover_stake PROC:<{ - // op s_addr cs query_id - NIP // op s_addr query_id - OVER // op s_addr query_id s_addr - REWRITESTDADDR // op s_addr query_id src_wc src_addr - SWAP // op s_addr query_id src_addr src_wc - INC // op s_addr query_id src_addr _8 - IFJMP:<{ // op s_addr query_id src_addr - DROP // op s_addr query_id - 4294967294 PUSHINT // op s_addr query_id _9=4294967294 - 0 PUSHINT // op s_addr query_id _9=4294967294 _10=0 - s3 s4 XCHG - s1 s3 XCHG - 64 PUSHINT // s_addr _9=4294967294 query_id op _10=0 _11=64 - send_message_back CALLDICT - }> // op s_addr query_id src_addr - c4 PUSH // op s_addr query_id src_addr _14 - CTOS // op s_addr query_id src_addr ds - LDDICT // op s_addr query_id src_addr _18 ds - LDDICT // op s_addr query_id src_addr elect credits ds - s3 s3 XCHG2 - 8 PUSHPOW2 // op s_addr query_id ds elect src_addr credits _25=256 - DICTUDELGET - NULLSWAPIFNOT // op s_addr query_id ds elect credits cs f - IFNOTJMP:<{ // op s_addr query_id ds elect credits cs - 4 BLKDROP // op s_addr query_id - 4294967294 PUSHINT // op s_addr query_id _27=4294967294 - 0 PUSHINT // op s_addr query_id _27=4294967294 _28=0 - s3 s4 XCHG - s1 s3 XCHG - 64 PUSHINT // s_addr _27=4294967294 query_id op _28=0 _29=64 - send_message_back CALLDICT - }> // op s_addr query_id ds elect credits cs - s6 POP // cs s_addr query_id ds elect credits - s0 s5 XCHG // credits s_addr query_id ds elect cs - LDGRAMS // credits s_addr query_id ds elect amount cs - ENDS - NEWC // credits s_addr query_id ds elect amount _35 - s1 s2 XCHG // credits s_addr query_id ds amount elect _35 - STDICT // credits s_addr query_id ds amount _36 - s1 s5 XCHG // amount s_addr query_id ds credits _36 - STDICT // amount s_addr query_id ds _37 - SWAP // amount s_addr query_id _37 ds - STSLICER // amount s_addr query_id _38 - ENDC // amount s_addr query_id _39 - c4 POP - 4184830756 PUSHINT // amount s_addr query_id _41=4184830756 - 0 PUSHINT // amount s_addr query_id _41=4184830756 _42=0 - 24 PUSHINT // amount s_addr query_id _41=4184830756 _42=0 _43=24 - NEWC // amount s_addr query_id _41=4184830756 _42=0 _43=24 _44 - 6 STU // amount s_addr query_id _41=4184830756 _42=0 _46 - s0 s4 XCHG2 // amount _42=0 query_id _41=4184830756 _46 s_addr - STSLICER // amount _42=0 query_id _41=4184830756 _47 - s0 s4 XCHG2 // _41=4184830756 _42=0 query_id _47 amount - STGRAMS // _41=4184830756 _42=0 query_id _48 - s1 s2 XCHG // _41=4184830756 query_id _42=0 _48 - 107 STU // _41=4184830756 query_id _62 - s1 s2 XCHG // query_id _41=4184830756 _62 - 32 STU // query_id _64 - 64 STU // _66 - ENDC // _67 - 64 PUSHINT // _67 _68=64 - SENDRAWMSG - }> - after_code_upgrade PROC:<{ - // s_addr cs query_id - NIP // s_addr query_id - 1313042276 PUSHINT // s_addr query_id op=1313042276 - 3460525924 PUSHINT // s_addr query_id op=1313042276 _5=3460525924 - 0 PUSHINT // s_addr query_id op=1313042276 _5=3460525924 _6=0 - s3 s3 s0 XCHG3 - 64 PUSHINT // s_addr _5=3460525924 query_id op=1313042276 _6=0 _7=64 - send_message_back CALLDICT - }> - upgrade_code PROC:<{ - // s_addr cs query_id - 0 PUSHINT // s_addr cs query_id _4=0 - CONFIGOPTPARAM // s_addr cs query_id c_addr - DUP // s_addr cs query_id c_addr c_addr - ISNULL // s_addr cs query_id c_addr _6 - IFJMP:<{ // s_addr cs query_id c_addr - 4 BLKDROP // - FALSE // _7 - }> // s_addr cs query_id c_addr - CTOS // s_addr cs query_id _9 - 256 PLDU // s_addr cs query_id config_addr - s3 PUSH // s_addr cs query_id config_addr s_addr - REWRITESTDADDR // s_addr cs query_id config_addr src_wc src_addr - SWAP // s_addr cs query_id config_addr src_addr src_wc - INC // s_addr cs query_id config_addr src_addr _16 - s0 s2 XCHG // s_addr cs query_id _16 src_addr config_addr - NEQ // s_addr cs query_id _16 _17 - OR // s_addr cs query_id _18 - IFJMP:<{ // s_addr cs query_id - 3 BLKDROP // - FALSE // _19 - }> // s_addr cs query_id - ACCEPT - SWAP // s_addr query_id cs - LDREF // s_addr query_id code cs - OVER // s_addr query_id code cs code - SETCODE - DUP // s_addr query_id code cs cs - SEMPTY // s_addr query_id code cs _25 - IFNOT:<{ // s_addr query_id code cs - SWAP // s_addr query_id cs code - c3 POP - SWAP // s_addr cs query_id - after_code_upgrade CALLDICT - 0 THROW - }>ELSE<{ - 4 BLKDROP // - }> - TRUE // _30 - }> - recv_internal PROC:<{ - // msg_value in_msg_cell in_msg - SWAP // msg_value in_msg in_msg_cell - CTOS // msg_value in_msg cs - 4 LDU // msg_value in_msg flags cs - SWAP - 1 PUSHINT // msg_value in_msg cs flags _9=1 - AND // msg_value in_msg cs _10 - IFJMP:<{ // msg_value in_msg cs - 3 BLKDROP // - }> // msg_value in_msg cs - LDMSGADDR // msg_value in_msg _61 _60 - DROP // msg_value in_msg s_addr - OVER // msg_value in_msg s_addr in_msg - SEMPTY // msg_value in_msg s_addr _14 - IFJMP:<{ // msg_value in_msg s_addr - NIP // msg_value s_addr - SWAP // s_addr msg_value - process_simple_transfer CALLDICT - }> // msg_value in_msg s_addr - SWAP // msg_value s_addr in_msg - 32 LDU // msg_value s_addr op in_msg - OVER // msg_value s_addr op in_msg op - 0 EQINT // msg_value s_addr op in_msg _21 - IFJMP:<{ // msg_value s_addr op in_msg - 2DROP // msg_value s_addr - SWAP // s_addr msg_value - process_simple_transfer CALLDICT - }> // msg_value s_addr op in_msg - 64 LDU // msg_value s_addr op query_id in_msg - s2 PUSH - 1316189259 PUSHINT // msg_value s_addr op query_id in_msg op _27=1316189259 - EQUAL // msg_value s_addr op query_id in_msg _28 - IFJMP:<{ // msg_value s_addr op query_id in_msg - s2 POP // msg_value s_addr in_msg query_id - s2 s3 XCHG // s_addr msg_value in_msg query_id - process_new_stake CALLDICT - }> // msg_value s_addr op query_id in_msg - s4 POP // in_msg s_addr op query_id - OVER - 1197831204 PUSHINT // in_msg s_addr op query_id op _30=1197831204 - EQUAL // in_msg s_addr op query_id _31 - IFJMP:<{ // in_msg s_addr op query_id - s1 s3 XCHG // op s_addr in_msg query_id - recover_stake CALLDICT - }> // in_msg s_addr op query_id - OVER - 1313042276 PUSHINT // in_msg s_addr op query_id op _33=1313042276 - EQUAL // in_msg s_addr op query_id _34 - IFJMP:<{ // in_msg s_addr op query_id - s2 s3 s3 PUXCPU // query_id s_addr op s_addr in_msg query_id - upgrade_code CALLDICT // query_id s_addr op ok - IF:<{ // query_id s_addr op - 3460525924 PUSHINT // query_id s_addr op _37=3460525924 - }>ELSE<{ // query_id s_addr op - 32 PUSHPOW2DEC // query_id s_addr op _37=4294967295 - }> - 0 PUSHINT // query_id s_addr op _37 _40=0 - s3 s4 XCHG - s3 s3 s0 XCHG3 - 64 PUSHINT // s_addr _37 query_id op _40=0 _41=64 - send_message_back CALLDICT - }> // in_msg s_addr op query_id - OVER - 4000730955 PUSHINT // in_msg s_addr op query_id op _44=4000730955 - EQUAL // in_msg s_addr op query_id cfg_ok - s2 PUSH - 4000730991 PUSHINT // in_msg s_addr op query_id cfg_ok op _46=4000730991 - EQUAL // in_msg s_addr op query_id cfg_ok _47 - s1 s(-1) PUXC // in_msg s_addr op query_id cfg_ok cfg_ok _47 - OR // in_msg s_addr op query_id cfg_ok _48 - IFJMP:<{ // in_msg s_addr op query_id cfg_ok - s2 POP // in_msg s_addr cfg_ok query_id - s2 s3 XCHG - SWAP // s_addr in_msg query_id cfg_ok - config_set_confirmed CALLDICT - }> // in_msg s_addr op query_id cfg_ok - DROP - s3 POP // query_id s_addr op - DUP - 31 PUSHPOW2 // query_id s_addr op op _52 - AND // query_id s_addr op _53 - IFNOTJMP:<{ // query_id s_addr op - 32 PUSHPOW2DEC // query_id s_addr op _54=4294967295 - 0 PUSHINT // query_id s_addr op _54=4294967295 _55=0 - s3 s4 XCHG - s3 s3 s0 XCHG3 - 64 PUSHINT // s_addr _54=4294967295 query_id op _55=0 _56=64 - send_message_back CALLDICT - }> // query_id s_addr op - 3 BLKDROP // - }> - postpone_elections PROC:<{ - // - FALSE // _0 - }> - compute_total_stake PROC:<{ - // l n m_stake - 0 PUSHINT // l n m_stake tot_stake=0 - s0 s2 XCHG // l tot_stake=0 m_stake n - REPEAT:<{ // l tot_stake m_stake - s0 s2 XCHG // m_stake tot_stake l - UNCONS // m_stake tot_stake h l - OVER // m_stake tot_stake h l h - 0 INDEX // m_stake tot_stake h l stake - s0 s2 XCHG // m_stake tot_stake stake l h - 1 INDEX // m_stake tot_stake stake l max_f - s4 PUSH // m_stake tot_stake stake l max_f m_stake - MUL // m_stake tot_stake stake l _13 - 16 RSHIFT# // m_stake tot_stake stake l _15 - s1 s2 XCHG // m_stake tot_stake l stake _15 - MIN // m_stake tot_stake l stake - s1 s2 XCHG // m_stake l tot_stake stake - ADD // m_stake l tot_stake - ROT // l tot_stake m_stake - }> - DROP - NIP // tot_stake - }> - try_elect PROC:<{ - // credits members min_stake max_stake min_total_stake max_stake_factor - 16 PUSHINT // credits members min_stake max_stake min_total_stake max_stake_factor _7=16 - CONFIGOPTPARAM // credits members min_stake max_stake min_total_stake max_stake_factor _8 - CTOS // credits members min_stake max_stake min_total_stake max_stake_factor cs - 16 LDU // credits members min_stake max_stake min_total_stake max_stake_factor _13 cs - 16 LDU // credits members min_stake max_stake min_total_stake max_stake_factor _13 _253 _252 - NIP // credits members min_stake max_stake min_total_stake max_stake_factor _13 cs - 16 LDU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators cs - ENDS - 1 PUSHINT // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators _23=1 - MAX // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators - 0 PUSHINT // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n=0 - NEWDICT // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n=0 sdict - -1 PUSHINT // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n=0 sdict pubkey=-1 - UNTIL:<{ - s9 PUSH - 8 PUSHPOW2 // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict pubkey members _33=256 - DICTUGETNEXT - NULLSWAPIFNOT - NULLSWAPIFNOT // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict cs pubkey f - DUP // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict cs pubkey f f - IF:<{ // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict cs pubkey f - s0 s2 XCHG // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey cs - LDGRAMS // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey _40 cs - 32 LDU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey _40 _42 cs - 32 LDU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey _40 _42 _45 cs - 256 LDU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey _40 _42 _45 _48 cs - 256 LDU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey stake time max_factor addr adnl_addr cs - ENDS - s0 s3 XCHG // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey stake adnl_addr max_factor addr time - NEGATE // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey stake adnl_addr max_factor addr _56 - NEWC // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey stake adnl_addr max_factor addr _56 _57 - s1 s5 XCHG // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey _56 adnl_addr max_factor addr stake _57 - 128 STU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey _56 adnl_addr max_factor addr _59 - s1 s4 XCHG // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr max_factor _56 _59 - 32 STI // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr max_factor _61 - s4 s(-1) PUXC // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr max_factor pubkey _61 - 256 STU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr max_factor _63 - ENDC // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr max_factor _64 - CTOS // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr max_factor key - s1 s10 XCPU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr key max_factor max_stake_factor - MIN // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr key _67 - NEWC // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr key _67 _68 - 32 STU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey addr adnl_addr key _70 - s1 s3 XCHG // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey key adnl_addr addr _70 - 256 STU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey key adnl_addr _72 - 256 STU // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict f pubkey key _74 - s0 s1 s4 XCHG3 - 416 PUSHINT // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n pubkey f _74 key sdict _79 - DICTSETB // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n pubkey f sdict - s0 s3 XCHG // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators sdict pubkey f n - INC // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators sdict pubkey f n - }>ELSE<{ - s3 s4 XCHG - 2SWAP - DROP // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators sdict pubkey f n - }> - SWAP // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators sdict pubkey n f - NOT // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators sdict pubkey n _83 - s3 s3 s0 XCHG3 // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict pubkey _83 - }> // credits members min_stake max_stake min_total_stake max_stake_factor max_validators min_validators n sdict pubkey - DROP - s4 POP // credits members min_stake max_stake min_total_stake sdict max_validators min_validators n - ROT // credits members min_stake max_stake min_total_stake sdict min_validators n max_validators - MIN // credits members min_stake max_stake min_total_stake sdict min_validators n - s0 s1 PUSH2 // credits members min_stake max_stake min_total_stake sdict min_validators n n min_validators - LESS // credits members min_stake max_stake min_total_stake sdict min_validators n _85 - IFJMP:<{ // credits members min_stake max_stake min_total_stake sdict min_validators n - 7 BLKDROP // credits - NEWDICT // credits _86 - NEWDICT // credits _86 _87 - 0 PUSHINT // credits _86 _87 _88=0 - DUP // credits _86 _87 _88=0 _89=0 - }> // credits members min_stake max_stake min_total_stake sdict min_validators n - PUSHNULL // credits members min_stake max_stake min_total_stake sdict min_validators n l - UNTIL:<{ - s0 s3 XCHG - 416 PUSHINT // credits members min_stake max_stake min_total_stake l min_validators n sdict _100 - DICTREMMIN - NULLSWAPIFNOT - NULLSWAPIFNOT // credits members min_stake max_stake min_total_stake l min_validators n sdict cs key f - DUP // credits members min_stake max_stake min_total_stake l min_validators n sdict cs key f f - IF:<{ // credits members min_stake max_stake min_total_stake l min_validators n sdict cs key f - SWAP // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f key - 128 LDU // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f _105 key - s1 s9 XCPU // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f key _105 max_stake - MIN // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f key _108 - SWAP // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f _108 key - 32 LDU // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f _108 _279 _278 - NIP // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f _108 key - 256 PLDU // credits members min_stake max_stake min_total_stake l min_validators n sdict cs f stake pubkey - s0 s3 XCHG // credits members min_stake max_stake min_total_stake l min_validators n sdict pubkey f stake cs - 32 LDU // credits members min_stake max_stake min_total_stake l min_validators n sdict pubkey f stake _117 cs - 256 LDU // credits members min_stake max_stake min_total_stake l min_validators n sdict pubkey f stake _117 _283 _282 - NIP // credits members min_stake max_stake min_total_stake l min_validators n sdict pubkey f stake _117 cs - 256 PLDU // credits members min_stake max_stake min_total_stake l min_validators n sdict pubkey f stake max_f adnl_addr - s1 s3 s0 XCHG3 - s1 s4 XCHG // credits members min_stake max_stake min_total_stake l min_validators n sdict f stake max_f pubkey adnl_addr - 4 TUPLE // credits members min_stake max_stake min_total_stake l min_validators n sdict f _125 - s0 s5 XCHG2 // credits members min_stake max_stake min_total_stake f min_validators n sdict _125 l - CONS // credits members min_stake max_stake min_total_stake f min_validators n sdict l - }>ELSE<{ - s6 s1 s6 XCHG3 - 2DROP // credits members min_stake max_stake min_total_stake f min_validators n sdict l - }> - s0 s4 XCHG // credits members min_stake max_stake min_total_stake l min_validators n sdict f - NOT // credits members min_stake max_stake min_total_stake l min_validators n sdict _127 - s1 s4 XCHG // credits members min_stake max_stake min_total_stake sdict min_validators n l _127 - }> // credits members min_stake max_stake min_total_stake sdict min_validators n l - s3 POP - s4 POP // credits members min_stake n min_total_stake l min_validators - DEC // credits members min_stake n min_total_stake l i - 2DUP // credits members min_stake n min_total_stake l i l1 i - REPEAT:<{ // credits members min_stake n min_total_stake l i l1 - CDR // credits members min_stake n min_total_stake l i l1 - }> - 0 PUSHINT // credits members min_stake n min_total_stake l i l1 _135=0 - DUP // credits members min_stake n min_total_stake l i l1 best_stake=0 m=0 - UNTIL:<{ - s0 s2 XCHG // credits members min_stake n min_total_stake l i m best_stake l1 - UNCONS // credits members min_stake n min_total_stake l i m best_stake _138 l1 - SWAP // credits members min_stake n min_total_stake l i m best_stake l1 _138 - 0 INDEX // credits members min_stake n min_total_stake l i m best_stake l1 stake - s0 s4 XCHG // credits members min_stake n min_total_stake l stake m best_stake l1 i - INC // credits members min_stake n min_total_stake l stake m best_stake l1 i - s4 s8 PUSH2 // credits members min_stake n min_total_stake l stake m best_stake l1 i stake min_stake - GEQ // credits members min_stake n min_total_stake l stake m best_stake l1 i _144 - IF:<{ // credits members min_stake n min_total_stake l stake m best_stake l1 i - s5 s(-1) s4 PU2XC // credits members min_stake n min_total_stake l i m best_stake l1 l i stake - compute_total_stake CALLDICT // credits members min_stake n min_total_stake l i m best_stake l1 tot_stake - s0 s2 PUSH2 // credits members min_stake n min_total_stake l i m best_stake l1 tot_stake tot_stake best_stake - GREATER // credits members min_stake n min_total_stake l i m best_stake l1 tot_stake _147 - IF:<{ // credits members min_stake n min_total_stake l i m best_stake l1 tot_stake - s2 POP - s2 POP // credits members min_stake n min_total_stake l i l1 tot_stake - s2 PUSH // credits members min_stake n min_total_stake l i l1 best_stake m - }>ELSE<{ - s1 s3 XCHG - DROP // credits members min_stake n min_total_stake l i l1 best_stake m - }> - }>ELSE<{ - s3 s4 XCHG2 - DROP // credits members min_stake n min_total_stake l i l1 best_stake m - }> - s3 s6 PUSH2 // credits members min_stake n min_total_stake l i l1 best_stake m i n - GEQ // credits members min_stake n min_total_stake l i l1 best_stake m _148 - }> // credits members min_stake n min_total_stake l i l1 best_stake m - s2 POP - s2 POP - s4 POP - s4 POP // credits members best_stake m min_total_stake l - s2 PUSH // credits members best_stake m min_total_stake l m - 0 EQINT // credits members best_stake m min_total_stake l _150 - s4 s2 PUXC // credits members best_stake m _150 l best_stake min_total_stake - LESS // credits members best_stake m _150 l _151 - s1 s2 XCHG // credits members best_stake m l _150 _151 - OR // credits members best_stake m l _152 - IFJMP:<{ // credits members best_stake m l - 4 BLKDROP // credits - NEWDICT // credits _153 - NEWDICT // credits _153 _154 - 0 PUSHINT // credits _153 _154 _155=0 - DUP // credits _153 _154 _155=0 _156=0 - }> // credits members best_stake m l - DUP // credits members best_stake m l l1 - s0 DUMP // credits members best_stake m l l1 - s2 PUSH // credits members best_stake m l l1 m - DEC // credits members best_stake m l l1 _161 - REPEAT:<{ // credits members best_stake m l l1 - CDR // credits members best_stake m l l1 - }> - CAR // credits members best_stake m l _164 - 0 INDEX // credits members best_stake m l m_stake - 0 PUSHINT // credits members best_stake m l m_stake i=0 - DUP // credits members best_stake m l m_stake i=0 tot_stake=0 - NEWDICT // credits members best_stake m l m_stake i=0 tot_stake=0 vset - NEWDICT // credits members best_stake m l m_stake i=0 tot_stake=0 vset frozen - UNTIL:<{ - s0 s5 XCHG // credits members best_stake m frozen m_stake i tot_stake vset l - UNCONS // credits members best_stake m frozen m_stake i tot_stake vset _179 l - SWAP // credits members best_stake m frozen m_stake i tot_stake vset l _179 - 4 UNTUPLE // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr - s1 s12 PUSH2 - 8 PUSHPOW2 // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr pubkey members _184=256 - DICTUGET - NULLSWAPIFNOT // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr val f - 61 THROWIFNOT - LDGRAMS // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr _295 _294 - NIP // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr val - 64 LDU // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr _297 _296 - NIP // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr val - 256 PLDU // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr src_addr - s8 s11 PUSH2 // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr src_addr i m - LESS // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr src_addr _198 - IF:<{ // credits members best_stake m frozen m_stake i tot_stake vset l stake max_f pubkey adnl_addr src_addr - s3 s9 XCPU // credits members best_stake m frozen m_stake i tot_stake vset l stake src_addr pubkey adnl_addr max_f m_stake - MUL // credits members best_stake m frozen m_stake i tot_stake vset l stake src_addr pubkey adnl_addr _200 - 16 RSHIFT# // credits members best_stake m frozen m_stake i tot_stake vset l stake src_addr pubkey adnl_addr _202 - s4 s(-1) PUXC // credits members best_stake m frozen m_stake i tot_stake vset l stake src_addr pubkey adnl_addr stake _202 - MIN // credits members best_stake m frozen m_stake i tot_stake vset l stake src_addr pubkey adnl_addr true_stake - s4 s4 XCPU // credits members best_stake m frozen m_stake i tot_stake vset l true_stake src_addr pubkey adnl_addr stake true_stake - SUB // credits members best_stake m frozen m_stake i tot_stake vset l true_stake src_addr pubkey adnl_addr stake - s4 PUSH // credits members best_stake m frozen m_stake i tot_stake vset l true_stake src_addr pubkey adnl_addr stake true_stake - 60 LSHIFT# // credits members best_stake m frozen m_stake i tot_stake vset l true_stake src_addr pubkey adnl_addr stake _207 - s13 PUSH // credits members best_stake m frozen m_stake i tot_stake vset l true_stake src_addr pubkey adnl_addr stake _207 best_stake - DIV // credits members best_stake m frozen m_stake i tot_stake vset l true_stake src_addr pubkey adnl_addr stake weight - s8 s5 XCPU // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake true_stake - ADD // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake - 2390828938 PUSHINT // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 - s3 PUSH // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 adnl_addr - IF:<{ // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 - 115 PUSHINT // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 _212=115 - }>ELSE<{ // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 - 83 PUSHINT // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 _212=83 - }> - NEWC // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 _212 _215 - 8 STU // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _211=2390828938 _217 - 32 STU // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _219 - s4 s(-1) PUXC // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake pubkey _219 - 256 STU // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake _221 - s9 s(-1) PUXC // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake weight _221 - 64 STU // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake vinfo - s3 PUSH // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake vinfo adnl_addr - IF:<{ // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey adnl_addr stake tot_stake vinfo - s1 s3 XCHG // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey tot_stake stake adnl_addr vinfo - 256 STU // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey tot_stake stake vinfo - }>ELSE<{ - s0 s3 XCHG2 - DROP // credits members best_stake m frozen m_stake i weight vset l true_stake src_addr pubkey tot_stake stake vinfo - }> - SWAP - 16 PUSHINT - s10 s8 s8 PUXC2 // credits members best_stake m frozen m_stake i weight stake l true_stake src_addr pubkey tot_stake vinfo i vset _228=16 - DICTUSETB // credits members best_stake m frozen m_stake i weight stake l true_stake src_addr pubkey tot_stake vset - FALSE // credits members best_stake m frozen m_stake i weight stake l true_stake src_addr pubkey tot_stake vset _231 - s4 PUSH - NEWC // credits members best_stake m frozen m_stake i weight stake l true_stake src_addr pubkey tot_stake vset _231 src_addr _232 - 256 STU // credits members best_stake m frozen m_stake i weight stake l true_stake src_addr pubkey tot_stake vset _231 _234 - s1 s9 XCHG // credits members best_stake m frozen m_stake i _231 stake l true_stake src_addr pubkey tot_stake vset weight _234 - 64 STU // credits members best_stake m frozen m_stake i _231 stake l true_stake src_addr pubkey tot_stake vset _236 - s0 s5 XCHG2 // credits members best_stake m frozen m_stake i _231 stake l vset src_addr pubkey tot_stake _236 true_stake - STGRAMS // credits members best_stake m frozen m_stake i _231 stake l vset src_addr pubkey tot_stake _237 - s1 s7 XCHG // credits members best_stake m frozen m_stake i tot_stake stake l vset src_addr pubkey _231 _237 - 1 STI // credits members best_stake m frozen m_stake i tot_stake stake l vset src_addr pubkey _239 - s0 s1 s9 XCHG3 - 8 PUSHPOW2 // credits members best_stake m src_addr m_stake i tot_stake stake l vset _239 pubkey frozen _240=256 - DICTUSETB // credits members best_stake m src_addr m_stake i tot_stake stake l vset frozen - }>ELSE<{ - s0 s10 XCHG - s4 s6 XCHG - s0 s3 XCHG - 3 BLKDROP // credits members best_stake m src_addr m_stake i tot_stake stake l vset frozen - }> - s3 PUSH // credits members best_stake m src_addr m_stake i tot_stake stake l vset frozen stake - IF:<{ // credits members best_stake m src_addr m_stake i tot_stake stake l vset frozen - s11 s7 s3 XCHG3 // l members best_stake m vset m_stake i tot_stake frozen credits src_addr stake - ~credit_to CALLDICT // l members best_stake m vset m_stake i tot_stake frozen credits - }>ELSE<{ - s11 s7 s3 XCHG3 - 2DROP // l members best_stake m vset m_stake i tot_stake frozen credits - }> - s0 s3 XCHG // l members best_stake m vset m_stake credits tot_stake frozen i - INC // l members best_stake m vset m_stake credits tot_stake frozen i - s9 PUSH // l members best_stake m vset m_stake credits tot_stake frozen i l - ISNULL // l members best_stake m vset m_stake credits tot_stake frozen i _246 - s4 s10 XCHG - s4 s6 XCHG - s4 s4 s0 XCHG3 // credits members best_stake m l m_stake i tot_stake vset frozen _246 - }> // credits members best_stake m l m_stake i tot_stake vset frozen - s3 POP - s3 POP - s3 POP - s5 POP // credits frozen best_stake m tot_stake vset - s1 s3 PUXC // credits frozen vset m tot_stake tot_stake best_stake - EQUAL // credits frozen vset m tot_stake _248 - 49 THROWIFNOT - s2 s3 XCHG - SWAP // credits vset frozen tot_stake m - }> - conduct_elections PROC:<{ - // ds elect credits - SWAP // ds credits elect - unpack_elect CALLDICT // ds credits _130 _131 _132 _133 _134 _135 _136 - s4 POP // ds credits elect_at elect_close finished total_stake members failed - NOW // ds credits elect_at elect_close finished total_stake members failed _11 - s5 PUSH // ds credits elect_at elect_close finished total_stake members failed _11 elect_close - LESS // ds credits elect_at elect_close finished total_stake members failed _12 - IFJMP:<{ // ds credits elect_at elect_close finished total_stake members failed - 8 BLKDROP // - FALSE // _13 - }> // ds credits elect_at elect_close finished total_stake members failed - 0 PUSHINT // ds credits elect_at elect_close finished total_stake members failed _14=0 - CONFIGOPTPARAM // ds credits elect_at elect_close finished total_stake members failed _15 - ISNULL // ds credits elect_at elect_close finished total_stake members failed _16 - IFJMP:<{ // ds credits elect_at elect_close finished total_stake members failed - 8 BLKDROP // - postpone_elections CALLDICT // _17 - }> // ds credits elect_at elect_close finished total_stake members failed - 17 PUSHINT // ds credits elect_at elect_close finished total_stake members failed _19=17 - CONFIGOPTPARAM // ds credits elect_at elect_close finished total_stake members failed _20 - CTOS // ds credits elect_at elect_close finished total_stake members failed cs - LDGRAMS // ds credits elect_at elect_close finished total_stake members failed min_stake cs - LDGRAMS // ds credits elect_at elect_close finished total_stake members failed min_stake max_stake cs - LDGRAMS // ds credits elect_at elect_close finished total_stake members failed min_stake max_stake min_total_stake cs - 32 LDU // ds credits elect_at elect_close finished total_stake members failed min_stake max_stake min_total_stake max_stake_factor cs - ENDS - s6 s1 PUSH2 // ds credits elect_at elect_close finished total_stake members failed min_stake max_stake min_total_stake max_stake_factor total_stake min_total_stake - LESS // ds credits elect_at elect_close finished total_stake members failed min_stake max_stake min_total_stake max_stake_factor _35 - IFJMP:<{ // ds credits elect_at elect_close finished total_stake members failed min_stake max_stake min_total_stake max_stake_factor - 12 BLKDROP // - postpone_elections CALLDICT // _36 - }> // ds credits elect_at elect_close finished total_stake members failed min_stake max_stake min_total_stake max_stake_factor - s0 s4 XCHG // ds credits elect_at elect_close finished total_stake members max_stake_factor min_stake max_stake min_total_stake failed - IFJMP:<{ // ds credits elect_at elect_close finished total_stake members max_stake_factor min_stake max_stake min_total_stake - 11 BLKDROP // - postpone_elections CALLDICT // _37 - }> // ds credits elect_at elect_close finished total_stake members max_stake_factor min_stake max_stake min_total_stake - s0 s6 XCHG // ds credits elect_at elect_close min_total_stake total_stake members max_stake_factor min_stake max_stake finished - IFJMP:<{ // ds credits elect_at elect_close min_total_stake total_stake members max_stake_factor min_stake max_stake - 10 BLKDROP // - FALSE // _38 - }> // ds credits elect_at elect_close min_total_stake total_stake members max_stake_factor min_stake max_stake - s3 s8 XCHG - s8 PUSH - s3 s2 XCPU - s7 s7 XCHG2 // ds members elect_at elect_close min_stake total_stake credits members min_stake max_stake min_total_stake max_stake_factor - try_elect CALLDICT // ds members elect_at elect_close min_stake total_stake credits vdict frozen total_stakes cnt - DUP // ds members elect_at elect_close min_stake total_stake credits vdict frozen total_stakes cnt cnt - 0 EQINT // ds members elect_at elect_close min_stake total_stake credits vdict frozen total_stakes cnt failed - DUP // ds members elect_at elect_close min_stake total_stake credits vdict frozen total_stakes cnt failed failed - NOT // ds members elect_at elect_close min_stake total_stake credits vdict frozen total_stakes cnt failed finished - s10 PUSH - s0 s6 XCHG - s5 s10 XCHG - s4 s9 XCHG - s3 s8 XCHG - s12 s12 s12 XCHG3 // ds vdict elect_at frozen total_stakes cnt credits elect_at elect_close min_stake total_stake members failed finished - pack_elect CALLDICT // ds vdict elect_at frozen total_stakes cnt credits elect - s2 PUSH // ds vdict elect_at frozen total_stakes cnt credits elect cnt - IFNOTJMP:<{ // ds vdict elect_at frozen total_stakes cnt credits elect - s2 POP - s2 POP - s2 POP - s2 POP - s2 POP // ds elect credits - NEWC // ds elect credits _48 - s1 s2 XCHG // ds credits elect _48 - STDICT // ds credits _49 - STDICT // ds _50 - SWAP // _50 ds - STSLICER // _51 - ENDC // _52 - c4 POP - postpone_elections CALLDICT // _54 - }> // ds vdict elect_at frozen total_stakes cnt credits elect - get_validator_conf CALLDICT // ds vdict elect_at frozen total_stakes cnt credits elect _150 _151 _152 _153 - s2 POP // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held elect_end_before - NOW // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held elect_end_before _61 - SWAP // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held _61 elect_end_before - ADD // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held _62 - -60 ADDCONST // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held _64 - s8 PUSH // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held _64 elect_at - MAX // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start - 16 PUSHINT // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _67=16 - CONFIGOPTPARAM // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _68 - CTOS // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _69 - 16 PUSHINT // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _69 _70=16 - SDSKIPFIRST // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _71 - 16 PLDU // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start main_validators - s6 s(-1) PUXC // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start cnt main_validators - MIN // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 - s1 s3 PUSH2 // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 start elect_for - ADD // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 _76 - 17 PUSHINT // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 _76 _77=17 - NEWC // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 _76 _77=17 _78 - 8 STU // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 _76 _80 - s3 s(-1) PUXC // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 _76 start _80 - 32 STU // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 _76 _82 - 32 STU // ds vdict elect_at frozen total_stakes cnt credits elect elect_for stake_held start _75 _84 - s1 s7 XCHG // ds vdict elect_at frozen total_stakes _75 credits elect elect_for stake_held start cnt _84 - 16 STU // ds vdict elect_at frozen total_stakes _75 credits elect elect_for stake_held start _86 - s1 s6 XCHG // ds vdict elect_at frozen total_stakes start credits elect elect_for stake_held _75 _86 - 16 STU // ds vdict elect_at frozen total_stakes start credits elect elect_for stake_held _88 - s0 s9 XCHG // ds _88 elect_at frozen total_stakes start credits elect elect_for stake_held vdict - CTOS // ds _88 elect_at frozen total_stakes start credits elect elect_for stake_held _89 - s1 s9 XCHG // ds stake_held elect_at frozen total_stakes start credits elect elect_for _88 _89 - STSLICER // ds stake_held elect_at frozen total_stakes start credits elect elect_for _90 - ENDC // ds stake_held elect_at frozen total_stakes start credits elect elect_for vset - 0 PUSHINT // ds stake_held elect_at frozen total_stakes start credits elect elect_for vset _93=0 - CONFIGOPTPARAM // ds stake_held elect_at frozen total_stakes start credits elect elect_for vset _94 - CTOS // ds stake_held elect_at frozen total_stakes start credits elect elect_for vset _95 - 256 PLDU // ds stake_held elect_at frozen total_stakes start credits elect elect_for vset config_addr - s1 s8 PUSH2 // ds stake_held elect_at frozen total_stakes start credits elect elect_for vset config_addr vset elect_at - send_validator_set_to_config CALLDICT - s0 s9 XCHG // vset stake_held elect_at frozen total_stakes start credits elect elect_for ds - LDDICT // vset stake_held elect_at frozen total_stakes start credits elect elect_for past_elect ds - FALSE // vset stake_held elect_at frozen total_stakes start credits elect elect_for past_elect ds _103 - s0 s11 XCHG // _103 stake_held elect_at frozen total_stakes start credits elect elect_for past_elect ds vset - HASHCU // _103 stake_held elect_at frozen total_stakes start credits elect elect_for past_elect ds _104 - s6 s3 XCHG2 // _103 stake_held elect_at frozen total_stakes ds credits elect _104 past_elect start elect_for - ADD // _103 stake_held elect_at frozen total_stakes ds credits elect _104 past_elect _105 - s9 PUSH // _103 stake_held elect_at frozen total_stakes ds credits elect _104 past_elect _105 stake_held - ADD // _103 stake_held elect_at frozen total_stakes ds credits elect _104 past_elect _106 - NEWC // _103 stake_held elect_at frozen total_stakes ds credits elect _104 past_elect _106 _107 - 32 STU // _103 stake_held elect_at frozen total_stakes ds credits elect _104 past_elect _109 - s1 s9 XCHG // _103 past_elect elect_at frozen total_stakes ds credits elect _104 stake_held _109 - 32 STU // _103 past_elect elect_at frozen total_stakes ds credits elect _104 _111 - 256 STU // _103 past_elect elect_at frozen total_stakes ds credits elect _113 - s1 s5 XCHG // _103 past_elect elect_at elect total_stakes ds credits frozen _113 - STDICT // _103 past_elect elect_at elect total_stakes ds credits _114 - s0 s3 XCHG2 // _103 past_elect elect_at elect credits ds _114 total_stakes - STGRAMS // _103 past_elect elect_at elect credits ds _115 - 0 PUSHINT // _103 past_elect elect_at elect credits ds _115 _116=0 - STGRAMS // _103 past_elect elect_at elect credits ds _117 - s1 s6 XCHG // ds past_elect elect_at elect credits _103 _117 - 1 STI // ds past_elect elect_at elect credits _119 - s0 s3 s4 XCHG3 - 32 PUSHINT // ds elect credits _119 elect_at past_elect _120=32 - DICTUSETB // ds elect credits past_elect - NEWC // ds elect credits past_elect _122 - s1 s3 XCHG // ds past_elect credits elect _122 - STDICT // ds past_elect credits _123 - STDICT // ds past_elect _124 - STDICT // ds _125 - SWAP // _125 ds - STSLICER // _126 - ENDC // _127 - c4 POP - TRUE // _129 - }> - update_active_vset_id PROC:<{ - // - load_data CALLDICT // elect credits past_elect grams active_id active_hash - 34 PUSHINT // elect credits past_elect grams active_id active_hash _8=34 - CONFIGOPTPARAM // elect credits past_elect grams active_id active_hash _9 - HASHCU // elect credits past_elect grams active_id active_hash cur_hash - s0 s1 PUSH2 // elect credits past_elect grams active_id active_hash cur_hash cur_hash active_hash - EQUAL // elect credits past_elect grams active_id active_hash cur_hash _11 - IFJMP:<{ // elect credits past_elect grams active_id active_hash cur_hash - 7 BLKDROP // - FALSE // _12 - }> // elect credits past_elect grams active_id active_hash cur_hash - s2 PUSH // elect credits past_elect grams active_id active_hash cur_hash active_id - IF:<{ // elect credits past_elect grams active_id active_hash cur_hash - s2 s4 PUSH2 - 32 PUSHINT // elect credits past_elect grams active_id active_hash cur_hash active_id past_elect _15=32 - DICTUGET - NULLSWAPIFNOT // elect credits past_elect grams active_id active_hash cur_hash fs f - IF:<{ // elect credits past_elect grams active_id active_hash cur_hash fs - 32 LDU // elect credits past_elect grams active_id active_hash cur_hash _99 _98 - NIP // elect credits past_elect grams active_id active_hash cur_hash fs - DUP // elect credits past_elect grams active_id active_hash cur_hash fs0 fs - 32 LDU // elect credits past_elect grams active_id active_hash cur_hash fs0 _24 fs - 256 LDU // elect credits past_elect grams active_id active_hash cur_hash fs0 _24 _103 _102 - DROP // elect credits past_elect grams active_id active_hash cur_hash fs0 stake_held hash - s0 s4 XCHG2 // elect credits past_elect grams active_id stake_held cur_hash fs0 hash active_hash - EQUAL // elect credits past_elect grams active_id stake_held cur_hash fs0 _31 - 57 THROWIFNOT - NOW // elect credits past_elect grams active_id stake_held cur_hash fs0 _33 - s0 s3 XCHG2 // elect credits past_elect grams active_id fs0 cur_hash _33 stake_held - ADD // elect credits past_elect grams active_id fs0 cur_hash unfreeze_time - NEWC // elect credits past_elect grams active_id fs0 cur_hash unfreeze_time _36 - 32 STU // elect credits past_elect grams active_id fs0 cur_hash _38 - ROT // elect credits past_elect grams active_id cur_hash _38 fs0 - STSLICER // elect credits past_elect grams active_id cur_hash _39 - s0 s0 s4 XCHG3 - 32 PUSHINT // elect credits cur_hash grams _39 active_id past_elect _40=32 - DICTUSETB // elect credits cur_hash grams past_elect - }>ELSE<{ - s1 s5 XCHG - s1 s3 XCHG - 3 BLKDROP // elect credits cur_hash grams past_elect - }> - }>ELSE<{ - s4 s1 s4 XCHG3 - 2DROP // elect credits cur_hash grams past_elect - }> - -1 PUSHINT // elect credits cur_hash grams past_elect id=-1 - UNTIL:<{ - OVER - 32 PUSHINT // elect credits cur_hash grams past_elect id past_elect _46=32 - DICTUGETNEXT - NULLSWAPIFNOT - NULLSWAPIFNOT // elect credits cur_hash grams past_elect fs id f - DUP // elect credits cur_hash grams past_elect fs id f f - IF:<{ // elect credits cur_hash grams past_elect fs id f - s0 s2 XCHG // elect credits cur_hash grams past_elect f id fs - 64 LDU // elect credits cur_hash grams past_elect f id _50 fs - 256 LDU // elect credits cur_hash grams past_elect f id tm hash fs - s1 s7 PUSH2 // elect credits cur_hash grams past_elect f id tm hash fs hash cur_hash - EQUAL // elect credits cur_hash grams past_elect f id tm hash fs _56 - IF:<{ // elect credits cur_hash grams past_elect f id tm hash fs - s4 POP // elect credits cur_hash grams past_elect fs id tm hash - s0 s3 XCHG // elect credits cur_hash grams past_elect hash id tm fs - LDDICT // elect credits cur_hash grams past_elect hash id tm _60 fs - LDGRAMS // elect credits cur_hash grams past_elect hash id tm _60 _62 fs - LDGRAMS // elect credits cur_hash grams past_elect hash id tm dict total_stake bonuses fs - s8 PUSH // elect credits cur_hash grams past_elect hash id tm dict total_stake bonuses fs grams - 3 RSHIFT# // elect credits cur_hash grams past_elect hash id tm dict total_stake bonuses fs amount - s9 s9 XCPU // elect credits cur_hash amount past_elect hash id tm dict total_stake bonuses fs grams amount - SUB // elect credits cur_hash amount past_elect hash id tm dict total_stake bonuses fs grams - s2 s9 XCHG2 // elect credits cur_hash grams past_elect hash id tm dict total_stake fs bonuses amount - ADD // elect credits cur_hash grams past_elect hash id tm dict total_stake fs bonuses - NEWC // elect credits cur_hash grams past_elect hash id tm dict total_stake fs bonuses _72 - s1 s5 XCHG // elect credits cur_hash grams past_elect hash id bonuses dict total_stake fs tm _72 - 64 STU // elect credits cur_hash grams past_elect hash id bonuses dict total_stake fs _74 - s1 s6 XCHG // elect credits cur_hash grams past_elect fs id bonuses dict total_stake hash _74 - 256 STU // elect credits cur_hash grams past_elect fs id bonuses dict total_stake _76 - s1 s2 XCHG // elect credits cur_hash grams past_elect fs id bonuses total_stake dict _76 - STDICT // elect credits cur_hash grams past_elect fs id bonuses total_stake _77 - SWAP // elect credits cur_hash grams past_elect fs id bonuses _77 total_stake - STGRAMS // elect credits cur_hash grams past_elect fs id bonuses _78 - SWAP // elect credits cur_hash grams past_elect fs id _78 bonuses - STGRAMS // elect credits cur_hash grams past_elect fs id _79 - ROT // elect credits cur_hash grams past_elect id _79 fs - STSLICER // elect credits cur_hash grams past_elect id _80 - SWAP - 32 PUSHINT - s1 s3 s3 PUXC2 // elect credits cur_hash grams id _80 id past_elect _81=32 - DICTUSETB // elect credits cur_hash grams id past_elect - FALSE // elect credits cur_hash grams id past_elect f - }>ELSE<{ - s3 s5 XCHG - s3 s4 XCHG - 3 BLKDROP // elect credits cur_hash grams id past_elect f - }> - }>ELSE<{ - s3 s0 s3 XCHG3 - DROP // elect credits cur_hash grams id past_elect f - }> - NOT // elect credits cur_hash grams id past_elect _84 - s1 s2 XCHG // elect credits cur_hash grams past_elect id _84 - }> // elect credits cur_hash grams past_elect id - DUP // elect credits cur_hash grams past_elect id id - ISNULL // elect credits cur_hash grams past_elect id _85 - IF:<{ // elect credits cur_hash grams past_elect id - DROP // elect credits cur_hash grams past_elect - 0 PUSHINT // elect credits cur_hash grams past_elect _86=0 - }>ELSE<{ // elect credits cur_hash grams past_elect _86 - }> // elect credits active_hash grams past_elect active_id - s0 s3 XCHG2 // elect credits past_elect grams active_id active_hash - store_data CALLDICT - TRUE // _89 - }> - cell_hash_eq? PROC:<{ - // vset expected_vset_hash - OVER // vset expected_vset_hash vset - ISNULL // vset expected_vset_hash _2 - IF:<{ // vset expected_vset_hash - 2DROP // - FALSE // _3 - }>ELSE<{ // vset expected_vset_hash - SWAP // expected_vset_hash vset - HASHCU // expected_vset_hash _5 - SWAP // _5 expected_vset_hash - EQUAL // _3 - }> - }> - validator_set_installed PROC:<{ - // ds elect credits - SWAP // ds credits elect - unpack_elect CALLDICT // ds credits _44 _45 _46 _47 _48 _49 _50 - s0 s5 XCHG - 5 BLKDROP // ds credits elect_at finished - IFNOTJMP:<{ // ds credits elect_at - 3 BLKDROP // - FALSE // _11 - }> // ds credits elect_at - s0 s2 XCHG // elect_at credits ds - LDDICT // elect_at credits past_elections ds - s3 s1 XCPU - 32 PUSHINT // ds credits past_elections elect_at past_elections _17=32 - DICTUGET - NULLSWAPIFNOT // ds credits past_elections fs f - IFNOTJMP:<{ // ds credits past_elections fs - 4 BLKDROP // - FALSE // _19 - }> // ds credits past_elections fs - 64 PUSHINT // ds credits past_elections fs _21=64 - SDSKIPFIRST // ds credits past_elections _22 - 256 PLDU // ds credits past_elections vset_hash - 34 PUSHINT // ds credits past_elections vset_hash _25=34 - CONFIGOPTPARAM // ds credits past_elections vset_hash _26 - OVER // ds credits past_elections vset_hash _26 vset_hash - cell_hash_eq? CALLDICT // ds credits past_elections vset_hash _27 - 36 PUSHINT // ds credits past_elections vset_hash _27 _28=36 - CONFIGOPTPARAM // ds credits past_elections vset_hash _27 _29 - ROT // ds credits past_elections _27 _29 vset_hash - cell_hash_eq? CALLDICT // ds credits past_elections _27 _30 - OR // ds credits past_elections _31 - IFJMP:<{ // ds credits past_elections - FALSE // ds credits past_elections _32 - NEWC // ds credits past_elections _32 _33 - 1 STI // ds credits past_elections _35 - s1 s2 XCHG // ds past_elections credits _35 - STDICT // ds past_elections _36 - STDICT // ds _37 - SWAP // _37 ds - STSLICER // _38 - ENDC // _39 - c4 POP - update_active_vset_id CALLDICT // _41 - DROP // - TRUE // _42 - }> // ds credits past_elections - 3 BLKDROP // - FALSE // _43 - }> - check_unfreeze PROC:<{ - // - load_data CALLDICT // elect credits past_elect grams active_id active_hash - -1 PUSHINT // elect credits past_elect grams active_id active_hash id=-1 - UNTIL:<{ - s4 PUSH - 32 PUSHINT // elect credits past_elect grams active_id active_hash id past_elect _11=32 - DICTUGETNEXT - NULLSWAPIFNOT - NULLSWAPIFNOT // elect credits past_elect grams active_id active_hash fs id f - DUP // elect credits past_elect grams active_id active_hash fs id f f - IF:<{ // elect credits past_elect grams active_id active_hash fs id f - s0 s2 XCHG // elect credits past_elect grams active_id active_hash f id fs - 32 LDU // elect credits past_elect grams active_id active_hash f id _39 _38 - DROP // elect credits past_elect grams active_id active_hash f id unfreeze_at - NOW // elect credits past_elect grams active_id active_hash f id unfreeze_at _17 - LEQ // elect credits past_elect grams active_id active_hash f id _18 - s1 s4 PUSH2 // elect credits past_elect grams active_id active_hash f id _18 id active_id - NEQ // elect credits past_elect grams active_id active_hash f id _18 _19 - AND // elect credits past_elect grams active_id active_hash f id _20 - IF:<{ // elect credits past_elect grams active_id active_hash f id - NIP // elect credits past_elect grams active_id active_hash id - s5 s4 s4 XC2PU // elect active_hash id grams active_id credits past_elect id - unfreeze_all CALLDICT // elect active_hash id grams active_id credits past_elect unused_prizes - s1 s4 XCHG // elect active_hash id past_elect active_id credits grams unused_prizes - ADD // elect active_hash id past_elect active_id credits grams - s6 s1 s3 PUSH3 - s3 s5 s8 PUSH3 // elect active_hash id past_elect active_id credits grams elect credits past_elect grams active_id active_hash - store_data CALLDICT - FALSE // elect active_hash id past_elect active_id credits grams f - }>ELSE<{ - s6 s1 s5 XCHG3 - s4 s4 XCHG2 // elect active_hash id past_elect active_id credits grams f - }> - }>ELSE<{ - s3 s7 XCHG - s1 s6 XCHG - s5 s0 s5 XCHG3 - DROP // elect active_hash id past_elect active_id credits grams f - }> - NOT // elect active_hash id past_elect active_id credits grams _26 - s2 s6 XCHG - s4 s5 XCHG - s1 s4 XCHG // elect credits past_elect grams active_id active_hash id _26 - }> // elect credits past_elect grams active_id active_hash id - s0 s6 XCHG - 6 BLKDROP // id - ISNULL // _27 - NOT // _28 - }> - announce_new_elections PROC:<{ - // ds elect credits - NIP // ds credits - 36 PUSHINT // ds credits _4=36 - CONFIGOPTPARAM // ds credits next_vset - ISNULL // ds credits _6 - IFNOTJMP:<{ // ds credits - 2DROP // - FALSE // _7 - }> // ds credits - 1 PUSHINT // ds credits _9=1 - CONFIGOPTPARAM // ds credits _10 - CTOS // ds credits _11 - 256 PLDU // ds credits elector_addr - MYADDR // ds credits elector_addr _16 - REWRITESTDADDR // ds credits elector_addr my_wc my_addr - SWAP // ds credits elector_addr my_addr my_wc - INC // ds credits elector_addr my_addr _19 - s0 s2 XCHG // ds credits _19 my_addr elector_addr - NEQ // ds credits _19 _20 - OR // ds credits _21 - IFJMP:<{ // ds credits - 2DROP // - FALSE // _22 - }> // ds credits - 34 PUSHINT // ds credits _24=34 - CONFIGOPTPARAM // ds credits cur_vset - DUP // ds credits cur_vset cur_vset - ISNULL // ds credits cur_vset _26 - IFJMP:<{ // ds credits cur_vset - 3 BLKDROP // - FALSE // _27 - }> // ds credits cur_vset - get_validator_conf CALLDICT // ds credits cur_vset _76 _77 _78 _79 - DROP - s2 POP // ds credits cur_vset elect_end_before elect_begin_before - s0 s2 XCHG // ds credits elect_begin_before elect_end_before cur_vset - CTOS // ds credits elect_begin_before elect_end_before _34 - 40 PUSHINT // ds credits elect_begin_before elect_end_before _34 _37 - SDSKIPFIRST // ds credits elect_begin_before elect_end_before _38 - 32 PLDU // ds credits elect_begin_before elect_end_before cur_valid_until - NOW // ds credits elect_begin_before elect_end_before cur_valid_until t - s1 s3 XCPU // ds credits elect_begin_before elect_end_before t cur_valid_until elect_begin_before - SUB // ds credits elect_begin_before elect_end_before t t0 - 2DUP // ds credits elect_begin_before elect_end_before t t0 t t0 - LESS // ds credits elect_begin_before elect_end_before t t0 _45 - IFJMP:<{ // ds credits elect_begin_before elect_end_before t t0 - 6 BLKDROP // - FALSE // _46 - }> // ds credits elect_begin_before elect_end_before t t0 - 2DUP // ds credits elect_begin_before elect_end_before t t0 t t0 - SUB // ds credits elect_begin_before elect_end_before t t0 _47 - 60 LESSINT // ds credits elect_begin_before elect_end_before t t0 _49 - IF:<{ // ds credits elect_begin_before elect_end_before t t0 - NIP // ds credits elect_begin_before elect_end_before t - }>ELSE<{ - DROP // ds credits elect_begin_before elect_end_before t - }> - 17 PUSHINT // ds credits elect_begin_before elect_end_before t _52=17 - CONFIGOPTPARAM // ds credits elect_begin_before elect_end_before t _53 - CTOS // ds credits elect_begin_before elect_end_before t _54 - LDGRAMS // ds credits elect_begin_before elect_end_before t _81 _80 - DROP // ds credits elect_begin_before elect_end_before t min_stake - s0 s3 XCHG // ds credits min_stake elect_end_before t elect_begin_before - ADD // ds credits min_stake elect_end_before elect_at - s0 DUMP // ds credits min_stake elect_end_before elect_at - s0 s1 PUXC // ds credits min_stake elect_at elect_at elect_end_before - SUB // ds credits min_stake elect_at elect_close - 0 PUSHINT // ds credits min_stake elect_at elect_close _62=0 - NEWDICT // ds credits min_stake elect_at elect_close _62=0 _63 - FALSE // ds credits min_stake elect_at elect_close _62=0 _63 _64 - s4 s5 XCHG - s3 s4 XCHG - FALSE // ds credits elect_at elect_close min_stake _62=0 _63 _64 _65 - pack_elect CALLDICT // ds credits elect - NEWC // ds credits elect _67 - STDICT // ds credits _68 - STDICT // ds _69 - SWAP // _69 ds - STSLICER // _70 - ENDC // _71 - c4 POP - TRUE // _73 - }> - run_ticktock PROC:<{ - // is_tock - DROP // - c4 PUSH // _2 - CTOS // ds - LDDICT // _6 ds - LDDICT // elect credits ds - s2 PUSH // elect credits ds elect - ISNULL // elect credits ds _10 - IF:<{ // elect credits ds - -ROT // ds elect credits - announce_new_elections CALLDICT // _18 - 0 THROWIF - }>ELSE<{ // elect credits ds - s0 s2 s1 PUSH3 // elect credits ds ds elect credits - conduct_elections CALLDICT // elect credits ds _12 - 0 THROWIF - -ROT // ds elect credits - validator_set_installed CALLDICT // _15 - 0 THROWIF - }> - update_active_vset_id CALLDICT // _21 - 0 THROWIF - check_unfreeze CALLDICT // _23 - DROP // - }> - active_election_id PROC:<{ - // - c4 PUSH // _1 - CTOS // _2 - PLDDICT // elect - DUP // elect elect - ISNULL // elect _4 - IF:<{ // elect - DROP // - 0 PUSHINT // _5=0 - }>ELSE<{ // elect - CTOS // _7 - 32 PLDU // _5 - }> - }> - participates_in PROC:<{ - // validator_pubkey - c4 PUSH // validator_pubkey _2 - CTOS // validator_pubkey _3 - PLDDICT // validator_pubkey elect - DUP // validator_pubkey elect elect - ISNULL // validator_pubkey elect _5 - IFJMP:<{ // validator_pubkey elect - 2DROP // - 0 PUSHINT // _6=0 - }> // validator_pubkey elect - unpack_elect CALLDICT // validator_pubkey _23 _24 _25 _26 _27 _28 _29 - s2 s6 XCHG - 6 BLKDROP // validator_pubkey members - 8 PUSHPOW2 // validator_pubkey members _17=256 - DICTUGET - NULLSWAPIFNOT // mem found - IF:<{ // mem - LDGRAMS // _33 _32 - DROP // _19 - }>ELSE<{ // mem - DROP // - 0 PUSHINT // _19=0 - }> - }> - participant_list PROC:<{ - // - c4 PUSH // _1 - CTOS // _2 - PLDDICT // elect - DUP // elect elect - ISNULL // elect _4 - IFJMP:<{ // elect - DROP // - PUSHNULL // _5 - }> // elect - unpack_elect CALLDICT // _35 _36 _37 _38 _39 _40 _41 - s2 s6 XCHG - 6 BLKDROP // members - PUSHNULL // members l - 256 PUSHPOW2DEC // members l id - UNTIL:<{ - s2 PUSH - 8 PUSHPOW2 // members l id members _28=256 - DICTUGETPREV - NULLSWAPIFNOT - NULLSWAPIFNOT // members l fs id f - DUP // members l fs id f f - IF:<{ // members l fs id f - s0 s2 XCHG // members l f id fs - LDGRAMS // members l f id _46 _45 - DROP // members l f id _30 - s1 s(-1) PUXC // members l f id id _30 - PAIR // members l f id _32 - s0 s3 XCHG2 // members id f _32 l - CONS // members id f l - }>ELSE<{ - 2SWAP - DROP // members id f l - }> - SWAP // members id l f - NOT // members id l _34 - s1 s2 XCHG // members l id _34 - }> // members l id - DROP - NIP // l - }> - compute_returned_stake PROC:<{ - // wallet_addr - c4 PUSH // wallet_addr _2 - CTOS // wallet_addr cs - LDDICT // wallet_addr _19 _18 - NIP // wallet_addr cs - LDDICT // wallet_addr _21 _20 - DROP // wallet_addr credits - 8 PUSHPOW2 // wallet_addr credits _12=256 - DICTUGET - NULLSWAPIFNOT // val f - IF:<{ // val - LDGRAMS // _25 _24 - DROP // _14 - }>ELSE<{ // val - DROP // - 0 PUSHINT // _14=0 - }> - }> -}END>c diff --git a/crypto/smartcont/auto/highload-wallet-code.cpp b/crypto/smartcont/auto/highload-wallet-code.cpp deleted file mode 100644 index ecc0b71d..00000000 --- a/crypto/smartcont/auto/highload-wallet-code.cpp +++ /dev/null @@ -1 +0,0 @@ -with_tvm_code("highload-wallet", "te6ccgEBBgEAhgABFP8A9KQT9KDyyAsBAgEgAgMCAUgEBQC88oMI1xgg0x/TH9Mf+CMTu/Jj7UTQ0x/TH9P/0VEyuvKhUUS68qIE+QFUEFX5EPKj9ATR+AB/jhghgBD0eG+hb6EgmALTB9QwAfsAkTLiAbPmWwGkyMsfyx/L/8ntVAAE0DAAEaCZL9qJoa4WPw=="); diff --git a/crypto/smartcont/auto/highload-wallet-code.fif b/crypto/smartcont/auto/highload-wallet-code.fif deleted file mode 100644 index d2122a96..00000000 --- a/crypto/smartcont/auto/highload-wallet-code.fif +++ /dev/null @@ -1,79 +0,0 @@ -// automatically generated from `smartcont/stdlib.fc` `smartcont/highload-wallet-code.fc` -PROGRAM{ - DECLPROC recv_internal - DECLPROC recv_external - 85143 DECLMETHOD seqno - recv_internal PROC:<{ - // in_msg - DROP // - }> - recv_external PROC:<{ - // in_msg - 9 PUSHPOW2 // in_msg _3=512 - LDSLICEX // signature in_msg - DUP // signature in_msg cs - 32 LDU // signature in_msg _9 cs - 32 LDU // signature in_msg _9 _12 cs - 32 LDU // signature in_msg subwallet_id valid_until msg_seqno cs - NOW // signature in_msg subwallet_id valid_until msg_seqno cs _19 - s1 s3 XCHG // signature in_msg subwallet_id cs msg_seqno valid_until _19 - LEQ // signature in_msg subwallet_id cs msg_seqno _20 - 35 THROWIF - c4 PUSH // signature in_msg subwallet_id cs msg_seqno _23 - CTOS // signature in_msg subwallet_id cs msg_seqno ds - 32 LDU // signature in_msg subwallet_id cs msg_seqno _28 ds - 32 LDU // signature in_msg subwallet_id cs msg_seqno _28 _31 ds - 256 LDU // signature in_msg subwallet_id cs msg_seqno stored_seqno stored_subwallet public_key ds - ENDS - s3 s2 XCPU // signature in_msg subwallet_id cs public_key stored_seqno stored_subwallet msg_seqno stored_seqno - EQUAL // signature in_msg subwallet_id cs public_key stored_seqno stored_subwallet _39 - 33 THROWIFNOT - s4 s4 XCPU // signature in_msg stored_subwallet cs public_key stored_seqno subwallet_id stored_subwallet - EQUAL // signature in_msg stored_subwallet cs public_key stored_seqno _42 - 34 THROWIFNOT - s0 s4 XCHG // signature stored_seqno stored_subwallet cs public_key in_msg - HASHSU // signature stored_seqno stored_subwallet cs public_key _45 - s0 s5 s5 XC2PU // public_key stored_seqno stored_subwallet cs _45 signature public_key - CHKSIGNU // public_key stored_seqno stored_subwallet cs _46 - 35 THROWIFNOT - LDDICT // public_key stored_seqno stored_subwallet dict cs - ENDS - ACCEPT - -1 PUSHINT // public_key stored_seqno stored_subwallet dict i=-1 - UNTIL:<{ - OVER - 16 PUSHINT // public_key stored_seqno stored_subwallet dict i dict _57=16 - DICTIGETNEXT - NULLSWAPIFNOT - NULLSWAPIFNOT // public_key stored_seqno stored_subwallet dict cs i f - DUP // public_key stored_seqno stored_subwallet dict cs i f f - IF:<{ // public_key stored_seqno stored_subwallet dict cs i f - s0 s2 XCHG // public_key stored_seqno stored_subwallet dict f i cs - 8 LDU // public_key stored_seqno stored_subwallet dict f i mode cs - LDREF // public_key stored_seqno stored_subwallet dict f i mode _100 _99 - DROP // public_key stored_seqno stored_subwallet dict f i mode _63 - SWAP // public_key stored_seqno stored_subwallet dict f i _63 mode - SENDRAWMSG - }>ELSE<{ - s2 POP // public_key stored_seqno stored_subwallet dict f i - }> - SWAP // public_key stored_seqno stored_subwallet dict i f - NOT // public_key stored_seqno stored_subwallet dict i _66 - }> // public_key stored_seqno stored_subwallet dict i - 2DROP // public_key stored_seqno stored_subwallet - SWAP // public_key stored_subwallet stored_seqno - INC // public_key stored_subwallet _68 - NEWC // public_key stored_subwallet _68 _69 - 32 STU // public_key stored_subwallet _71 - 32 STU // public_key _73 - 256 STU // _75 - ENDC // _76 - c4 POP - }> - seqno PROC:<{ - // - c4 PUSH // _0 - CTOS // _1 - 32 PLDU // _3 - }> -}END>c diff --git a/crypto/smartcont/auto/highload-wallet-v2-code.cpp b/crypto/smartcont/auto/highload-wallet-v2-code.cpp deleted file mode 100644 index ca5d2c70..00000000 --- a/crypto/smartcont/auto/highload-wallet-v2-code.cpp +++ /dev/null @@ -1 +0,0 @@ -with_tvm_code("highoad-wallet-v2", "te6ccgEBBwEA1wABFP8A9KQT9KDyyAsBAgEgAgMCAUgEBQHu8oMI1xgg0x/TP/gjqh9TILnyY+1E0NMf0z/T//QE0VNggED0Dm+hMfJgUXO68qIH+QFUEIf5EPKjAvQE0fgAf44YIYAQ9HhvoW+hIJgC0wfUMAH7AJEy4gGz5luDJaHIQDSAQPRDiuYxyBLLHxPLP8v/9ADJ7VQGAATQMABBoZfl2omhpj5jpn+n/mPoCaKkQQCB6BzfQmMktv8ld0fFADoggED0lm+hb6EyURCUMFMDud4gkjM2k0MTW+IBsw=="); diff --git a/crypto/smartcont/auto/highload-wallet-v2-code.fif b/crypto/smartcont/auto/highload-wallet-v2-code.fif deleted file mode 100644 index 9d5e467d..00000000 --- a/crypto/smartcont/auto/highload-wallet-v2-code.fif +++ /dev/null @@ -1,134 +0,0 @@ -// automatically generated from `smartcont/stdlib.fc` `smartcont/highload-wallet-v2-code.fc` -PROGRAM{ - DECLPROC recv_internal - DECLPROC recv_external - 117746 DECLMETHOD processed? - recv_internal PROC:<{ - // in_msg - DROP // - }> - recv_external PROC:<{ - // in_msg - 9 PUSHPOW2 // in_msg _3=512 - LDSLICEX // signature in_msg - DUP // signature in_msg cs - 32 LDU // signature in_msg _8 cs - 64 LDU // signature in_msg subwallet_id query_id cs - NOW // signature in_msg subwallet_id query_id cs _15 - 32 LSHIFT# // signature in_msg subwallet_id query_id cs bound - s2 s0 PUSH2 // signature in_msg subwallet_id query_id cs bound query_id bound - LESS // signature in_msg subwallet_id query_id cs bound _19 - 35 THROWIF - c4 PUSH // signature in_msg subwallet_id query_id cs bound _22 - CTOS // signature in_msg subwallet_id query_id cs bound ds - 32 LDU // signature in_msg subwallet_id query_id cs bound _28 ds - 64 LDU // signature in_msg subwallet_id query_id cs bound _28 _31 ds - 256 LDU // signature in_msg subwallet_id query_id cs bound _28 _31 _34 ds - LDDICT // signature in_msg subwallet_id query_id cs bound stored_subwallet last_cleaned public_key old_queries ds - ENDS - s6 s0 PUSH2 - 64 PUSHINT // signature in_msg subwallet_id query_id cs bound stored_subwallet last_cleaned public_key old_queries query_id old_queries _42=64 - DICTUGET - NULLSWAPIFNOT // signature in_msg subwallet_id query_id cs bound stored_subwallet last_cleaned public_key old_queries _115 _116 - NIP // signature in_msg subwallet_id query_id cs bound stored_subwallet last_cleaned public_key old_queries found? - 32 THROWIF - s7 s3 XCPU // signature in_msg old_queries query_id cs bound stored_subwallet last_cleaned public_key subwallet_id stored_subwallet - EQUAL // signature in_msg old_queries query_id cs bound stored_subwallet last_cleaned public_key _47 - 34 THROWIFNOT - s0 s7 XCHG // signature public_key old_queries query_id cs bound stored_subwallet last_cleaned in_msg - HASHSU // signature public_key old_queries query_id cs bound stored_subwallet last_cleaned _50 - s0 s8 s7 XC2PU // last_cleaned public_key old_queries query_id cs bound stored_subwallet _50 signature public_key - CHKSIGNU // last_cleaned public_key old_queries query_id cs bound stored_subwallet _51 - 35 THROWIFNOT - s0 s2 XCHG // last_cleaned public_key old_queries query_id stored_subwallet bound cs - LDDICT // last_cleaned public_key old_queries query_id stored_subwallet bound dict cs - ENDS - ACCEPT - -1 PUSHINT // last_cleaned public_key old_queries query_id stored_subwallet bound dict i=-1 - UNTIL:<{ - OVER - 16 PUSHINT // last_cleaned public_key old_queries query_id stored_subwallet bound dict i dict _62=16 - DICTIGETNEXT - NULLSWAPIFNOT - NULLSWAPIFNOT // last_cleaned public_key old_queries query_id stored_subwallet bound dict cs i f - DUP // last_cleaned public_key old_queries query_id stored_subwallet bound dict cs i f f - IF:<{ // last_cleaned public_key old_queries query_id stored_subwallet bound dict cs i f - s0 s2 XCHG // last_cleaned public_key old_queries query_id stored_subwallet bound dict f i cs - 8 LDU // last_cleaned public_key old_queries query_id stored_subwallet bound dict f i mode cs - LDREF // last_cleaned public_key old_queries query_id stored_subwallet bound dict f i mode _125 _124 - DROP // last_cleaned public_key old_queries query_id stored_subwallet bound dict f i mode _68 - SWAP // last_cleaned public_key old_queries query_id stored_subwallet bound dict f i _68 mode - SENDRAWMSG - }>ELSE<{ - s2 POP // last_cleaned public_key old_queries query_id stored_subwallet bound dict f i - }> - SWAP // last_cleaned public_key old_queries query_id stored_subwallet bound dict i f - NOT // last_cleaned public_key old_queries query_id stored_subwallet bound dict i _71 - }> // last_cleaned public_key old_queries query_id stored_subwallet bound dict i - 2DROP // last_cleaned public_key old_queries query_id stored_subwallet bound - 38 PUSHPOW2 // last_cleaned public_key old_queries query_id stored_subwallet bound _74 - SUB // last_cleaned public_key old_queries query_id stored_subwallet bound - NEWC // last_cleaned public_key old_queries query_id stored_subwallet bound _77 - s0 s3 s4 XCHG3 - 64 PUSHINT // last_cleaned public_key stored_subwallet bound _77 query_id old_queries _78=64 - DICTUSETB // last_cleaned public_key stored_subwallet bound old_queries - UNTIL:<{ - DUP - 64 PUSHINT // last_cleaned public_key stored_subwallet bound old_queries old_queries _85=64 - DICTUREMMIN - NULLSWAPIFNOT - NULLSWAPIFNOT // last_cleaned public_key stored_subwallet bound old_queries _126 _128 _127 _129 - s2 POP // last_cleaned public_key stored_subwallet bound old_queries old_queries' f i - s1 s0 XCPU // last_cleaned public_key stored_subwallet bound old_queries old_queries' i f f - IF:<{ // last_cleaned public_key stored_subwallet bound old_queries old_queries' i f - DROP // last_cleaned public_key stored_subwallet bound old_queries old_queries' i - s0 s3 PUSH2 // last_cleaned public_key stored_subwallet bound old_queries old_queries' i i bound - LESS // last_cleaned public_key stored_subwallet bound old_queries old_queries' i f - }> // last_cleaned public_key stored_subwallet bound old_queries old_queries' i f - DUP // last_cleaned public_key stored_subwallet bound old_queries old_queries' i f f - IF:<{ // last_cleaned public_key stored_subwallet bound old_queries old_queries' i f - s3 POP - s6 POP // last_cleaned public_key stored_subwallet bound f old_queries - }>ELSE<{ - s3 s1 s3 XCHG3 - 2DROP // last_cleaned public_key stored_subwallet bound f old_queries - }> - SWAP // last_cleaned public_key stored_subwallet bound old_queries f - NOT // last_cleaned public_key stored_subwallet bound old_queries _90 - }> // last_cleaned public_key stored_subwallet bound old_queries - NIP // last_cleaned public_key stored_subwallet old_queries - NEWC // last_cleaned public_key stored_subwallet old_queries _91 - s1 s2 XCHG // last_cleaned public_key old_queries stored_subwallet _91 - 32 STU // last_cleaned public_key old_queries _93 - s1 s3 XCHG // old_queries public_key last_cleaned _93 - 64 STU // old_queries public_key _95 - 256 STU // old_queries _97 - STDICT // _98 - ENDC // _99 - c4 POP - }> - processed? PROC:<{ - // query_id - c4 PUSH // query_id _2 - CTOS // query_id ds - 32 LDU // query_id _29 _28 - NIP // query_id ds - 64 LDU // query_id _11 ds - 256 LDU // query_id _11 _33 _32 - NIP // query_id _11 ds - LDDICT // query_id last_cleaned old_queries ds - ENDS - s2 s(-1) PUXC - 64 PUSHINT // query_id last_cleaned query_id old_queries _22=64 - DICTUGET - NULLSWAPIFNOT // query_id last_cleaned _36 _37 - NIP // query_id last_cleaned found - IF:<{ // query_id last_cleaned - 2DROP // - TRUE // _24 - }>ELSE<{ // query_id last_cleaned - LEQ // _26 - NEGATE // _24 - }> - }> -}END>c diff --git a/crypto/smartcont/auto/simple-wallet-code.cpp b/crypto/smartcont/auto/simple-wallet-code.cpp deleted file mode 100644 index ea4603f0..00000000 --- a/crypto/smartcont/auto/simple-wallet-code.cpp +++ /dev/null @@ -1 +0,0 @@ -with_tvm_code("simple-wallet", "te6ccgEBBAEATwABFP8A9KQT9KDyyAsBAgEgAgMABNIwAG7ygwjXGCDTH+1E0NMf0//RUTG68qED+QFUEEL5EPKi+ABRINdKltMH1AL7AN7RpMjLH8v/ye1U"); diff --git a/crypto/smartcont/auto/simple-wallet-code.fif b/crypto/smartcont/auto/simple-wallet-code.fif deleted file mode 100644 index c052d4b6..00000000 --- a/crypto/smartcont/auto/simple-wallet-code.fif +++ /dev/null @@ -1,45 +0,0 @@ -// automatically generated from `smartcont/stdlib.fc` `smartcont/simple-wallet-code.fc` -PROGRAM{ - DECLPROC recv_internal - DECLPROC recv_external - recv_internal PROC:<{ - // in_msg - DROP // - }> - recv_external PROC:<{ - // in_msg - 9 PUSHPOW2 // in_msg _3=512 - LDSLICEX // signature in_msg - DUP // signature in_msg cs - 32 LDU // signature in_msg msg_seqno cs - c4 PUSH // signature in_msg msg_seqno cs _11 - CTOS // signature in_msg msg_seqno cs cs2 - 32 LDU // signature in_msg msg_seqno cs stored_seqno cs2 - 256 LDU // signature in_msg msg_seqno cs stored_seqno public_key cs2 - ENDS - s3 s1 XCPU // signature in_msg public_key cs stored_seqno msg_seqno stored_seqno - EQUAL // signature in_msg public_key cs stored_seqno _23 - 33 THROWIFNOT - s0 s3 XCHG // signature stored_seqno public_key cs in_msg - HASHSU // signature stored_seqno public_key cs _26 - s0 s4 s2 XC2PU // cs stored_seqno public_key _26 signature public_key - CHKSIGNU // cs stored_seqno public_key _27 - 34 THROWIFNOT - ACCEPT - s2 s0 XCPU // public_key stored_seqno cs cs - SREFS // public_key stored_seqno cs _32 - IF:<{ // public_key stored_seqno cs - 8 LDU // public_key stored_seqno mode cs - LDREF // public_key stored_seqno mode _37 cs - s0 s2 XCHG // public_key stored_seqno cs _37 mode - SENDRAWMSG - }> // public_key stored_seqno cs - ENDS - INC // public_key _42 - NEWC // public_key _42 _43 - 32 STU // public_key _45 - 256 STU // _47 - ENDC // _48 - c4 POP - }> -}END>c diff --git a/crypto/smartcont/auto/wallet-code.cpp b/crypto/smartcont/auto/wallet-code.cpp deleted file mode 100644 index 52fefeeb..00000000 --- a/crypto/smartcont/auto/wallet-code.cpp +++ /dev/null @@ -1 +0,0 @@ -with_tvm_code("wallet", "te6ccgEBBgEAaAABFP8A9KQT9KDyyAsBAgEgAgMCAUgEBQCA8oMI1xgg0x/TH/gjErvyY+1E0NMf0//RUTG68qED+QFUEEL5EPKi+AACkyDXSpbTB9QC+wDo0aTIyx/L/8ntVAAE0DAAEaCZL9qJoa4WPw=="); diff --git a/crypto/smartcont/auto/wallet-code.fif b/crypto/smartcont/auto/wallet-code.fif deleted file mode 100644 index cd9fa5d0..00000000 --- a/crypto/smartcont/auto/wallet-code.fif +++ /dev/null @@ -1,59 +0,0 @@ -// automatically generated from `smartcont/stdlib.fc` `smartcont/wallet-code.fc` -PROGRAM{ - DECLPROC recv_internal - DECLPROC recv_external - 85143 DECLMETHOD seqno - recv_internal PROC:<{ - // in_msg - DROP // - }> - recv_external PROC:<{ - // in_msg - 9 PUSHPOW2 // in_msg _3=512 - LDSLICEX // signature in_msg - DUP // signature in_msg cs - 32 LDU // signature in_msg _8 cs - 32 LDU // signature in_msg msg_seqno valid_until cs - NOW // signature in_msg msg_seqno valid_until cs _15 - s1 s2 XCHG // signature in_msg msg_seqno cs valid_until _15 - LEQ // signature in_msg msg_seqno cs _16 - 35 THROWIF - c4 PUSH // signature in_msg msg_seqno cs _19 - CTOS // signature in_msg msg_seqno cs ds - 32 LDU // signature in_msg msg_seqno cs _23 ds - 256 LDU // signature in_msg msg_seqno cs stored_seqno public_key ds - ENDS - s3 s1 XCPU // signature in_msg public_key cs stored_seqno msg_seqno stored_seqno - EQUAL // signature in_msg public_key cs stored_seqno _31 - 33 THROWIFNOT - s0 s3 XCHG // signature stored_seqno public_key cs in_msg - HASHSU // signature stored_seqno public_key cs _34 - s0 s4 s2 XC2PU // cs stored_seqno public_key _34 signature public_key - CHKSIGNU // cs stored_seqno public_key _35 - 34 THROWIFNOT - ACCEPT - s0 s2 XCHG // public_key stored_seqno cs - WHILE:<{ - DUP // public_key stored_seqno cs cs - SREFS // public_key stored_seqno cs _40 - }>DO<{ // public_key stored_seqno cs - 8 LDU // public_key stored_seqno mode cs - LDREF // public_key stored_seqno mode _45 cs - s0 s2 XCHG // public_key stored_seqno cs _45 mode - SENDRAWMSG - }> // public_key stored_seqno cs - ENDS - INC // public_key _50 - NEWC // public_key _50 _51 - 32 STU // public_key _53 - 256 STU // _55 - ENDC // _56 - c4 POP - }> - seqno PROC:<{ - // - c4 PUSH // _0 - CTOS // _1 - 32 PLDU // _3 - }> -}END>c diff --git a/crypto/smartcont/stdlib.fc b/crypto/smartcont/stdlib.fc index ff3c6b9a..c60d96c9 100644 --- a/crypto/smartcont/stdlib.fc +++ b/crypto/smartcont/stdlib.fc @@ -1,6 +1,22 @@ ;; Standard library for funC ;; +forall X -> tuple cons(X head, tuple tail) asm "CONS"; +forall X -> (X, tuple) uncons(tuple list) asm "UNCONS"; +forall X -> (tuple, X) list_next(tuple list) asm( -> 1 0) "UNCONS"; +forall X -> X car(tuple list) asm "CAR"; +tuple cdr(tuple list) asm "CDR"; +forall X, Y -> tuple pair(X x, Y y) asm "PAIR"; +forall X, Y -> (X, Y) unpair(tuple t) asm "UNPAIR"; +forall X, Y, Z -> tuple triple(X x, Y y, Z z) asm "TRIPLE"; +forall X, Y, Z -> (X, Y, Z) untriple(tuple t) asm "UNTRIPLE"; +forall X, Y, Z, W -> tuple tuple4(X x, Y y, Z z, W w) asm "4 TUPLE"; +forall X, Y, Z, W -> (X, Y, Z, W) untuple4(tuple t) asm "4 UNTUPLE"; +forall X -> X first(tuple t) asm "FIRST"; +forall X -> X second(tuple t) asm "SECOND"; +forall X -> X third(tuple t) asm "THIRD"; +forall X -> X fourth(tuple t) asm "3 INDEX"; + int now() asm "NOW"; slice my_address() asm "MYADDR"; tuple get_balance() asm "BALANCE"; diff --git a/lite-client/lite-client.cpp b/lite-client/lite-client.cpp index 1db283f0..552979de 100644 --- a/lite-client/lite-client.cpp +++ b/lite-client/lite-client.cpp @@ -58,6 +58,7 @@ #include "vm/continuation.h" #include "vm/cp0.h" #include "ton/ton-shard.h" +#include "openssl/rand.hpp" #if TD_DARWIN || TD_LINUX #include @@ -1153,16 +1154,24 @@ void TestNode::got_account_state(ton::BlockIdExt ref_blk, ton::BlockIdExt blk, t vm::load_cell_slice(info.root).print_rec(outp); out << outp.str(); out << "last transaction lt = " << info.last_trans_lt << " hash = " << info.last_trans_hash.to_hex() << std::endl; + block::gen::Account::Record_account acc; + block::gen::AccountStorage::Record store; + block::CurrencyCollection balance; + if (tlb::unpack_cell(info.root, acc) && tlb::csr_unpack(acc.storage, store) && balance.unpack(store.balance)) { + out << "account balance is " << balance.to_str() << std::endl; + } } else { out << "account state is empty" << std::endl; } } else if (info.root.not_null()) { block::gen::Account::Record_account acc; block::gen::AccountStorage::Record store; - if (!(tlb::unpack_cell(info.root, acc) && tlb::csr_unpack(acc.storage, store))) { + block::CurrencyCollection balance; + if (!(tlb::unpack_cell(info.root, acc) && tlb::csr_unpack(acc.storage, store) && balance.unpack(store.balance))) { LOG(ERROR) << "error unpacking account state"; return; } + out << "account balance is " << balance.to_str() << std::endl; int tag = block::gen::t_AccountState.get_tag(*store.state); switch (tag) { case block::gen::AccountState::account_uninit: @@ -1214,6 +1223,28 @@ void TestNode::got_account_state(ton::BlockIdExt ref_blk, ton::BlockIdExt blk, t } } +Ref TestNode::prepare_vm_c7(ton::UnixTime now, ton::LogicalTime lt, Ref my_addr, + const block::CurrencyCollection& balance) const { + td::BitArray<256> rand_seed; + td::RefInt256 rand_seed_int{true}; + prng::rand_gen().rand_bytes(rand_seed.data(), 32); + if (!rand_seed_int.unique_write().import_bits(rand_seed.cbits(), 256, false)) { + return {}; + } + auto tuple = vm::make_tuple_ref(td::make_refint(0x076ef1ea), // [ magic:0x076ef1ea + td::make_refint(0), // actions:Integer + td::make_refint(0), // msgs_sent:Integer + td::make_refint(now), // unixtime:Integer + td::make_refint(lt), // block_lt:Integer + td::make_refint(lt), // trans_lt:Integer + std::move(rand_seed_int), // rand_seed:Integer + balance.as_vm_tuple(), // balance_remaining:[Integer (Maybe Cell)] + my_addr, // myself:MsgAddressInt + vm::StackEntry()); // global_config:(Maybe Cell) ] = SmartContractInfo; + LOG(DEBUG) << "SmartContractInfo initialized with " << vm::StackEntry(tuple).to_string(); + return vm::make_tuple_ref(std::move(tuple)); +} + void TestNode::run_smc_method(ton::BlockIdExt ref_blk, ton::BlockIdExt blk, ton::BlockIdExt shard_blk, td::BufferSlice shard_proof, td::BufferSlice proof, td::BufferSlice state, ton::WorkchainId workchain, ton::StdSmcAddress addr, std::string method, @@ -1240,7 +1271,9 @@ void TestNode::run_smc_method(ton::BlockIdExt ref_blk, ton::BlockIdExt blk, ton: } block::gen::Account::Record_account acc; block::gen::AccountStorage::Record store; - if (!(tlb::unpack_cell(info.root, acc) && tlb::csr_unpack(acc.storage, store))) { + block::CurrencyCollection balance; + if (!(tlb::unpack_cell(info.root, acc) && tlb::csr_unpack(acc.storage, store) && + balance.validate_unpack(store.balance))) { LOG(ERROR) << "error unpacking account state"; return; } @@ -1276,6 +1309,8 @@ void TestNode::run_smc_method(ton::BlockIdExt ref_blk, ton::BlockIdExt blk, ton: vm::GasLimits gas{gas_limit}; LOG(DEBUG) << "creating VM"; vm::VmState vm{code, std::move(stack), gas, 1, data, vm::VmLog()}; + vm.set_c7(prepare_vm_c7(info.gen_utime, info.gen_lt, acc.addr, balance)); // tuple with SmartContractInfo + // vm.incr_stack_trace(1); // enable stack dump after each step LOG(INFO) << "starting VM to run method `" << method << "` (" << method_id << ") of smart contract " << workchain << ":" << addr.to_hex(); int exit_code = ~vm.run(); diff --git a/lite-client/lite-client.h b/lite-client/lite-client.h index 36830e8d..17cc2955 100644 --- a/lite-client/lite-client.h +++ b/lite-client/lite-client.h @@ -119,6 +119,8 @@ class TestNode : public td::actor::Actor { td::BufferSlice shard_proof, td::BufferSlice proof, td::BufferSlice state, ton::WorkchainId workchain, ton::StdSmcAddress addr, std::string method, std::vector params); + Ref prepare_vm_c7(ton::UnixTime now, ton::LogicalTime lt, Ref my_addr, + const block::CurrencyCollection& balance) const; bool get_all_shards(bool use_last = true, ton::BlockIdExt blkid = {}); void got_all_shards(ton::BlockIdExt blk, td::BufferSlice proof, td::BufferSlice data); bool get_config_params(ton::BlockIdExt blkid, int mode = 0, std::string filename = ""); diff --git a/validator/manager.cpp b/validator/manager.cpp index 376b367e..eba3f243 100644 --- a/validator/manager.cpp +++ b/validator/manager.cpp @@ -1290,7 +1290,8 @@ void ValidatorManagerImpl::send_get_zero_state_request(BlockIdExt id, td::uint32 void ValidatorManagerImpl::send_get_persistent_state_request(BlockIdExt id, BlockIdExt masterchain_block_id, td::uint32 priority, td::Promise promise) { - callback_->download_persistent_state(id, masterchain_block_id, priority, td::Timestamp::in(60.0), std::move(promise)); + callback_->download_persistent_state(id, masterchain_block_id, priority, td::Timestamp::in(3600.0), + std::move(promise)); } void ValidatorManagerImpl::send_get_block_proof_request(BlockIdExt block_id, td::uint32 priority, diff --git a/validator/net/download-state.cpp b/validator/net/download-state.cpp index 3fe50247..6fc8c366 100644 --- a/validator/net/download-state.cpp +++ b/validator/net/download-state.cpp @@ -200,7 +200,7 @@ void DownloadState::got_block_state_part(td::BufferSlice data, td::uint32 reques return; } - td::uint32 part_size = 4 << 20; + td::uint32 part_size = 1 << 18; auto P = td::PromiseCreator::lambda([SelfId = actor_id(this), part_size](td::Result R) { if (R.is_error()) { td::actor::send_closure(SelfId, &DownloadState::abort_query, R.move_as_error());