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|);^nA4u3PHrPGBj=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;