From 50e1676c395a58e6ab26963accb33ef84988466a Mon Sep 17 00:00:00 2001 From: Peter <> Date: Sat, 28 Sep 2019 01:04:25 +0400 Subject: [PATCH 1/2] Try to fix build --- Share/Info.plist | 18 +++++++++--------- buildbox/build-telegram.sh | 6 +++++- buildbox/guest-build-telegram.sh | 7 ++++++- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Share/Info.plist b/Share/Info.plist index c9a43739ce..bb648b8031 100644 --- a/Share/Info.plist +++ b/Share/Info.plist @@ -35,15 +35,15 @@ SUBQUERY ( $extensionItem.attachments, $attachment, - ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.file-url" || - ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.movie" || - ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image" || - ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url" || - ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.text" || - ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.audio" || - ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.data" || - ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.vcard" || - ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.apple.pkpass" + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.file-url" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.movie" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.text" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.audio" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.data" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.vcard" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.apple.pkpass" ).@count == $extensionItem.attachments.@count ).@count > 0 diff --git a/buildbox/build-telegram.sh b/buildbox/build-telegram.sh index bed9a6da0d..e56f68170d 100644 --- a/buildbox/build-telegram.sh +++ b/buildbox/build-telegram.sh @@ -106,6 +106,10 @@ if [ "$BUILD_CONFIGURATION" == "hockeyapp" ] || [ "$BUILD_CONFIGURATION" == "app echo "TELEGRAM_BUILD_APPSTORE_TEAM_NAME is not set" exit 1 fi + if [ -z "$TELEGRAM_BUILD_APPSTORE_USERNAME" ]; then + echo "TELEGRAM_BUILD_APPSTORE_USERNAME is not set" + exit 1 + fi fi fi @@ -166,7 +170,7 @@ else fi scp -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -pr "$BUILDBOX_DIR/guest-build-telegram.sh" "$BUILDBOX_DIR/transient-data/source.tar" telegram@"$VM_IP": -ssh -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null telegram@"$VM_IP" -o ServerAliveInterval=60 -t "export TELEGRAM_BUILD_APPSTORE_PASSWORD=\"$TELEGRAM_BUILD_APPSTORE_PASSWORD\"; export TELEGRAM_BUILD_APPSTORE_TEAM_NAME=\"$TELEGRAM_BUILD_APPSTORE_TEAM_NAME\"; export BUILD_NUMBER=\"$BUILD_NUMBER\"; export COMMIT_ID=\"$COMMIT_ID\"; export COMMIT_AUTHOR=\"$COMMIT_AUTHOR\"; export BUCK_HTTP_CACHE=\"$BUCK_HTTP_CACHE\"; bash -l guest-build-telegram.sh $BUILD_CONFIGURATION" || true +ssh -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null telegram@"$VM_IP" -o ServerAliveInterval=60 -t "export TELEGRAM_BUILD_APPSTORE_PASSWORD=\"$TELEGRAM_BUILD_APPSTORE_PASSWORD\"; export TELEGRAM_BUILD_APPSTORE_TEAM_NAME=\"$TELEGRAM_BUILD_APPSTORE_TEAM_NAME\"; export TELEGRAM_BUILD_APPSTORE_USERNAME=\"$TELEGRAM_BUILD_APPSTORE_USERNAME\"; export BUILD_NUMBER=\"$BUILD_NUMBER\"; export COMMIT_ID=\"$COMMIT_ID\"; export COMMIT_AUTHOR=\"$COMMIT_AUTHOR\"; export BUCK_HTTP_CACHE=\"$BUCK_HTTP_CACHE\"; bash -l guest-build-telegram.sh $BUILD_CONFIGURATION" || true if [ "$BUILD_CONFIGURATION" == "appstore" ]; then ARCHIVE_PATH="$HOME/telegram-builds-archive" diff --git a/buildbox/guest-build-telegram.sh b/buildbox/guest-build-telegram.sh index eba6b956c5..06c3ab2335 100644 --- a/buildbox/guest-build-telegram.sh +++ b/buildbox/guest-build-telegram.sh @@ -30,6 +30,7 @@ elif [ "$1" == "appstore" ]; then echo "TELEGRAM_BUILD_APPSTORE_TEAM_NAME is not set" exit 1 fi + FASTLANE_ITC_USERNAME="$TELEGRAM_BUILD_APPSTORE_USERNAME" FASTLANE_PASSWORD="$TELEGRAM_BUILD_APPSTORE_PASSWORD" FASTLANE_ITC_TEAM_NAME="$TELEGRAM_BUILD_APPSTORE_TEAM_NAME" CERTS_PATH="codesigning_data/certs" @@ -129,7 +130,11 @@ else cp "build/DSYMs.zip" "./$RESULT_DSYM_NAME" export DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS="-t DAV" - FASTLANE_PASSWORD="$FASTLANE_PASSWORD" FASTLANE_ITC_TEAM_NAME="$FASTLANE_ITC_TEAM_NAME" fastlane "$FASTLANE_BUILD_CONFIGURATION" build_number:"$BUILD_NUMBER" commit_hash:"$COMMIT_ID" commit_author:"$COMMIT_AUTHOR" skip_build:1 + if [ "$1" == "appstore" ]; then + xcrun altool --upload-app --type ios --file "$RESULT_IPA_NAME" --username "$FASTLANE_ITC_USERNAME" --password "$FASTLANE_PASSWORD" + else + FASTLANE_PASSWORD="$FASTLANE_PASSWORD" FASTLANE_ITC_TEAM_NAME="$FASTLANE_ITC_TEAM_NAME" fastlane "$FASTLANE_BUILD_CONFIGURATION" build_number:"$BUILD_NUMBER" commit_hash:"$COMMIT_ID" commit_author:"$COMMIT_AUTHOR" skip_build:1 + fi cd "$BASE_DIR" fi From 52cd9e3edbae72743a95ff20980b6726bfe36297 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Sat, 28 Sep 2019 01:13:56 +0400 Subject: [PATCH 2/2] One more time --- Share/Info.plist | 4 - .../Telegram_Buck+IntentsExtension.xcscheme | 98 +- ...Buck+NotificationContentExtension.xcscheme | 98 +- ...Buck+NotificationServiceExtension.xcscheme | 98 +- .../Telegram_Buck+ShareExtension.xcscheme | 98 +- .../Telegram_Buck+WidgetExtension.xcscheme | 98 +- .../xcschemes/Telegram_Buck.xcscheme | 2603 +---------------- .../xcschemes/SwiftSignalKit.xcscheme | 72 +- .../tonlib-src/crypto/block/transaction.cpp | 83 +- .../ton/tonlib-src/crypto/block/transaction.h | 2 +- .../ton/tonlib-src/crypto/tl/tlblib.hpp | 4 + submodules/ton/tonlib-src/crypto/vm/boc.cpp | 28 +- submodules/ton/tonlib-src/crypto/vm/boc.h | 16 +- .../crypto/vm/cells/CellBuilder.cpp | 5 +- .../tl/generate/auto/tl/tonlib_api.cpp | 63 + .../tl/generate/auto/tl/tonlib_api.h | 57 + .../tl/generate/auto/tl/tonlib_api.hpp | 9 + .../tl/generate/auto/tl/tonlib_api_json.cpp | 68 + .../tl/generate/auto/tl/tonlib_api_json.h | 6 + .../tl/generate/scheme/tonlib_api.tl | 5 + .../tl/generate/scheme/tonlib_api.tlo | Bin 12036 -> 12496 bytes .../ton/tonlib-src/tonlib/test/offline.cpp | 20 + .../tonlib/tonlib/.TonlibClient.cpp.swp | Bin 0 -> 90112 bytes ...GenericAccount.cpp.swp => .Wallet.cpp.swp} | Bin 12288 -> 16384 bytes .../tonlib-src/tonlib/tonlib/LastBlock.cpp | 2 +- .../tonlib-src/tonlib/tonlib/TonlibClient.cpp | 44 +- .../tonlib-src/tonlib/tonlib/TonlibClient.h | 2 + .../tonlib-src/tonlib/tonlib/tonlib-cli.cpp | 16 + 28 files changed, 387 insertions(+), 3212 deletions(-) create mode 100644 submodules/ton/tonlib-src/tonlib/tonlib/.TonlibClient.cpp.swp rename submodules/ton/tonlib-src/tonlib/tonlib/{.GenericAccount.cpp.swp => .Wallet.cpp.swp} (52%) diff --git a/Share/Info.plist b/Share/Info.plist index bb648b8031..21a471347b 100644 --- a/Share/Info.plist +++ b/Share/Info.plist @@ -17,11 +17,7 @@ CFBundlePackageType XPC! CFBundleShortVersionString -<<<<<<< HEAD - $(PRODUCT_BUNDLE_SHORT_VERSION) -======= 5.12 ->>>>>>> 5b85b9dffa9d63ffaa35f448e3903bcd7b9f2156 CFBundleVersion ${BUILD_NUMBER} NSExtension diff --git a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+IntentsExtension.xcscheme b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+IntentsExtension.xcscheme index a48bce0372..6d8563cd6c 100644 --- a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+IntentsExtension.xcscheme +++ b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+IntentsExtension.xcscheme @@ -1,97 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+NotificationContentExtension.xcscheme b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+NotificationContentExtension.xcscheme index e49afaf107..08fc8c1eb4 100644 --- a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+NotificationContentExtension.xcscheme +++ b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+NotificationContentExtension.xcscheme @@ -1,97 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+NotificationServiceExtension.xcscheme b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+NotificationServiceExtension.xcscheme index 749f43806b..c3e465a825 100644 --- a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+NotificationServiceExtension.xcscheme +++ b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+NotificationServiceExtension.xcscheme @@ -1,97 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+ShareExtension.xcscheme b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+ShareExtension.xcscheme index df5967d397..22e9d40515 100644 --- a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+ShareExtension.xcscheme +++ b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+ShareExtension.xcscheme @@ -1,97 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+WidgetExtension.xcscheme b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+WidgetExtension.xcscheme index e1435ba40b..b53d54939b 100644 --- a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+WidgetExtension.xcscheme +++ b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck+WidgetExtension.xcscheme @@ -1,97 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck.xcscheme b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck.xcscheme index e009a59b64..a58b71fc1a 100644 --- a/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck.xcscheme +++ b/Telegram_Buck.xcworkspace/xcshareddata/xcschemes/Telegram_Buck.xcscheme @@ -1,2602 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/submodules/SSignalKit/SwiftSignalKit/SwiftSignalKit.xcodeproj/xcshareddata/xcschemes/SwiftSignalKit.xcscheme b/submodules/SSignalKit/SwiftSignalKit/SwiftSignalKit.xcodeproj/xcshareddata/xcschemes/SwiftSignalKit.xcscheme index c82fe8764f..6eae9bf611 100644 --- a/submodules/SSignalKit/SwiftSignalKit/SwiftSignalKit.xcodeproj/xcshareddata/xcschemes/SwiftSignalKit.xcscheme +++ b/submodules/SSignalKit/SwiftSignalKit/SwiftSignalKit.xcodeproj/xcshareddata/xcschemes/SwiftSignalKit.xcscheme @@ -1,71 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/submodules/ton/tonlib-src/crypto/block/transaction.cpp b/submodules/ton/tonlib-src/crypto/block/transaction.cpp index 77f3ad0756..11f118d4d3 100644 --- a/submodules/ton/tonlib-src/crypto/block/transaction.cpp +++ b/submodules/ton/tonlib-src/crypto/block/transaction.cpp @@ -1027,6 +1027,12 @@ bool Transaction::prepare_action_phase(const ActionPhaseConfig& cfg) { break; case block::gen::OutAction::action_send_msg: err_code = try_action_send_msg(cs, ap, cfg); + if (err_code == -2) { + err_code = try_action_send_msg(cs, ap, cfg, 1); + if (err_code == -2) { + err_code = try_action_send_msg(cs, ap, cfg, 2); + } + } break; case block::gen::OutAction::action_reserve_currency: err_code = try_action_reserve_currency(cs, ap, cfg); @@ -1240,22 +1246,60 @@ bool Transaction::check_rewrite_dest_addr(Ref& dest_addr, const A return true; } -int Transaction::try_action_send_msg(vm::CellSlice& cs, ActionPhase& ap, const ActionPhaseConfig& cfg) { +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 + vm::CellSlice cs{cs0}; if (!tlb::unpack_exact(cs, act_rec) || (act_rec.mode & ~0xc3) || (act_rec.mode & 0xc0) == 0xc0) { return -1; } bool skip_invalid = (act_rec.mode & 2); - auto cs2 = vm::load_cell_slice(act_rec.out_msg); - // try to parse suggested message in cs2 + // try to parse suggested message in act_rec.out_msg td::RefInt256 fwd_fee, ihr_fee; - bool ext_msg = cs2.prefetch_ulong(1); + block::gen::MessageRelaxed::Record msg; + if (!tlb::type_unpack_cell(act_rec.out_msg, block::gen::t_MessageRelaxed_Any, msg)) { + return -1; + } + if (redoing >= 1) { + if (msg.init->size_refs() >= 2) { + LOG(DEBUG) << "moving the StateInit of a suggested outbound message into a separate cell"; + // init:(Maybe (Either StateInit ^StateInit)) + // transform (just (left z:StateInit)) into (just (right z:^StateInit)) + CHECK(msg.init.write().fetch_ulong(2) == 2); + vm::CellBuilder cb; + Ref cell; + CHECK(cb.append_cellslice_bool(std::move(msg.init)) // StateInit + && cb.finalize_to(cell) // -> ^StateInit + && cb.store_long_bool(3, 2) // (just (right ... )) + && cb.store_ref_bool(std::move(cell)) // z:^StateInit + && cb.finalize_to(cell)); + msg.init = vm::load_cell_slice_ref(std::move(cell)); + } else { + redoing = 2; + } + } + if (redoing >= 2 && msg.body->size_ext() > 1 && msg.body->prefetch_ulong(1) == 0) { + LOG(DEBUG) << "moving the body of a suggested outbound message into a separate cell"; + // body:(Either X ^X) + // transform (left x:X) into (right x:^X) + CHECK(msg.body.write().fetch_ulong(1) == 0); + vm::CellBuilder cb; + Ref cell; + CHECK(cb.append_cellslice_bool(std::move(msg.body)) // X + && cb.finalize_to(cell) // -> ^X + && cb.store_long_bool(1, 1) // (right ... ) + && cb.store_ref_bool(std::move(cell)) // x:^X + && cb.finalize_to(cell)); + msg.body = vm::load_cell_slice_ref(std::move(cell)); + } + block::gen::CommonMsgInfoRelaxed::Record_int_msg_info info; + bool ext_msg = msg.info->prefetch_ulong(1); if (ext_msg) { // ext_out_msg_info$11 constructor of CommonMsgInfoRelaxed block::gen::CommonMsgInfoRelaxed::Record_ext_out_msg_info erec; - if (!tlb::unpack(cs2, erec)) { + if (!tlb::csr_unpack(msg.info, erec)) { return -1; } info.src = std::move(erec.src); @@ -1267,7 +1311,7 @@ int Transaction::try_action_send_msg(vm::CellSlice& cs, ActionPhase& ap, const A fwd_fee = ihr_fee = td::RefInt256{true, 0}; } else { // int_msg_info$0 constructor - if (!tlb::unpack(cs2, info) || !block::tlb::t_CurrencyCollection.validate_csr(info.value)) { + if (!tlb::csr_unpack(msg.info, info) || !block::tlb::t_CurrencyCollection.validate_csr(info.value)) { return -1; } fwd_fee = block::tlb::t_Grams.as_integer(info.fwd_fee); @@ -1295,12 +1339,11 @@ int Transaction::try_action_send_msg(vm::CellSlice& cs, ActionPhase& ap, const A // compute size of message vm::CellStorageStat sstat; // for message size // preliminary storage estimation of the resulting message - sstat.compute_used_storage(cs2); // message body + sstat.add_used_storage(msg.init, true, 3); // message init + sstat.add_used_storage(msg.body, true, 3); // message body (the root cell itself is not counted) if (!ext_msg) { sstat.add_used_storage(info.value->prefetch_ref()); } - sstat.bits -= cs2.size(); // bits in the root cells are free - sstat.cells--; // the root cell itself is not counted as a cell LOG(DEBUG) << "storage paid for a message: " << sstat.cells << " cells, " << sstat.bits << " bits"; if (sstat.bits > max_msg_bits || sstat.cells > max_msg_cells) { LOG(DEBUG) << "message too large, invalid"; @@ -1397,17 +1440,15 @@ int Transaction::try_action_send_msg(vm::CellSlice& cs, ActionPhase& ap, const A // re-pack message value CHECK(req.pack_to(info.value)); - vm::CellBuilder cb; - CHECK(block::tlb::t_Grams.store_integer_ref(cb, fwd_fee_remain) && - (info.fwd_fee = load_cell_slice_ref(cb.finalize())).not_null()); - CHECK(block::tlb::t_Grams.store_integer_ref(cb, ihr_fee) && - (info.ihr_fee = load_cell_slice_ref(cb.finalize())).not_null()); + CHECK(block::tlb::t_Grams.pack_integer(info.fwd_fee, fwd_fee_remain)); + CHECK(block::tlb::t_Grams.pack_integer(info.ihr_fee, ihr_fee)); // serialize message - CHECK(tlb::pack(cb, info)); - if (!cb.append_cellslice_bool(cs2)) { + CHECK(tlb::csr_pack(msg.info, info)); + vm::CellBuilder cb; + if (!tlb::type_pack(cb, block::gen::t_MessageRelaxed_Any, msg)) { LOG(DEBUG) << "outbound message does not fit into a cell after rewriting"; - return 39; + return redoing < 2 ? -2 : (skip_invalid ? 0 : 39); } new_msg_bits = cb.size(); @@ -1438,11 +1479,11 @@ int Transaction::try_action_send_msg(vm::CellSlice& cs, ActionPhase& ap, const A erec.dest = info.dest; erec.created_at = info.created_at; erec.created_lt = info.created_lt; + CHECK(tlb::csr_pack(msg.info, erec)); vm::CellBuilder cb; - CHECK(tlb::pack(cb, erec)); - if (!cb.append_cellslice_bool(cs2)) { + if (!tlb::type_pack(cb, block::gen::t_MessageRelaxed_Any, msg)) { LOG(DEBUG) << "outbound message does not fit into a cell after rewriting"; - return 39; + return redoing < 2 ? -2 : (skip_invalid ? 0 : 39); } new_msg_bits = cb.size(); @@ -1461,6 +1502,8 @@ int Transaction::try_action_send_msg(vm::CellSlice& cs, ActionPhase& ap, const A } if (!block::gen::t_Message_Any.validate_ref(new_msg)) { LOG(ERROR) << "generated outbound message is not a valid (Message Any) according to automated check"; + block::gen::t_Message_Any.print_ref(std::cerr, new_msg); + vm::load_cell_slice(new_msg).print_rec(std::cerr); return -1; } if (verbosity > 2) { diff --git a/submodules/ton/tonlib-src/crypto/block/transaction.h b/submodules/ton/tonlib-src/crypto/block/transaction.h index 94b2a85300..45e824c1e8 100644 --- a/submodules/ton/tonlib-src/crypto/block/transaction.h +++ b/submodules/ton/tonlib-src/crypto/block/transaction.h @@ -390,7 +390,7 @@ struct Transaction { Ref prepare_vm_c7(const ComputePhaseConfig& cfg) const; bool prepare_rand_seed(td::BitArray<256>& rand_seed, const ComputePhaseConfig& cfg) const; int try_action_set_code(vm::CellSlice& cs, ActionPhase& ap, const ActionPhaseConfig& cfg); - int try_action_send_msg(vm::CellSlice& cs, ActionPhase& ap, const ActionPhaseConfig& cfg); + int try_action_send_msg(const vm::CellSlice& cs, ActionPhase& ap, const ActionPhaseConfig& cfg, int redoing = 0); int try_action_reserve_currency(vm::CellSlice& cs, ActionPhase& ap, const ActionPhaseConfig& cfg); bool check_replace_src_addr(Ref& src_addr) const; bool check_rewrite_dest_addr(Ref& dest_addr, const ActionPhaseConfig& cfg, diff --git a/submodules/ton/tonlib-src/crypto/tl/tlblib.hpp b/submodules/ton/tonlib-src/crypto/tl/tlblib.hpp index 1e4f458c4e..b5d51c3154 100644 --- a/submodules/ton/tonlib-src/crypto/tl/tlblib.hpp +++ b/submodules/ton/tonlib-src/crypto/tl/tlblib.hpp @@ -176,6 +176,10 @@ class TLB { virtual bool store_integer_ref(vm::CellBuilder& cb, td::RefInt256 value) const { return value.not_null() && store_integer_value(cb, *value); } + bool pack_integer(Ref& csr, td::RefInt256 value) const { + vm::CellBuilder cb; + return store_integer_ref(cb, value) && (csr = vm::load_cell_slice_ref(cb.finalize())).not_null(); + } virtual bool add_values(vm::CellBuilder& cb, vm::CellSlice& cs1, vm::CellSlice& cs2) const { td::RefInt256 x = as_integer_skip(cs1), y = as_integer_skip(cs2); return x.not_null() && y.not_null() && store_integer_ref(cb, x += std::move(y)); diff --git a/submodules/ton/tonlib-src/crypto/vm/boc.cpp b/submodules/ton/tonlib-src/crypto/vm/boc.cpp index 0ea69f3b80..9b60884d10 100644 --- a/submodules/ton/tonlib-src/crypto/vm/boc.cpp +++ b/submodules/ton/tonlib-src/crypto/vm/boc.cpp @@ -988,27 +988,27 @@ td::Result std_boc_serialize_multi(std::vector> roots * */ -bool CellStorageStat::compute_used_storage(Ref cs_ref, bool kill_dup, bool skip_count_root) { +bool CellStorageStat::compute_used_storage(Ref cs_ref, bool kill_dup, unsigned skip_count_root) { clear(); return add_used_storage(std::move(cs_ref), kill_dup, skip_count_root) && clear_seen(); } -bool CellStorageStat::compute_used_storage(const CellSlice& cs, bool kill_dup, bool skip_count_root) { +bool CellStorageStat::compute_used_storage(const CellSlice& cs, bool kill_dup, unsigned skip_count_root) { clear(); return add_used_storage(cs, kill_dup, skip_count_root) && clear_seen(); } -bool CellStorageStat::compute_used_storage(CellSlice&& cs, bool kill_dup, bool skip_count_root) { +bool CellStorageStat::compute_used_storage(CellSlice&& cs, bool kill_dup, unsigned skip_count_root) { clear(); return add_used_storage(std::move(cs), kill_dup, skip_count_root) && clear_seen(); } -bool CellStorageStat::compute_used_storage(Ref cell, bool kill_dup, bool skip_count_root) { +bool CellStorageStat::compute_used_storage(Ref cell, bool kill_dup, unsigned skip_count_root) { clear(); return add_used_storage(std::move(cell), kill_dup, skip_count_root) && clear_seen(); } -bool CellStorageStat::add_used_storage(Ref cs_ref, bool kill_dup, bool skip_count_root) { +bool CellStorageStat::add_used_storage(Ref cs_ref, bool kill_dup, unsigned skip_count_root) { if (cs_ref->is_unique()) { return add_used_storage(std::move(cs_ref.unique_write()), kill_dup, skip_count_root); } else { @@ -1016,11 +1016,13 @@ bool CellStorageStat::add_used_storage(Ref cs_ref, bool kill_dup, } } -bool CellStorageStat::add_used_storage(const CellSlice& cs, bool kill_dup, bool skip_count_root) { - if (!skip_count_root) { +bool CellStorageStat::add_used_storage(const CellSlice& cs, bool kill_dup, unsigned skip_count_root) { + if (!(skip_count_root & 1)) { ++cells; } - bits += cs.size(); + if (!(skip_count_root & 2)) { + bits += cs.size(); + } for (unsigned i = 0; i < cs.size_refs(); i++) { if (!add_used_storage(cs.prefetch_ref(i), kill_dup)) { return false; @@ -1029,11 +1031,13 @@ bool CellStorageStat::add_used_storage(const CellSlice& cs, bool kill_dup, bool return true; } -bool CellStorageStat::add_used_storage(CellSlice&& cs, bool kill_dup, bool skip_count_root) { - if (!skip_count_root) { +bool CellStorageStat::add_used_storage(CellSlice&& cs, bool kill_dup, unsigned skip_count_root) { + if (!(skip_count_root & 1)) { ++cells; } - bits += cs.size(); + if (!(skip_count_root & 2)) { + bits += cs.size(); + } while (cs.size_refs()) { if (!add_used_storage(cs.fetch_ref(), kill_dup)) { return false; @@ -1042,7 +1046,7 @@ bool CellStorageStat::add_used_storage(CellSlice&& cs, bool kill_dup, bool skip_ return true; } -bool CellStorageStat::add_used_storage(Ref cell, bool kill_dup, bool skip_count_root) { +bool CellStorageStat::add_used_storage(Ref cell, bool kill_dup, unsigned skip_count_root) { if (cell.is_null()) { return false; } diff --git a/submodules/ton/tonlib-src/crypto/vm/boc.h b/submodules/ton/tonlib-src/crypto/vm/boc.h index 5b4e4e2c4b..29f582be70 100644 --- a/submodules/ton/tonlib-src/crypto/vm/boc.h +++ b/submodules/ton/tonlib-src/crypto/vm/boc.h @@ -122,15 +122,15 @@ struct CellStorageStat { cells = bits = public_cells = 0; clear_seen(); } - bool compute_used_storage(Ref cs_ref, bool kill_dup = true, bool skip_count_root = false); - bool compute_used_storage(const CellSlice& cs, bool kill_dup = true, bool skip_count_root = false); - bool compute_used_storage(CellSlice&& cs, bool kill_dup = true, bool skip_count_root = false); - bool compute_used_storage(Ref cell, bool kill_dup = true, bool skip_count_root = false); + bool compute_used_storage(Ref cs_ref, bool kill_dup = true, unsigned skip_count_root = 0); + bool compute_used_storage(const CellSlice& cs, bool kill_dup = true, unsigned skip_count_root = 0); + bool compute_used_storage(CellSlice&& cs, bool kill_dup = true, unsigned skip_count_root = 0); + bool compute_used_storage(Ref cell, bool kill_dup = true, unsigned skip_count_root = 0); - bool add_used_storage(Ref cs_ref, bool kill_dup = true, bool skip_count_root = false); - bool add_used_storage(const CellSlice& cs, bool kill_dup = true, bool skip_count_root = false); - bool add_used_storage(CellSlice&& cs, bool kill_dup = true, bool skip_count_root = false); - bool add_used_storage(Ref cell, bool kill_dup = true, bool skip_count_root = false); + bool add_used_storage(Ref cs_ref, bool kill_dup = true, unsigned skip_count_root = 0); + bool add_used_storage(const CellSlice& cs, bool kill_dup = true, unsigned skip_count_root = 0); + bool add_used_storage(CellSlice&& cs, bool kill_dup = true, unsigned skip_count_root = 0); + bool add_used_storage(Ref cell, bool kill_dup = true, unsigned skip_count_root = 0); }; struct CellSerializationInfo { diff --git a/submodules/ton/tonlib-src/crypto/vm/cells/CellBuilder.cpp b/submodules/ton/tonlib-src/crypto/vm/cells/CellBuilder.cpp index ec933c071b..37940f718a 100644 --- a/submodules/ton/tonlib-src/crypto/vm/cells/CellBuilder.cpp +++ b/submodules/ton/tonlib-src/crypto/vm/cells/CellBuilder.cpp @@ -207,9 +207,8 @@ bool CellBuilder::store_bits_bool(const unsigned char* str, std::size_t bit_coun CellBuilder& CellBuilder::store_bits(const unsigned char* str, std::size_t bit_count, int bit_offset) { unsigned pos = bits; - if (prepare_reserve(bit_count)) { - td::bitstring::bits_memcpy(data, pos, str, bit_offset, bit_count); - } + ensure_throw(prepare_reserve(bit_count)); + td::bitstring::bits_memcpy(data, pos, str, bit_offset, bit_count); return *this; } diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.cpp b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.cpp index a937cb69bf..3a3e034c82 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.cpp +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.cpp @@ -331,6 +331,33 @@ void sendGramsResult::store(td::TlStorerToString &s, const char *field_name) con } } +unpackedAccountAddress::unpackedAccountAddress() + : workchain_id_() + , bounceable_() + , testnet_() + , addr_() +{} + +unpackedAccountAddress::unpackedAccountAddress(std::int32_t workchain_id_, bool bounceable_, bool testnet_, std::string const &addr_) + : workchain_id_(workchain_id_) + , bounceable_(bounceable_) + , testnet_(testnet_) + , addr_(std::move(addr_)) +{} + +const std::int32_t unpackedAccountAddress::ID; + +void unpackedAccountAddress::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "unpackedAccountAddress"); + s.store_field("workchain_id", workchain_id_); + s.store_field("bounceable", bounceable_); + s.store_field("testnet", testnet_); + s.store_bytes_field("addr", addr_); + s.store_class_end(); + } +} + updateSendLiteServerQuery::updateSendLiteServerQuery() : id_() , data_() @@ -1168,6 +1195,24 @@ void options_setConfig::store(td::TlStorerToString &s, const char *field_name) c } } +packAccountAddress::packAccountAddress() + : account_address_() +{} + +packAccountAddress::packAccountAddress(object_ptr &&account_address_) + : account_address_(std::move(account_address_)) +{} + +const std::int32_t packAccountAddress::ID; + +void packAccountAddress::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "packAccountAddress"); + if (account_address_ == nullptr) { s.store_field("account_address", "null"); } else { account_address_->store(s, "account_address"); } + s.store_class_end(); + } +} + raw_getAccountAddress::raw_getAccountAddress() : initital_account_state_() {} @@ -1459,6 +1504,24 @@ void testWallet_sendGrams::store(td::TlStorerToString &s, const char *field_name } } +unpackAccountAddress::unpackAccountAddress() + : account_address_() +{} + +unpackAccountAddress::unpackAccountAddress(std::string const &account_address_) + : account_address_(std::move(account_address_)) +{} + +const std::int32_t unpackAccountAddress::ID; + +void unpackAccountAddress::store(td::TlStorerToString &s, const char *field_name) const { + if (!LOG_IS_STRIPPED(ERROR)) { + s.store_class_begin(field_name, "unpackAccountAddress"); + s.store_field("account_address", account_address_); + s.store_class_end(); + } +} + wallet_getAccountAddress::wallet_getAccountAddress() : initital_account_state_() {} diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.h b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.h index 70e426294a..c4a9fa6d15 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.h +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.h @@ -74,6 +74,8 @@ class options; class sendGramsResult; +class unpackedAccountAddress; + class updateSendLiteServerQuery; class generic_AccountState; @@ -387,6 +389,25 @@ class sendGramsResult final : public Object { void store(td::TlStorerToString &s, const char *field_name) const final; }; +class unpackedAccountAddress final : public Object { + public: + std::int32_t workchain_id_; + bool bounceable_; + bool testnet_; + std::string addr_; + + unpackedAccountAddress(); + + unpackedAccountAddress(std::int32_t workchain_id_, bool bounceable_, bool testnet_, std::string const &addr_); + + static const std::int32_t ID = 1892946998; + std::int32_t get_id() const final { + return ID; + } + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + class updateSendLiteServerQuery final : public Object { public: std::int64_t id_; @@ -1110,6 +1131,24 @@ class options_setConfig final : public Function { void store(td::TlStorerToString &s, const char *field_name) const final; }; +class packAccountAddress final : public Function { + public: + object_ptr account_address_; + + packAccountAddress(); + + explicit packAccountAddress(object_ptr &&account_address_); + + static const std::int32_t ID = -1388561940; + std::int32_t get_id() const final { + return ID; + } + + using ReturnType = object_ptr; + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + class raw_getAccountAddress final : public Function { public: object_ptr initital_account_state_; @@ -1385,6 +1424,24 @@ class testWallet_sendGrams final : public Function { void store(td::TlStorerToString &s, const char *field_name) const final; }; +class unpackAccountAddress final : public Function { + public: + std::string account_address_; + + unpackAccountAddress(); + + explicit unpackAccountAddress(std::string const &account_address_); + + static const std::int32_t ID = -682459063; + std::int32_t get_id() const final { + return ID; + } + + using ReturnType = object_ptr; + + void store(td::TlStorerToString &s, const char *field_name) const final; +}; + class wallet_getAccountAddress final : public Function { public: object_ptr initital_account_state_; diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.hpp b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.hpp index 6fcd2e321b..920df0e9eb 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.hpp +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api.hpp @@ -65,6 +65,9 @@ bool downcast_call(Object &obj, const T &func) { case sendGramsResult::ID: func(static_cast(obj)); return true; + case unpackedAccountAddress::ID: + func(static_cast(obj)); + return true; case updateSendLiteServerQuery::ID: func(static_cast(obj)); return true; @@ -199,6 +202,9 @@ bool downcast_call(Function &obj, const T &func) { case options_setConfig::ID: func(static_cast(obj)); return true; + case packAccountAddress::ID: + func(static_cast(obj)); + return true; case raw_getAccountAddress::ID: func(static_cast(obj)); return true; @@ -244,6 +250,9 @@ bool downcast_call(Function &obj, const T &func) { case testWallet_sendGrams::ID: func(static_cast(obj)); return true; + case unpackAccountAddress::ID: + func(static_cast(obj)); + return true; case wallet_getAccountAddress::ID: func(static_cast(obj)); return true; diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.cpp b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.cpp index a3748d7db0..29ee340f62 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.cpp +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.cpp @@ -59,6 +59,7 @@ Result tl_constructor_from_string(tonlib_api::Object *object, const std:: {"ok", -722616727}, {"options", 789823302}, {"sendGramsResult", -858318471}, + {"unpackedAccountAddress", 1892946998}, {"updateSendLiteServerQuery", -1555130916}, {"generic.accountStateRaw", -1387096685}, {"generic.accountStateTestWallet", -1041955397}, @@ -108,6 +109,7 @@ Result tl_constructor_from_string(tonlib_api::Function *object, const std {"onLiteServerQueryError", -677427533}, {"onLiteServerQueryResult", 2056444510}, {"options.setConfig", 646497241}, + {"packAccountAddress", -1388561940}, {"raw.getAccountAddress", -521283849}, {"raw.getAccountState", 663706721}, {"raw.getTransactions", 935377269}, @@ -123,6 +125,7 @@ Result tl_constructor_from_string(tonlib_api::Function *object, const std {"testWallet.getAccountState", 654082364}, {"testWallet.init", 419055225}, {"testWallet.sendGrams", 1290131585}, + {"unpackAccountAddress", -682459063}, {"wallet.getAccountAddress", -1004103180}, {"wallet.getAccountState", 462294850}, {"wallet.init", 1528056782}, @@ -317,6 +320,33 @@ Status from_json(tonlib_api::sendGramsResult &to, JsonObject &from) { } return Status::OK(); } +Status from_json(tonlib_api::unpackedAccountAddress &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "workchain_id", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.workchain_id_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "bounceable", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.bounceable_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "testnet", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.testnet_, value)); + } + } + { + TRY_RESULT(value, get_json_object_field(from, "addr", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json_bytes(to.addr_, value)); + } + } + return Status::OK(); +} Status from_json(tonlib_api::updateSendLiteServerQuery &to, JsonObject &from) { { TRY_RESULT(value, get_json_object_field(from, "id", JsonValue::Type::Null, true)); @@ -935,6 +965,15 @@ Status from_json(tonlib_api::options_setConfig &to, JsonObject &from) { } return Status::OK(); } +Status from_json(tonlib_api::packAccountAddress &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "account_address", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.account_address_, value)); + } + } + return Status::OK(); +} Status from_json(tonlib_api::raw_getAccountAddress &to, JsonObject &from) { { TRY_RESULT(value, get_json_object_field(from, "initital_account_state", JsonValue::Type::Null, true)); @@ -1124,6 +1163,15 @@ Status from_json(tonlib_api::testWallet_sendGrams &to, JsonObject &from) { } return Status::OK(); } +Status from_json(tonlib_api::unpackAccountAddress &to, JsonObject &from) { + { + TRY_RESULT(value, get_json_object_field(from, "account_address", JsonValue::Type::Null, true)); + if (value.type() != JsonValue::Type::Null) { + TRY_STATUS(from_json(to.account_address_, value)); + } + } + return Status::OK(); +} Status from_json(tonlib_api::wallet_getAccountAddress &to, JsonObject &from) { { TRY_RESULT(value, get_json_object_field(from, "initital_account_state", JsonValue::Type::Null, true)); @@ -1287,6 +1335,14 @@ void to_json(JsonValueScope &jv, const tonlib_api::sendGramsResult &object) { jo << ctie("@type", "sendGramsResult"); jo << ctie("sent_until", ToJson(object.sent_until_)); } +void to_json(JsonValueScope &jv, const tonlib_api::unpackedAccountAddress &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "unpackedAccountAddress"); + jo << ctie("workchain_id", ToJson(object.workchain_id_)); + jo << ctie("bounceable", ToJson(object.bounceable_)); + jo << ctie("testnet", ToJson(object.testnet_)); + jo << ctie("addr", ToJson(JsonBytes{object.addr_})); +} void to_json(JsonValueScope &jv, const tonlib_api::updateSendLiteServerQuery &object) { auto jo = jv.enter_object(); jo << ctie("@type", "updateSendLiteServerQuery"); @@ -1589,6 +1645,13 @@ void to_json(JsonValueScope &jv, const tonlib_api::options_setConfig &object) { jo << ctie("config", ToJson(object.config_)); } } +void to_json(JsonValueScope &jv, const tonlib_api::packAccountAddress &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "packAccountAddress"); + if (object.account_address_) { + jo << ctie("account_address", ToJson(object.account_address_)); + } +} void to_json(JsonValueScope &jv, const tonlib_api::raw_getAccountAddress &object) { auto jo = jv.enter_object(); jo << ctie("@type", "raw.getAccountAddress"); @@ -1697,6 +1760,11 @@ void to_json(JsonValueScope &jv, const tonlib_api::testWallet_sendGrams &object) jo << ctie("amount", ToJson(JsonInt64{object.amount_})); jo << ctie("message", ToJson(JsonBytes{object.message_})); } +void to_json(JsonValueScope &jv, const tonlib_api::unpackAccountAddress &object) { + auto jo = jv.enter_object(); + jo << ctie("@type", "unpackAccountAddress"); + jo << ctie("account_address", ToJson(object.account_address_)); +} void to_json(JsonValueScope &jv, const tonlib_api::wallet_getAccountAddress &object) { auto jo = jv.enter_object(); jo << ctie("@type", "wallet.getAccountAddress"); diff --git a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.h b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.h index ebccc0aa13..ebe3a9cfd7 100644 --- a/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.h +++ b/submodules/ton/tonlib-src/tl/generate/auto/tl/tonlib_api_json.h @@ -32,6 +32,7 @@ Status from_json(tonlib_api::logVerbosityLevel &to, JsonObject &from); Status from_json(tonlib_api::ok &to, JsonObject &from); Status from_json(tonlib_api::options &to, JsonObject &from); Status from_json(tonlib_api::sendGramsResult &to, JsonObject &from); +Status from_json(tonlib_api::unpackedAccountAddress &to, JsonObject &from); Status from_json(tonlib_api::updateSendLiteServerQuery &to, JsonObject &from); Status from_json(tonlib_api::generic_accountStateRaw &to, JsonObject &from); Status from_json(tonlib_api::generic_accountStateTestWallet &to, JsonObject &from); @@ -72,6 +73,7 @@ Status from_json(tonlib_api::init &to, JsonObject &from); Status from_json(tonlib_api::onLiteServerQueryError &to, JsonObject &from); Status from_json(tonlib_api::onLiteServerQueryResult &to, JsonObject &from); Status from_json(tonlib_api::options_setConfig &to, JsonObject &from); +Status from_json(tonlib_api::packAccountAddress &to, JsonObject &from); Status from_json(tonlib_api::raw_getAccountAddress &to, JsonObject &from); Status from_json(tonlib_api::raw_getAccountState &to, JsonObject &from); Status from_json(tonlib_api::raw_getTransactions &to, JsonObject &from); @@ -87,6 +89,7 @@ Status from_json(tonlib_api::testWallet_getAccountAddress &to, JsonObject &from) Status from_json(tonlib_api::testWallet_getAccountState &to, JsonObject &from); Status from_json(tonlib_api::testWallet_init &to, JsonObject &from); Status from_json(tonlib_api::testWallet_sendGrams &to, JsonObject &from); +Status from_json(tonlib_api::unpackAccountAddress &to, JsonObject &from); Status from_json(tonlib_api::wallet_getAccountAddress &to, JsonObject &from); Status from_json(tonlib_api::wallet_getAccountState &to, JsonObject &from); Status from_json(tonlib_api::wallet_init &to, JsonObject &from); @@ -109,6 +112,7 @@ void to_json(JsonValueScope &jv, const tonlib_api::logVerbosityLevel &object); void to_json(JsonValueScope &jv, const tonlib_api::ok &object); void to_json(JsonValueScope &jv, const tonlib_api::options &object); void to_json(JsonValueScope &jv, const tonlib_api::sendGramsResult &object); +void to_json(JsonValueScope &jv, const tonlib_api::unpackedAccountAddress &object); void to_json(JsonValueScope &jv, const tonlib_api::updateSendLiteServerQuery &object); void to_json(JsonValueScope &jv, const tonlib_api::generic_AccountState &object); void to_json(JsonValueScope &jv, const tonlib_api::generic_accountStateRaw &object); @@ -150,6 +154,7 @@ void to_json(JsonValueScope &jv, const tonlib_api::init &object); void to_json(JsonValueScope &jv, const tonlib_api::onLiteServerQueryError &object); void to_json(JsonValueScope &jv, const tonlib_api::onLiteServerQueryResult &object); void to_json(JsonValueScope &jv, const tonlib_api::options_setConfig &object); +void to_json(JsonValueScope &jv, const tonlib_api::packAccountAddress &object); void to_json(JsonValueScope &jv, const tonlib_api::raw_getAccountAddress &object); void to_json(JsonValueScope &jv, const tonlib_api::raw_getAccountState &object); void to_json(JsonValueScope &jv, const tonlib_api::raw_getTransactions &object); @@ -165,6 +170,7 @@ void to_json(JsonValueScope &jv, const tonlib_api::testWallet_getAccountAddress void to_json(JsonValueScope &jv, const tonlib_api::testWallet_getAccountState &object); void to_json(JsonValueScope &jv, const tonlib_api::testWallet_init &object); void to_json(JsonValueScope &jv, const tonlib_api::testWallet_sendGrams &object); +void to_json(JsonValueScope &jv, const tonlib_api::unpackAccountAddress &object); void to_json(JsonValueScope &jv, const tonlib_api::wallet_getAccountAddress &object); void to_json(JsonValueScope &jv, const tonlib_api::wallet_getAccountState &object); void to_json(JsonValueScope &jv, const tonlib_api::wallet_init &object); diff --git a/submodules/ton/tonlib-src/tl/generate/scheme/tonlib_api.tl b/submodules/ton/tonlib-src/tl/generate/scheme/tonlib_api.tl index a3d33b9dd2..07a2f32c14 100644 --- a/submodules/ton/tonlib-src/tl/generate/scheme/tonlib_api.tl +++ b/submodules/ton/tonlib-src/tl/generate/scheme/tonlib_api.tl @@ -29,6 +29,8 @@ bip39Hints words:vector = Bip39Hints; accountAddress account_address:string = AccountAddress; +unpackedAccountAddress workchain_id:int32 bounceable:Bool testnet:Bool addr:bytes = UnpackedAccountAddress; + internal.transactionId lt:int64 hash:bytes = internal.TransactionId; raw.initialAccountState code:bytes data:bytes = raw.InitialAccountState; @@ -96,6 +98,9 @@ importPemKey local_password:secureBytes key_password:secureBytes exported_key:ex importEncryptedKey local_password:secureBytes key_password:secureBytes exported_encrypted_key:exportedEncryptedKey = Key; changeLocalPassword input_key:inputKey new_local_password:secureBytes = Key; +unpackAccountAddress account_address:string = UnpackedAccountAddress; +packAccountAddress account_address:unpackedAccountAddress = AccountAddress; + getBip39Hints prefix:string = Bip39Hints; //raw.init initial_account_state:raw.initialAccountState = Ok; diff --git a/submodules/ton/tonlib-src/tl/generate/scheme/tonlib_api.tlo b/submodules/ton/tonlib-src/tl/generate/scheme/tonlib_api.tlo index 7909f15e648b9a8748eb241f8b7b894e355d6298..b77565e03e200204e3f53b0210c4bd17840045c8 100644 GIT binary patch delta 247 zcmZpPyO7BHXtur;0~Ba&RHD#iu`X-huOpN-Qud*HIumsDM zLggHjlk-dSN*q&Cic*V<89;J3j|us(08NvAc3+dHJijPAIU_MMFFrG6axAAbH&+r+ zeR67IQcmh*dj%=>lGNgoywsA(4hj;iEQvs4CT|pxX91bBc>@0iZbt3Rj?&p&TyHFG z)(U}~<2d;dn;BSsvVyL{<~6Dc>{vGOR$STj6I;^!UO;> CIa0^~ delta 56 zcmcbR*b>M4Xtur;0~Ba(?o7XwOK%2fqnA~ HJqsoP(JT+= diff --git a/submodules/ton/tonlib-src/tonlib/test/offline.cpp b/submodules/ton/tonlib-src/tonlib/test/offline.cpp index 5a67b42183..63a52fae39 100644 --- a/submodules/ton/tonlib-src/tonlib/test/offline.cpp +++ b/submodules/ton/tonlib-src/tonlib/test/offline.cpp @@ -384,6 +384,26 @@ TEST(Tonlib, Keys) { CHECK(decrypted_key.private_key.as_octet_string() == other_decrypted_key.private_key.as_octet_string()); } +TEST(Tonlib, ParseAddres) { + using tonlib_api::make_object; + Client client; + + // init + sync_send(client, make_object(make_object(nullptr, "."))).ensure(); + + sync_send(client, make_object("hello")).ensure_error(); + auto addr = + sync_send(client, + make_object("Ef9Tj6fMJP-OqhAdhKXxq36DL-HYSzCc3-9O6UNzqsgPfYFX")) + .move_as_ok(); + ASSERT_EQ(-1, addr->workchain_id_); + ASSERT_EQ(true, addr->bounceable_); + ASSERT_EQ(false, addr->testnet_); + + auto addr_str = sync_send(client, make_object(std::move(addr))).move_as_ok(); + ASSERT_EQ("Ef9Tj6fMJP-OqhAdhKXxq36DL-HYSzCc3-9O6UNzqsgPfYFX", addr_str->account_address_); +} + TEST(Tonlib, KeysApi) { using tonlib_api::make_object; Client client; diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/.TonlibClient.cpp.swp b/submodules/ton/tonlib-src/tonlib/tonlib/.TonlibClient.cpp.swp new file mode 100644 index 0000000000000000000000000000000000000000..a3dd3f30b99a9cce56d2bc84b63efbe45bd6a75c GIT binary patch literal 90112 zcmeI537lM2mH%7ZKtw^s1($h5jn&ZUEXZOJT9c53nAPqM3bKnG+%@!CJ8H>H&;9<=(^ITB!s^Tk%jDK< zpH=!?W69=XX?3l(bIG=Pt-n$$6)UNiE_MknE!9TDrOjGZP$`eNuVMXbO{E-GoBgG! zsnq-3Kf4s@QeZzRFx?zma>@}sC#+bm_{RgD(zbJM8f%g7-`~CIQ{Ri3WTkQ8g+{65E=^t&cpJl%%Q}^wk zJ;&PnpGw`or@g+^e*Y+S|6ca`>Gu0b`-02=-uC)x`#qexf2h6g+UJ$2`?k7054O+! zFm>Nv?tXPC(4|0^0$mDpDbS@rmjYc1bScoKK$ikt3LGQ~6i0h{M92Gv{D%@;v-$i9 zh56sW=fNJ31K&r<{s_1h>;yURBNX%Zg7<*)!F|Eu;5#Vvw}2bL4dC@)57-V)1`h{! zU{v@X_#}8IxD;FhM!`DpIB;L^8;lFT2Hyg=fRBUMf!Bg(fb&5CYyum>Dd0Zf5b$3Z z9=-zhff=wH>;fCXlfkc0TrUSN1up@Q1c!isN8x=fD1+7D;ot~xIQTD=<*$Ql!4+T+ zm;k8Nlfa4KPbka30~dki;0A0F zuLds%mxJelonQ!@26Es?@J-rK+fmyv2%4k$JiZu{ZaOw86S}0@?;oPntI(9VyHQ~YIL+7HX1?Ee9PUbdU;o|8RmP) zYaa+)KK+fbSulC#!aeS1p&pL)O1b2dj}po?q}G$QU183q-P_wI`Fl4iO}VC}^{&d_ za^2CwyJau+_6B=<5RlY7rM-wAQ>*9mtKE!{&6o8VnDfT{v@d zu30OL6f4DQDJ<0Lh2})Pw%a41yCrSbOREX72E)d5rMXgm(%nva`~c;5Y2?fUV=H$} z=JRX9N@a-hh6910PO2PqC+Q8Q=h(7IDnrd;bGnhwudUZ>_1vO$#d0MaC97b%I#n#~ zbV&xe6}^kJKb6OV9Ek;|ou*aSvgIybwtds4VCBl-q!Vl}C{B}xKIf8HGC&0?wd#0I z)7jsW#HFyc?JqY9)#*wl=jUwi1*f?V(X5Q*^UcEgdU3MRUu+a8cQ_u_3yq!Sshp!* zL&&J5OAyx8prH3j^Emec4K{ac#Vy`xvq?+Yj=ZX*Y(|pEbS7>(sV0@zvjug7Iq1SH@tLO9u3ML1`(E z!6Is78IS4p__4-Bu|8U8_po<2{mMvXC#mZQFV#beR8aaA%A+}39!Z&};uq(9r95gL z&S(kg*+Qyfvs}t*slXPZXj-qJ)PM=VfSQ#;ZRCQm)GSOj>nrtArA&E?Q{{YKehr27 zU35(Q>X6WPAdpH3d-Yp^cX19hFHRPB!dWz3Ni(`0%CH`Q)yOFCm$uKr!|k7wOfkiA zuF#5gh7VoYdo@|gREjo<0z*1}Cs(Rf8%^z(Qtau*V*8ku{L!P~Sh*THjyTpEH0v{k zvD}Wu=LLHmyBs?;*w<@nIR}H-HneHOnzgxJ;W~@f*P1~w*fq&?PztAH`pyT7T%_OpJpr@x=gy1mMQ2HtKl;(VNxmv1BkA}gb=IGMt zX1UT>I#sJTmrfO%6a5p5vhFv-MzbOJvTic5*DJN+XgJ#D?ZIMov^JS~eb?mDky
HZVV=2U*^(%rjv_m5Yn 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 literal 12288 zcmeHNON`{i87@|^yaQtI=x30Sd(z{cS)TF0N~#8+kaa|U*S(@M7VwbxaD{g3be z>o1Sio#j_rTl9jv!f-vx*y9&|^V+Zfo3np@#u(3(NQX}^o2l=*npRFNZSi1D%EP7I zOuC5-crv%>&5^=JAVbm6GBrrz&ggbUq#}!hW)R3c)ow5t%xS0|D+VeCeh>q>j+S0{ zm_2=Q#qQ@P7oMOCj~)CVRn?-3fr^2Ofr^2Ofr^2Ofr^2Ofr^1UlL0-ri@gQc&z0`) zl=r*l?&V{3s~D&ls2Hdis2Hdis2Hdis2Hdis2Hdis2HdixC0sBA!C2XAO9EbhV%IU z|Iy$7Uq8awzkz=NHvk9t;wOy#4frc?2sprh9%k$V;CU8T$zM6Yw@5fK}kjd$1PxGw@5`W#AIv0Y3%) z0FFKY-Ur?R+Q2H{0d-&zFg!j6R9D5o9m>E7QKLaA?+Z2HfuQ0W9d^QqGNJP<#Z9d; zJg#5eSpS8CCpVSaPxB;kYPD5N=%nL$dN>e1G#vVYzzoFd)WLT_ho09JDdznxp%m{5 zznKo}1as!0SRZ=co`_yN>U-Wg7GD~hG+xk1*6qk}NH5VyY%PzIP-ITcRa$1ke?w$a zC}*YS^1(o)p>;$haUdMCB$2!r^6i+PiO4Y;YmiqHSvzjsYAlkqxY(eZ@T2gh_#Kf^ zM&ZV3tmj#o_T0?hp66$J0^=kSC9EGt?-|#(1aXF>8M-ZsoKzh9N^>o0HTErvplXi& zTT05*W~r2$rtmC^N-@;v&vT`nO%dr+e#H?@#-{UN2}2$&|1){CH5;hRmaH>zB9e7T zM-mlaEsyeT#@x6+keT))A>e7y`3}m<$}e_?e*r^KP zl>f3Lg_%<1SZ0SokH@JWhf{Ln;Td6`4g;=!T&>eg-`G;!X5l0VGJPVDS?C*YQJSHR zV$6yOkj8w>rr7eJvS79=O|);^nA4u3PH&#rPGBj=TIjY3nC@%qvfq~}^t4bRWBf#njTT;f&#-e#FU7S|4RrJG=f>F;Kk!#ZaJuXvHvmMoTI&6p2GqayzdR~wT z?0DZqP;Lt+kST~Q-QCw=nUJSOMN`!9tif^bs863Ir*t^uIzoAwtrzQ}Y>4RVy&DS%w)L$haG${8i>UPl52#W^uQt>EiOr z^Go>o8MQ?sx@f_)KU7-u6>V?dt@g%dPhI#{NEC-r1uj?Kbz?t@VS=<{s@H?CtLCZy?rv#0clChEA^OTC06^ z=b%l^?dx={xwi*}*HCTQJe_F>40b2xOg_}E^92ZZvgl{9l!tp diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/LastBlock.cpp b/submodules/ton/tonlib-src/tonlib/tonlib/LastBlock.cpp index e8f8caab82..7c4cda5dd3 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/LastBlock.cpp +++ b/submodules/ton/tonlib-src/tonlib/tonlib/LastBlock.cpp @@ -134,7 +134,7 @@ td::Result> LastBlock::process_block_pro if (is_changed) { callback_->on_state_changed(state_); } - return chain; + return std::move(chain); } void LastBlock::on_block_proof( diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.cpp b/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.cpp index df43fdd4f3..d0a9cba7d9 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.cpp +++ b/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.cpp @@ -425,6 +425,8 @@ bool TonlibClient::is_static_request(td::int32 id) { case tonlib_api::testWallet_getAccountAddress::ID: case tonlib_api::wallet_getAccountAddress::ID: case tonlib_api::testGiver_getAccountAddress::ID: + case tonlib_api::packAccountAddress::ID: + case tonlib_api::unpackAccountAddress::ID: case tonlib_api::getBip39Hints::ID: case tonlib_api::setLogStream::ID: case tonlib_api::getLogStream::ID: @@ -504,6 +506,34 @@ tonlib_api::object_ptr TonlibClient::do_static_request( return tonlib_api::make_object(TestGiver::address().rserialize(true)); } +tonlib_api::object_ptr TonlibClient::do_static_request( + const tonlib_api::unpackAccountAddress& request) { + auto r_account_address = block::StdAddress::parse(request.account_address_); + if (r_account_address.is_error()) { + return status_to_tonlib_api(r_account_address.move_as_error()); + } + auto account_address = r_account_address.move_as_ok(); + return tonlib_api::make_object( + account_address.workchain, account_address.bounceable, account_address.testnet, + account_address.addr.as_slice().str()); +} + +tonlib_api::object_ptr TonlibClient::do_static_request( + const tonlib_api::packAccountAddress& request) { + if (!request.account_address_) { + return status_to_tonlib_api(td::Status::Error(400, "Field account_address must not be empty")); + } + if (request.account_address_->addr_.size() != 32) { + return status_to_tonlib_api(td::Status::Error(400, "Field account_address.addr must not be exactly 32 bytes")); + } + block::StdAddress addr; + addr.workchain = request.account_address_->workchain_id_; + addr.bounceable = request.account_address_->bounceable_; + addr.testnet = request.account_address_->testnet_; + addr.addr.as_slice().copy_from(request.account_address_->addr_); + return tonlib_api::make_object(addr.rserialize(true)); +} + tonlib_api::object_ptr TonlibClient::do_static_request(tonlib_api::getBip39Hints& request) { return tonlib_api::make_object( td::transform(Mnemonic::word_hints(td::trim(td::to_lower_inplace(request.prefix_))), [](auto& x) { return x; })); @@ -925,7 +955,7 @@ td::Status TonlibClient::do_request(const tonlib_api::testWallet_sendGrams& requ if (!request.private_key_) { return td::Status::Error(400, "Field private_key must not be empty"); } - if (request.message_.size() > 124) { + if (request.message_.size() > 70) { return td::Status::Error(400, "Message is too long"); } TRY_RESULT(account_address, block::StdAddress::parse(request.destination_->account_address_)); @@ -1003,7 +1033,7 @@ td::Status TonlibClient::do_request(const tonlib_api::wallet_sendGrams& request, if (!request.private_key_) { return td::Status::Error(400, "Field private_key must not be empty"); } - if (request.message_.size() > 124) { + if (request.message_.size() > 70) { return td::Status::Error(400, "Message is too long"); } TRY_RESULT(valid_until, td::narrow_cast_safe(request.valid_until_)); @@ -1062,7 +1092,7 @@ td::Status TonlibClient::do_request(const tonlib_api::testGiver_sendGrams& reque if (!request.destination_) { return td::Status::Error(400, "Field destination must not be empty"); } - if (request.message_.size() > 124) { + if (request.message_.size() > 70) { return td::Status::Error(400, "Message is too long"); } TRY_RESULT(account_address, block::StdAddress::parse(request.destination_->account_address_)); @@ -1219,12 +1249,16 @@ class GenericSendGrams : public TonlibQueryActor { auto key = td::Ed25519::PublicKey(td::SecureString(key_bytes.key)); if (GenericAccount::get_address(0 /*zerochain*/, TestWallet::get_init_state(key)).addr == source_address_.addr) { + auto state = ton::move_tl_object_as(source_state_); source_state_ = tonlib_api::make_object( - tonlib_api::make_object(-1, 0, nullptr, 0)); + tonlib_api::make_object(-1, 0, nullptr, + state->account_state_->sync_utime_)); } else if (GenericAccount::get_address(0 /*zerochain*/, Wallet::get_init_state(key)).addr == source_address_.addr) { + auto state = ton::move_tl_object_as(source_state_); source_state_ = tonlib_api::make_object( - tonlib_api::make_object(-1, 0, nullptr, 0)); + tonlib_api::make_object(-1, 0, nullptr, + state->account_state_->sync_utime_)); } } return do_loop(); diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.h b/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.h index 0130e8254e..9e7ecdafea 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.h +++ b/submodules/ton/tonlib-src/tonlib/tonlib/TonlibClient.h @@ -101,6 +101,8 @@ class TonlibClient : public td::actor::Actor { static object_ptr do_static_request(const tonlib_api::testWallet_getAccountAddress& request); static object_ptr do_static_request(const tonlib_api::wallet_getAccountAddress& request); static object_ptr do_static_request(const tonlib_api::testGiver_getAccountAddress& request); + static object_ptr do_static_request(const tonlib_api::packAccountAddress& request); + static object_ptr do_static_request(const tonlib_api::unpackAccountAddress& request); static object_ptr do_static_request(tonlib_api::getBip39Hints& request); static object_ptr do_static_request(tonlib_api::setLogStream& request); diff --git a/submodules/ton/tonlib-src/tonlib/tonlib/tonlib-cli.cpp b/submodules/ton/tonlib-src/tonlib/tonlib/tonlib-cli.cpp index 55a1023de1..ce8d5f481f 100644 --- a/submodules/ton/tonlib-src/tonlib/tonlib/tonlib-cli.cpp +++ b/submodules/ton/tonlib-src/tonlib/tonlib/tonlib-cli.cpp @@ -182,6 +182,7 @@ class TonlibCli : public td::actor::Actor { td::TerminalIO::out() << "help - show this help\n"; td::TerminalIO::out() << "genkey - generate new secret key\n"; td::TerminalIO::out() << "keys - show all stored keys\n"; + td::TerminalIO::out() << "unpackaddress
- validate and parse address\n"; td::TerminalIO::out() << "importkey - import key\n"; td::TerminalIO::out() << "exportkey [] - export key\n"; td::TerminalIO::out() << "setconfig [] [] [] - set lite server config\n"; @@ -237,6 +238,8 @@ class TonlibCli : public td::actor::Actor { transfer(from, to, grams, message, cmd == "transferf"); } else if (cmd == "hint") { get_hints(parser.read_word()); + } else if (cmd == "unpackaddress") { + unpack_address(parser.read_word()); } } @@ -300,6 +303,17 @@ class TonlibCli : public td::actor::Actor { }; } + void unpack_address(td::Slice addr) { + send_query(tonlib_api::make_object(addr.str()), + [addr = addr.str()](auto r_parsed_addr) mutable { + if (r_parsed_addr.is_error()) { + LOG(ERROR) << "Failed to parse address: " << r_parsed_addr.error(); + return; + } + LOG(ERROR) << to_string(r_parsed_addr.ok()); + }); + } + void generate_key(td::SecureString entropy = {}) { if (entropy.size() < 20) { td::TerminalIO::out() << "Enter some entropy"; @@ -324,6 +338,7 @@ class TonlibCli : public td::actor::Actor { [this, password = std::move(password)](auto r_key) mutable { if (r_key.is_error()) { LOG(ERROR) << "Failed to create new key: " << r_key.error(); + return; } auto key = r_key.move_as_ok(); LOG(ERROR) << to_string(key); @@ -368,6 +383,7 @@ class TonlibCli : public td::actor::Actor { auto r_secret = td::base64_decode_secure(secret_b64); if (r_secret.is_error()) { LOG(ERROR) << "Invalid secret database at " << key_db_path(); + return; } KeyInfo info;