Skip to content

Commit 045f2bb

Browse files
committed
Add jetton burn test
1 parent d567325 commit 045f2bb

File tree

2 files changed

+50
-14
lines changed

2 files changed

+50
-14
lines changed

tondb-scanner/src/InterfaceDetectors.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ class InterfaceDetector: public td::actor::Actor {
125125
template <class T>
126126
class InterfaceStorage {
127127
public:
128+
InterfaceStorage() {};
129+
InterfaceStorage(std::unordered_map<std::string, T> cache) : cache_(cache) {};
128130
std::unordered_map<std::string, T> cache_{};
129131

130132
void check(block::StdAddress address, td::Promise<T> promise) {
@@ -351,6 +353,14 @@ class JettonWalletDetector: public InterfaceDetector<JettonWalletData> {
351353
: jetton_master_detector_(jetton_master_detector)
352354
, interface_manager_(interface_manager) {
353355
}
356+
JettonWalletDetector(td::actor::ActorId<JettonMasterDetector> jetton_master_detector,
357+
td::actor::ActorId<InterfaceManager> interface_manager,
358+
td::actor::ActorId<InsertManagerInterface> insert_manager,
359+
std::unordered_map<std::string, JettonWalletData> cache)
360+
: jetton_master_detector_(jetton_master_detector)
361+
, interface_manager_(interface_manager)
362+
, storage_(cache) {
363+
}
354364

355365
void detect(block::StdAddress address, td::Ref<vm::Cell> code_cell, td::Ref<vm::Cell> data_cell, uint64_t last_tx_lt, uint32_t last_tx_now, const MasterchainBlockDataState& blocks_ds, td::Promise<JettonWalletData> promise) override {
356366
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this), address, code_cell, data_cell, last_tx_lt, last_tx_now, blocks_ds, promise = std::move(promise)](td::Result<bool> code_hash_is_wallet) mutable {

tondb-scanner/test/tests.cpp

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include "vm/cells/Cell.h"
1515
#include "convert-utils.h"
1616
#include "InterfaceDetectors.hpp"
17-
17+
#include "IndexData.h"
1818

1919

2020
TEST(convert, to_raw_address) {
@@ -50,27 +50,53 @@ TEST(convert, to_std_address_with_anycast) {
5050
ASSERT_EQ(block::StdAddress(0, addr), std_address_serialized.move_as_ok());
5151
}
5252

53-
TEST(TonDbScanner, JettonWalletDetector) {
53+
TEST(TonDbScanner, ParseBurnWithCustomPayload) {
5454
td::actor::Scheduler scheduler({1});
5555
auto watcher = td::create_shared_destructor([] { td::actor::SchedulerContext::get()->stop(); });
5656

5757
block::StdAddress addr(std::string("EQDKC7jQ_tIJuYyrWfI4FIAN-hFHakG3GrATpOiqBVtsGOd5"));
58-
auto code_cell = vm::std_boc_deserialize(td::base64_decode(td::Slice("te6cckECEgEAAzEAART/APSkE/S88sgLAQIBYgIDAgLLBAUAG6D2BdqJofQB9IH0gahhAgEgBgcCAWILDAIBSAgJAfH4Hpn/0AfSAQ+AH2omh9AH0gfSBqGCibUKkVY4L5cWCUYX/5cWEqGiE4KhAJqgoB5CgCfQEsZ4sA54tmZJFkZYCJegB6AGWAZJB8gDg6ZGWBZQPl/+ToAn0gegIY/QAQa6ThAHlxYjvADGRlgqgEZ4s4fQEL5bWJ5kCgC3QgxwCSXwTgAdDTAwFxsJUTXwPwEuD6QPpAMfoAMXHXIfoAMfoAMALTHyGCEA+KfqW6lTE0WfAP4CGCEBeNRRm6ljFERAPwEOA1ghBZXwe8upNZ8BHgXwSED/LwgAEV+kQwcLry4U2ACughAXjUUZyMsfGcs/UAf6AiLPFlAGzxYl+gJQA88WyVAFzCORcpFx4lAIqBOgggiYloCqAIIImJaAoKAUvPLixQTJgED7ABAjyFAE+gJYzxYBzxbMye1UAgEgDQ4AgUgCDXIe1E0PoA+kD6QNQwBNMfIYIQF41FGboCghB73ZfeuhKx8uLF0z8x+gAwE6BQI8hQBPoCWM8WAc8WzMntVIA/c7UTQ+gD6QPpA1DAI0z/6AFFRoAX6QPpAU1vHBVRzbXBUIBNUFAPIUAT6AljPFgHPFszJIsjLARL0APQAywDJ+QBwdMjLAsoHy//J0FANxwUcsfLiwwr6AFGooYIImJaAggiYloAStgihggiYloCgGKEn4w8l1wsBwwAjgDxARAOM7UTQ+gD6QPpA1DAH0z/6APpA9AQwUWKhUkrHBfLiwSjC//LiwoIImJaAqgAXoBe88uLDghB73ZfeyMsfyz9QBfoCIc8WUAPPFvQAyXGAGMjLBSTPFnD6AstqzMmAQPsAQBPIUAT6AljPFgHPFszJ7VSAAcFJ5oBihghBzYtCcyMsfUjDLP1j6AlAHzxZQB88WyXGAEMjLBSTPFlAG+gIVy2oUzMlx+wAQJBAjAA4QSRA4N18EAHbCALCOIYIQ1TJ223CAEMjLBVAIzxZQBPoCFstqEssfEss/yXL7AJM1bCHiA8hQBPoCWM8WAc8WzMntVLp4DOo=")).move_as_ok()).move_as_ok();
59-
auto data_cell = vm::std_boc_deserialize(td::base64_decode(td::Slice("te6cckECEwEAA3sAAY0xKctoASFZDXpO6Q6ZgXHilrBvG9KSTVMUJk1CMXwYaoCc9JirAC61IQRl0/la95t27xhIpjxZt32vl1QQVF2UgTNuvD18YAEBFP8A9KQT9LzyyAsCAgFiAwQCAssFBgAboPYF2omh9AH0gfSBqGECASAHCAIBYgwNAgFICQoB8fgemf/QB9IBD4AfaiaH0AfSB9IGoYKJtQqRVjgvlxYJRhf/lxYSoaITgqEAmqCgHkKAJ9ASxniwDni2ZkkWRlgIl6AHoAZYBkkHyAODpkZYFlA+X/5OgCfSB6Ahj9ABBrpOEAeXFiO8AMZGWCqARnizh9AQvltYnmQLALdCDHAJJfBOAB0NMDAXGwlRNfA/AS4PpA+kAx+gAxcdch+gAx+gAwAtMfIYIQD4p+pbqVMTRZ8A/gIYIQF41FGbqWMUREA/AQ4DWCEFlfB7y6k1nwEeBfBIQP8vCAARX6RDBwuvLhTYAK6CEBeNRRnIyx8Zyz9QB/oCIs8WUAbPFiX6AlADzxbJUAXMI5FykXHiUAioE6CCCJiWgKoAggiYloCgoBS88uLFBMmAQPsAECPIUAT6AljPFgHPFszJ7VQCASAODwCBSAINch7UTQ+gD6QPpA1DAE0x8hghAXjUUZugKCEHvdl966ErHy4sXTPzH6ADAToFAjyFAE+gJYzxYBzxbMye1UgD9ztRND6APpA+kDUMAjTP/oAUVGgBfpA+kBTW8cFVHNtcFQgE1QUA8hQBPoCWM8WAc8WzMkiyMsBEvQA9ADLAMn5AHB0yMsCygfL/8nQUA3HBRyx8uLDCvoAUaihggiYloCCCJiWgBK2CKGCCJiWgKAYoSfjDyXXCwHDACOAQERIA4ztRND6APpA+kDUMAfTP/oA+kD0BDBRYqFSSscF8uLBKML/8uLCggiYloCqABegF7zy4sOCEHvdl97Iyx/LP1AF+gIhzxZQA88W9ADJcYAYyMsFJM8WcPoCy2rMyYBA+wBAE8hQBPoCWM8WAc8WzMntVIABwUnmgGKGCEHNi0JzIyx9SMMs/WPoCUAfPFlAHzxbJcYAQyMsFJM8WUAb6AhXLahTMyXH7ABAkECMADhBJEDg3XwQAdsIAsI4hghDVMnbbcIAQyMsFUAjPFlAE+gIWy2oSyx8Syz/JcvsAkzVsIeIDyFAE+gJYzxYBzxbMye1U8/HTGA==")).move_as_ok()).move_as_ok();
60-
auto P = td::PromiseCreator::lambda([](td::Result<JettonWalletData> R) {
61-
CHECK(R.is_ok());
62-
LOG(INFO) << R.move_as_ok().jetton;
63-
});
58+
// message payload for tx xiOZW3mVbHkCtgLxQqXVAg4DIgxrTE3j9lHw6H3P/Yg=, correct layout
59+
auto message_payload = vm::load_cell_slice_ref(vm::std_boc_deserialize(td::base64_decode(
60+
td::Slice("te6cckEBAgEAOQABZllfB7xUbeTvz/ieq1AezMgZqAEPdvSWQKq0LY5UE5PZzQsh8ADqxh1H03XLREV/xoLz4QEAAaAxtO6I")).move_as_ok()).move_as_ok());
61+
62+
auto transaction = schema::Transaction();
63+
transaction.account = block::StdAddress(std::string("EQCk6s76oduqQH_3Y3O7fxjWVoUXtD3Ev6-NbHjjDmfG1drE")); // jetton wallet
64+
transaction.in_msg = std::make_optional(schema::Message());
65+
transaction.in_msg->source = "0:87BB7A4B20555A16C72A09C9ECE68590F80075630EA3E9BAE5A222BFE34179F0"; // owner
66+
67+
td::actor::ActorId<InsertManagerInterface> insert_manager;
68+
td::actor::ActorOwn<JettonWalletDetector> jetton_wallet_detector;
69+
td::actor::ActorOwn<InterfaceManager> interface_manager;
70+
td::actor::ActorOwn<JettonMasterDetector> jetton_master_detector;
71+
72+
// prepare jetton metadata
73+
std::unordered_map<std::string, JettonWalletData> cache;
74+
JettonWalletData jetton_master;
75+
jetton_master.jetton = "0:BDF3FA8098D129B54B4F73B5BAC5D1E1FD91EB054169C3916DFC8CCD536D1000";
76+
cache.emplace(std::string("0:A4EACEFAA1DBAA407FF76373BB7F18D6568517B43DC4BFAF8D6C78E30E67C6D5"), jetton_master);
77+
6478
scheduler.run_in_context([&] {
65-
td::actor::ActorId<InsertManagerInterface> insert_manager;
66-
// auto interface_manager = td::actor::create_actor<InterfaceManager>("interface_manager");
67-
// auto jetton_master_detector = td::actor::create_actor<JettonMasterDetector>("jetton_master_detector");
68-
// auto jetton_wallet_detector = td::actor::create_actor<JettonWalletDetector>("jetton_wallet_detector", jetton_master_detector.get(), interface_manager.get(), insert_manager);
69-
// td::actor::send_closure(jetton_wallet_detector, &JettonWalletDetector::detect, block::StdAddress(), code_cell, data_cell, 0, std::move(P));
79+
interface_manager = td::actor::create_actor<InterfaceManager>("interface_manager", insert_manager);
80+
jetton_master_detector = td::actor::create_actor<JettonMasterDetector>("jetton_master_detector", interface_manager.get(), insert_manager);
81+
82+
jetton_wallet_detector = td::actor::create_actor<JettonWalletDetector>("jetton_wallet_detector",
83+
jetton_master_detector.get(), interface_manager.get(), insert_manager, cache);
84+
85+
auto P = td::PromiseCreator::lambda([&transaction, &jetton_master](td::Result<JettonBurn> R) {
86+
CHECK(R.is_ok());
87+
auto burn = R.move_as_ok();
88+
ASSERT_EQ(transaction.in_msg->source.value(), burn.owner);
89+
ASSERT_EQ(convert::to_raw_address(transaction.account), burn.jetton_wallet);
90+
ASSERT_EQ(jetton_master.jetton, burn.jetton_master);
91+
ASSERT_EQ(6083770390284902059, burn.query_id);
92+
CHECK(td::BigIntG<257>(8267792794) == **burn.amount.get());
93+
});
94+
td::actor::send_closure(jetton_wallet_detector, &JettonWalletDetector::parse_burn, transaction, message_payload, std::move(P));
7095
watcher.reset();
7196
});
7297

73-
scheduler.run();
98+
scheduler.run(10);
99+
scheduler.stop();
74100

75101
}
76102

0 commit comments

Comments
 (0)