mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
updated func
- updated func - deleted autogenerated files from git - updated liteclient - increase state sync timeout
This commit is contained in:
parent
c50074fd55
commit
9c9248a9ae
28 changed files with 302 additions and 2465 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -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*/
|
||||
|
|
|
@ -32,7 +32,7 @@ namespace block {
|
|||
using namespace std::literals::string_literals;
|
||||
|
||||
td::Status check_block_header_proof(td::Ref<vm::Cell> 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<vm::Cell> 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<vm::Cell> 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::Info> 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;
|
||||
|
|
|
@ -26,11 +26,12 @@ using td::Ref;
|
|||
|
||||
td::Status check_block_header_proof(td::Ref<vm::Cell> 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<vm::Cell> 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<td::Bits256> check_state_proof(ton::BlockIdExt blkid, td::Slice proof);
|
||||
td::Result<Ref<vm::Cell>> check_extract_state_proof(ton::BlockIdExt blkid, td::Slice proof, td::Slice data);
|
||||
|
||||
|
@ -48,6 +49,7 @@ struct AccountState {
|
|||
td::Ref<vm::Cell> root;
|
||||
ton::LogicalTime last_trans_lt = 0;
|
||||
ton::Bits256 last_trans_hash;
|
||||
ton::LogicalTime gen_lt{0};
|
||||
td::uint32 gen_utime{0};
|
||||
};
|
||||
|
||||
|
|
|
@ -806,7 +806,6 @@ bool Transaction::prepare_rand_seed(td::BitArray<256>& rand_seed, const ComputeP
|
|||
}
|
||||
|
||||
Ref<vm::Tuple> 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<vm::CellSlice>& 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();
|
||||
}
|
||||
|
|
|
@ -50,15 +50,15 @@ void define_builtin_func(std::string name, TypeExpr* func_type, const T& func, b
|
|||
}
|
||||
|
||||
template <typename T>
|
||||
void define_builtin_func_x(std::string name, TypeExpr* func_type, const T& func, std::initializer_list<int> arg_order,
|
||||
std::initializer_list<int> ret_order = {}, bool impure = false) {
|
||||
void define_builtin_func(std::string name, TypeExpr* func_type, const T& func, std::initializer_list<int> arg_order,
|
||||
std::initializer_list<int> 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<int> arg_order, std::initializer_list<int> ret_order = {},
|
||||
bool impure = false) {
|
||||
void define_builtin_func(std::string name, TypeExpr* func_type, const AsmOp& macro,
|
||||
std::initializer_list<int> arg_order, std::initializer_list<int> 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<VarDescr>& res, std::vector<VarDescr>& 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<VarDescr>& res, std::vector<VarDescr>& 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);
|
||||
}
|
||||
|
|
|
@ -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<TypeExpr*> 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<SymDef*> glob_func;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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<SymValType*>(sym->value)) {
|
||||
auto val = dynamic_cast<SymValType*>(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<SymValType*>(sym->value)) {
|
||||
auto val = dynamic_cast<SymValType*>(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<SymValType*>(sym->value)) {
|
||||
auto val = dynamic_cast<SymValType*>(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<SymVal*>(res->sym->value);
|
||||
if (sym) {
|
||||
val = dynamic_cast<SymVal*>(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<TypeExpr*> parse_type_var_list(Lexer& lex) {
|
||||
std::vector<TypeExpr*> 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<TypeExpr*>& typevars, std::vector<bool>& 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<TypeExpr*>& typevars) {
|
||||
if (typevars.empty()) {
|
||||
return expr;
|
||||
}
|
||||
std::vector<bool> used(typevars.size(), false);
|
||||
type_var_usage(expr, typevars, used);
|
||||
std::vector<TypeExpr*> 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<TypeExpr*> 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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
22
crypto/func/test/a6_3.fc
Normal file
22
crypto/func/test/a6_3.fc
Normal file
|
@ -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);
|
||||
}
|
|
@ -153,7 +153,7 @@ bool TypeExpr::remove_forall(TypeExpr*& te) {
|
|||
bool TypeExpr::remove_forall_in(TypeExpr*& te, TypeExpr* te2, const std::vector<TypeExpr*>& 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];
|
||||
|
|
|
@ -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==");
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||
with_tvm_code("elector-code", "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");
|
File diff suppressed because it is too large
Load diff
|
@ -1 +0,0 @@
|
|||
with_tvm_code("highload-wallet", "te6ccgEBBgEAhgABFP8A9KQT9KDyyAsBAgEgAgMCAUgEBQC88oMI1xgg0x/TH9Mf+CMTu/Jj7UTQ0x/TH9P/0VEyuvKhUUS68qIE+QFUEFX5EPKj9ATR+AB/jhghgBD0eG+hb6EgmALTB9QwAfsAkTLiAbPmWwGkyMsfyx/L/8ntVAAE0DAAEaCZL9qJoa4WPw==");
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||
with_tvm_code("highoad-wallet-v2", "te6ccgEBBwEA1wABFP8A9KQT9KDyyAsBAgEgAgMCAUgEBQHu8oMI1xgg0x/TP/gjqh9TILnyY+1E0NMf0z/T//QE0VNggED0Dm+hMfJgUXO68qIH+QFUEIf5EPKjAvQE0fgAf44YIYAQ9HhvoW+hIJgC0wfUMAH7AJEy4gGz5luDJaHIQDSAQPRDiuYxyBLLHxPLP8v/9ADJ7VQGAATQMABBoZfl2omhpj5jpn+n/mPoCaKkQQCB6BzfQmMktv8ld0fFADoggED0lm+hb6EyURCUMFMDud4gkjM2k0MTW+IBsw==");
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||
with_tvm_code("simple-wallet", "te6ccgEBBAEATwABFP8A9KQT9KDyyAsBAgEgAgMABNIwAG7ygwjXGCDTH+1E0NMf0//RUTG68qED+QFUEEL5EPKi+ABRINdKltMH1AL7AN7RpMjLH8v/ye1U");
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||
with_tvm_code("wallet", "te6ccgEBBgEAaAABFP8A9KQT9KDyyAsBAgEgAgMCAUgEBQCA8oMI1xgg0x/TH/gjErvyY+1E0NMf0//RUTG68qED+QFUEEL5EPKi+AACkyDXSpbTB9QC+wDo0aTIyx/L/8ntVAAE0DAAEaCZL9qJoa4WPw==");
|
|
@ -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
|
|
@ -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";
|
||||
|
|
|
@ -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 <unistd.h>
|
||||
|
@ -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<vm::Tuple> TestNode::prepare_vm_c7(ton::UnixTime now, ton::LogicalTime lt, Ref<vm::CellSlice> 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();
|
||||
|
|
|
@ -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<vm::StackEntry> params);
|
||||
Ref<vm::Tuple> prepare_vm_c7(ton::UnixTime now, ton::LogicalTime lt, Ref<vm::CellSlice> 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 = "");
|
||||
|
|
|
@ -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<td::BufferSlice> 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,
|
||||
|
|
|
@ -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<td::BufferSlice> R) {
|
||||
if (R.is_error()) {
|
||||
td::actor::send_closure(SelfId, &DownloadState::abort_query, R.move_as_error());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue