From 2ab98963232f22acaae13abc8461f2e8c38e6251 Mon Sep 17 00:00:00 2001 From: Maxnflaxl Date: Sun, 3 May 2026 01:50:15 +0200 Subject: [PATCH 1/2] feat: explorer modules --- beam/cli.cpp | 22 - bvm/Shaders/Explorer/.DS_Store | Bin 0 -> 6148 bytes bvm/Shaders/Explorer/Parser.cpp | 3507 ----------------- bvm/Shaders/Explorer/Parser.wasm | Bin 78411 -> 0 bytes bvm/Shaders/Explorer/modules/amm.parser.wasm | Bin 0 -> 10595 bytes bvm/Shaders/Explorer/modules/bans.parser.wasm | Bin 0 -> 4632 bytes .../Explorer/modules/blackhole.parser.wasm | Bin 0 -> 894 bytes .../modules/dao-accumulator.parser.wasm | Bin 0 -> 8718 bytes .../Explorer/modules/dao-core.parser.wasm | Bin 0 -> 2142 bytes .../Explorer/modules/dao-core2.parser.wasm | Bin 0 -> 2073 bytes .../Explorer/modules/dao-vault.parser.wasm | Bin 0 -> 2697 bytes .../Explorer/modules/dao-vote.parser.wasm | Bin 0 -> 2831 bytes .../Explorer/modules/faucet.parser.wasm | Bin 0 -> 1127 bytes .../Explorer/modules/faucet2.parser.wasm | Bin 0 -> 2030 bytes .../Explorer/modules/gallery.parser.wasm | Bin 0 -> 3246 bytes .../Explorer/modules/minter.parser.wasm | Bin 0 -> 6952 bytes .../Explorer/modules/nephrite.parser.wasm | Bin 0 -> 21291 bytes .../Explorer/modules/oracle2.parser.wasm | Bin 0 -> 11394 bytes bvm/Shaders/Explorer/modules/pbft.parser.wasm | Bin 0 -> 21895 bytes .../modules/sidechain_pos.parser.wasm | Bin 0 -> 5288 bytes .../Explorer/modules/vault.parser.wasm | Bin 0 -> 1084 bytes .../Explorer/modules/vault_anon.parser.wasm | Bin 0 -> 1105 bytes bvm/Shaders/Explorer/parser_common.h | 313 ++ bvm/Shaders/Explorer/parser_module_abi.h | 73 + bvm/Shaders/StableCoin/contract.wasm | Bin 5153 -> 5124 bytes bvm/Shaders/amm/app.wasm | Bin 38914 -> 39794 bytes bvm/Shaders/amm/contract.wasm | Bin 9923 -> 8936 bytes bvm/Shaders/amm/parser.cpp | 208 + bvm/Shaders/amm/parser.wasm | Bin 0 -> 10595 bytes bvm/Shaders/aphorize/contract.wasm | Bin 2505 -> 2852 bytes bvm/Shaders/asset_man/app.wasm | Bin 3877 -> 4487 bytes bvm/Shaders/asset_man/contract.wasm | Bin 336 -> 543 bytes bvm/Shaders/bans/app.wasm | Bin 34666 -> 36508 bytes bvm/Shaders/bans/contract.wasm | Bin 4806 -> 4943 bytes bvm/Shaders/bans/parser.cpp | 209 + bvm/Shaders/bans/parser.wasm | Bin 0 -> 4632 bytes bvm/Shaders/blackhole/app.wasm | Bin 3271 -> 3773 bytes bvm/Shaders/blackhole/contract.wasm | Bin 215 -> 422 bytes bvm/Shaders/blackhole/parser.cpp | 29 + bvm/Shaders/blackhole/parser.wasm | Bin 0 -> 894 bytes bvm/Shaders/dao-accumulator/app.wasm | Bin 29763 -> 29639 bytes bvm/Shaders/dao-accumulator/contract.wasm | Bin 7387 -> 6925 bytes bvm/Shaders/dao-accumulator/parser.cpp | 180 + bvm/Shaders/dao-accumulator/parser.wasm | Bin 0 -> 8718 bytes bvm/Shaders/dao-core-masternet/app-admin.wasm | Bin 17899 -> 19421 bytes bvm/Shaders/dao-core-masternet/app.wasm | Bin 22723 -> 24310 bytes bvm/Shaders/dao-core-masternet/contract.wasm | Bin 11319 -> 11445 bytes bvm/Shaders/dao-core-testnet/app-admin.wasm | Bin 17869 -> 19384 bytes bvm/Shaders/dao-core-testnet/app.wasm | Bin 22724 -> 24311 bytes bvm/Shaders/dao-core-testnet/contract.wasm | Bin 12297 -> 12423 bytes bvm/Shaders/dao-core/app-admin.wasm | Bin 17897 -> 19419 bytes bvm/Shaders/dao-core/app.wasm | Bin 22724 -> 24311 bytes bvm/Shaders/dao-core/contract.wasm | Bin 12297 -> 12423 bytes bvm/Shaders/dao-core/parser.cpp | 50 + bvm/Shaders/dao-core/parser.wasm | Bin 0 -> 2142 bytes bvm/Shaders/dao-core2/app.wasm | Bin 25232 -> 27020 bytes bvm/Shaders/dao-core2/contract.wasm | Bin 3870 -> 3981 bytes bvm/Shaders/dao-core2/parser.cpp | 37 + bvm/Shaders/dao-core2/parser.wasm | Bin 0 -> 2073 bytes bvm/Shaders/dao-vault/app.wasm | Bin 17153 -> 19357 bytes bvm/Shaders/dao-vault/contract.wasm | Bin 1571 -> 1740 bytes bvm/Shaders/dao-vault/parser.cpp | 55 + bvm/Shaders/dao-vault/parser.wasm | Bin 0 -> 2697 bytes bvm/Shaders/dao-vote/app.wasm | Bin 31311 -> 32783 bytes bvm/Shaders/dao-vote/contract.wasm | Bin 7640 -> 7645 bytes bvm/Shaders/dao-vote/parser.cpp | 110 + bvm/Shaders/dao-vote/parser.wasm | Bin 0 -> 2831 bytes bvm/Shaders/dummy/app.wasm | Bin 1930 -> 2175 bytes bvm/Shaders/dummy/contract.wasm | Bin 40128 -> 44354 bytes bvm/Shaders/faucet/app.wasm | Bin 6357 -> 6542 bytes bvm/Shaders/faucet/contract.wasm | Bin 807 -> 1015 bytes bvm/Shaders/faucet/parser.cpp | 38 + bvm/Shaders/faucet/parser.wasm | Bin 0 -> 1127 bytes bvm/Shaders/faucet2/app.wasm | Bin 6323 -> 6978 bytes bvm/Shaders/faucet2/contract.wasm | Bin 1152 -> 1356 bytes bvm/Shaders/faucet2/parser.cpp | 92 + bvm/Shaders/faucet2/parser.wasm | Bin 0 -> 2030 bytes bvm/Shaders/fuddle/contract.wasm | Bin 2660 -> 2853 bytes bvm/Shaders/gallery/app-admin.wasm | Bin 16582 -> 18351 bytes bvm/Shaders/gallery/app.wasm | Bin 20912 -> 21984 bytes bvm/Shaders/gallery/contract.wasm | Bin 4121 -> 4393 bytes bvm/Shaders/gallery/parser.cpp | 142 + bvm/Shaders/gallery/parser.wasm | Bin 0 -> 3246 bytes bvm/Shaders/make_all.sh | 113 + bvm/Shaders/make_shader.sh | 32 + bvm/Shaders/minter/app.wasm | Bin 7430 -> 7742 bytes bvm/Shaders/minter/contract.wasm | Bin 1473 -> 1659 bytes bvm/Shaders/minter/parser.cpp | 157 + bvm/Shaders/minter/parser.wasm | Bin 0 -> 6952 bytes bvm/Shaders/mirrorcoin/app.wasm | Bin 7869 -> 8092 bytes bvm/Shaders/mirrorcoin/contract.wasm | Bin 1613 -> 1812 bytes bvm/Shaders/nephrite/app.wasm | Bin 63360 -> 59344 bytes bvm/Shaders/nephrite/contract.wasm | Bin 32089 -> 28561 bytes bvm/Shaders/nephrite/parser.cpp | 324 ++ bvm/Shaders/nephrite/parser.wasm | Bin 0 -> 21291 bytes bvm/Shaders/oracle/contract.wasm | Bin 1734 -> 1879 bytes bvm/Shaders/oracle2/app.wasm | Bin 20625 -> 22587 bytes bvm/Shaders/oracle2/contract.wasm | Bin 4635 -> 4944 bytes bvm/Shaders/oracle2/parser.cpp | 190 + bvm/Shaders/oracle2/parser.wasm | Bin 0 -> 11394 bytes bvm/Shaders/pbft/parser.cpp | 390 ++ bvm/Shaders/pbft/parser.wasm | Bin 0 -> 21895 bytes bvm/Shaders/perpetual/app.wasm | Bin 3421 -> 3714 bytes bvm/Shaders/perpetual/contract.wasm | Bin 876 -> 1084 bytes bvm/Shaders/pipe/contract.wasm | Bin 12941 -> 12625 bytes bvm/Shaders/playground/app.wasm | Bin 2821 -> 3183 bytes bvm/Shaders/playground/contract.wasm | Bin 164 -> 371 bytes bvm/Shaders/profit_pool/app.wasm | Bin 19055 -> 21309 bytes bvm/Shaders/profit_pool/contract.wasm | Bin 5663 -> 5744 bytes bvm/Shaders/roulette/app.wasm | Bin 6805 -> 7044 bytes bvm/Shaders/roulette/contract.wasm | Bin 1749 -> 1954 bytes bvm/Shaders/sidechain/contract.wasm | Bin 7540 -> 9553 bytes bvm/Shaders/sidechain_pos/parser.cpp | 205 + bvm/Shaders/sidechain_pos/parser.wasm | Bin 0 -> 5288 bytes bvm/Shaders/upgradable/contract.wasm | Bin 1730 -> 1937 bytes bvm/Shaders/upgradable2/Test/test_app.wasm | Bin 15627 -> 17278 bytes bvm/Shaders/upgradable2/Test/test_v0.wasm | Bin 392 -> 598 bytes bvm/Shaders/upgradable2/Test/test_v1.wasm | Bin 539 -> 745 bytes bvm/Shaders/upgradable2/contract.wasm | Bin 2894 -> 3124 bytes bvm/Shaders/upgradable3/Test/test_app.wasm | Bin 14660 -> 16222 bytes bvm/Shaders/upgradable3/Test/test_v0.wasm | Bin 1312 -> 1480 bytes .../upgradable3/Test/test_v0_migrate.wasm | Bin 1366 -> 1594 bytes bvm/Shaders/upgradable3/Test/test_v1.wasm | Bin 1320 -> 1488 bytes bvm/Shaders/vault/app.wasm | Bin 10610 -> 10714 bytes bvm/Shaders/vault/contract.wasm | Bin 764 -> 972 bytes bvm/Shaders/vault/parser.cpp | 39 + bvm/Shaders/vault/parser.wasm | Bin 0 -> 1084 bytes bvm/Shaders/vault_anon/app.wasm | Bin 15969 -> 16987 bytes bvm/Shaders/vault_anon/contract.wasm | Bin 948 -> 1133 bytes bvm/Shaders/vault_anon/parser.cpp | 39 + bvm/Shaders/vault_anon/parser.wasm | Bin 0 -> 1105 bytes bvm/Shaders/voting/app.wasm | Bin 8101 -> 8498 bytes bvm/Shaders/voting/contract.wasm | Bin 1310 -> 1515 bytes explorer/explorer_node.cpp | 154 +- node/processor.cpp | 76 +- node/processor.h | 13 +- node/unittests/CMakeLists.txt | 1 - node/unittests/node_test.cpp | 1662 ++++---- utility/cli/options.cpp | 5 +- utility/cli/options.h | 3 +- 140 files changed, 4056 insertions(+), 4412 deletions(-) create mode 100644 bvm/Shaders/Explorer/.DS_Store delete mode 100644 bvm/Shaders/Explorer/Parser.cpp delete mode 100644 bvm/Shaders/Explorer/Parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/amm.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/bans.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/blackhole.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/dao-accumulator.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/dao-core.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/dao-core2.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/dao-vault.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/dao-vote.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/faucet.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/faucet2.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/gallery.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/minter.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/nephrite.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/oracle2.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/pbft.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/sidechain_pos.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/vault.parser.wasm create mode 100755 bvm/Shaders/Explorer/modules/vault_anon.parser.wasm create mode 100644 bvm/Shaders/Explorer/parser_common.h create mode 100644 bvm/Shaders/Explorer/parser_module_abi.h mode change 100644 => 100755 bvm/Shaders/StableCoin/contract.wasm mode change 100644 => 100755 bvm/Shaders/amm/app.wasm mode change 100644 => 100755 bvm/Shaders/amm/contract.wasm create mode 100644 bvm/Shaders/amm/parser.cpp create mode 100755 bvm/Shaders/amm/parser.wasm mode change 100644 => 100755 bvm/Shaders/aphorize/contract.wasm mode change 100644 => 100755 bvm/Shaders/asset_man/app.wasm mode change 100644 => 100755 bvm/Shaders/asset_man/contract.wasm mode change 100644 => 100755 bvm/Shaders/bans/app.wasm mode change 100644 => 100755 bvm/Shaders/bans/contract.wasm create mode 100644 bvm/Shaders/bans/parser.cpp create mode 100755 bvm/Shaders/bans/parser.wasm mode change 100644 => 100755 bvm/Shaders/blackhole/app.wasm mode change 100644 => 100755 bvm/Shaders/blackhole/contract.wasm create mode 100644 bvm/Shaders/blackhole/parser.cpp create mode 100755 bvm/Shaders/blackhole/parser.wasm mode change 100644 => 100755 bvm/Shaders/dao-accumulator/app.wasm mode change 100644 => 100755 bvm/Shaders/dao-accumulator/contract.wasm create mode 100644 bvm/Shaders/dao-accumulator/parser.cpp create mode 100755 bvm/Shaders/dao-accumulator/parser.wasm mode change 100644 => 100755 bvm/Shaders/dao-core-masternet/app-admin.wasm mode change 100644 => 100755 bvm/Shaders/dao-core-masternet/app.wasm mode change 100644 => 100755 bvm/Shaders/dao-core-masternet/contract.wasm mode change 100644 => 100755 bvm/Shaders/dao-core-testnet/app-admin.wasm mode change 100644 => 100755 bvm/Shaders/dao-core-testnet/app.wasm mode change 100644 => 100755 bvm/Shaders/dao-core-testnet/contract.wasm mode change 100644 => 100755 bvm/Shaders/dao-core/app-admin.wasm mode change 100644 => 100755 bvm/Shaders/dao-core/app.wasm mode change 100644 => 100755 bvm/Shaders/dao-core/contract.wasm create mode 100644 bvm/Shaders/dao-core/parser.cpp create mode 100755 bvm/Shaders/dao-core/parser.wasm mode change 100644 => 100755 bvm/Shaders/dao-core2/app.wasm mode change 100644 => 100755 bvm/Shaders/dao-core2/contract.wasm create mode 100644 bvm/Shaders/dao-core2/parser.cpp create mode 100755 bvm/Shaders/dao-core2/parser.wasm mode change 100644 => 100755 bvm/Shaders/dao-vault/app.wasm mode change 100644 => 100755 bvm/Shaders/dao-vault/contract.wasm create mode 100644 bvm/Shaders/dao-vault/parser.cpp create mode 100755 bvm/Shaders/dao-vault/parser.wasm mode change 100644 => 100755 bvm/Shaders/dao-vote/app.wasm mode change 100644 => 100755 bvm/Shaders/dao-vote/contract.wasm create mode 100644 bvm/Shaders/dao-vote/parser.cpp create mode 100755 bvm/Shaders/dao-vote/parser.wasm mode change 100644 => 100755 bvm/Shaders/dummy/app.wasm mode change 100644 => 100755 bvm/Shaders/dummy/contract.wasm mode change 100644 => 100755 bvm/Shaders/faucet/app.wasm mode change 100644 => 100755 bvm/Shaders/faucet/contract.wasm create mode 100644 bvm/Shaders/faucet/parser.cpp create mode 100755 bvm/Shaders/faucet/parser.wasm mode change 100644 => 100755 bvm/Shaders/faucet2/app.wasm mode change 100644 => 100755 bvm/Shaders/faucet2/contract.wasm create mode 100644 bvm/Shaders/faucet2/parser.cpp create mode 100755 bvm/Shaders/faucet2/parser.wasm mode change 100644 => 100755 bvm/Shaders/fuddle/contract.wasm mode change 100644 => 100755 bvm/Shaders/gallery/app-admin.wasm mode change 100644 => 100755 bvm/Shaders/gallery/app.wasm mode change 100644 => 100755 bvm/Shaders/gallery/contract.wasm create mode 100644 bvm/Shaders/gallery/parser.cpp create mode 100755 bvm/Shaders/gallery/parser.wasm create mode 100755 bvm/Shaders/make_all.sh create mode 100755 bvm/Shaders/make_shader.sh mode change 100644 => 100755 bvm/Shaders/minter/app.wasm mode change 100644 => 100755 bvm/Shaders/minter/contract.wasm create mode 100644 bvm/Shaders/minter/parser.cpp create mode 100755 bvm/Shaders/minter/parser.wasm mode change 100644 => 100755 bvm/Shaders/mirrorcoin/app.wasm mode change 100644 => 100755 bvm/Shaders/mirrorcoin/contract.wasm mode change 100644 => 100755 bvm/Shaders/nephrite/app.wasm mode change 100644 => 100755 bvm/Shaders/nephrite/contract.wasm create mode 100644 bvm/Shaders/nephrite/parser.cpp create mode 100755 bvm/Shaders/nephrite/parser.wasm mode change 100644 => 100755 bvm/Shaders/oracle/contract.wasm mode change 100644 => 100755 bvm/Shaders/oracle2/app.wasm mode change 100644 => 100755 bvm/Shaders/oracle2/contract.wasm create mode 100644 bvm/Shaders/oracle2/parser.cpp create mode 100755 bvm/Shaders/oracle2/parser.wasm create mode 100644 bvm/Shaders/pbft/parser.cpp create mode 100755 bvm/Shaders/pbft/parser.wasm mode change 100644 => 100755 bvm/Shaders/perpetual/app.wasm mode change 100644 => 100755 bvm/Shaders/perpetual/contract.wasm mode change 100644 => 100755 bvm/Shaders/pipe/contract.wasm mode change 100644 => 100755 bvm/Shaders/playground/app.wasm mode change 100644 => 100755 bvm/Shaders/playground/contract.wasm mode change 100644 => 100755 bvm/Shaders/profit_pool/app.wasm mode change 100644 => 100755 bvm/Shaders/profit_pool/contract.wasm mode change 100644 => 100755 bvm/Shaders/roulette/app.wasm mode change 100644 => 100755 bvm/Shaders/roulette/contract.wasm mode change 100644 => 100755 bvm/Shaders/sidechain/contract.wasm create mode 100644 bvm/Shaders/sidechain_pos/parser.cpp create mode 100755 bvm/Shaders/sidechain_pos/parser.wasm mode change 100644 => 100755 bvm/Shaders/upgradable/contract.wasm mode change 100644 => 100755 bvm/Shaders/upgradable2/Test/test_app.wasm mode change 100644 => 100755 bvm/Shaders/upgradable2/Test/test_v0.wasm mode change 100644 => 100755 bvm/Shaders/upgradable2/Test/test_v1.wasm mode change 100644 => 100755 bvm/Shaders/upgradable2/contract.wasm mode change 100644 => 100755 bvm/Shaders/upgradable3/Test/test_app.wasm mode change 100644 => 100755 bvm/Shaders/upgradable3/Test/test_v0.wasm mode change 100644 => 100755 bvm/Shaders/upgradable3/Test/test_v0_migrate.wasm mode change 100644 => 100755 bvm/Shaders/upgradable3/Test/test_v1.wasm mode change 100644 => 100755 bvm/Shaders/vault/app.wasm mode change 100644 => 100755 bvm/Shaders/vault/contract.wasm create mode 100644 bvm/Shaders/vault/parser.cpp create mode 100755 bvm/Shaders/vault/parser.wasm mode change 100644 => 100755 bvm/Shaders/vault_anon/app.wasm mode change 100644 => 100755 bvm/Shaders/vault_anon/contract.wasm create mode 100644 bvm/Shaders/vault_anon/parser.cpp create mode 100755 bvm/Shaders/vault_anon/parser.wasm mode change 100644 => 100755 bvm/Shaders/voting/app.wasm mode change 100644 => 100755 bvm/Shaders/voting/contract.wasm diff --git a/beam/cli.cpp b/beam/cli.cpp index 8dbbbfdf36..4189b06781 100644 --- a/beam/cli.cpp +++ b/beam/cli.cpp @@ -549,8 +549,6 @@ int main(int argc, char* argv[]) node.m_Cfg.m_Horizon.SetInfinite(); } - ByteBuffer bufRichParser; - if (vm.count(cli::CONTRACT_RICH_INFO)) { uint8_t nFlag = vm[cli::CONTRACT_RICH_INFO].as() ? @@ -560,26 +558,6 @@ int main(int argc, char* argv[]) node.m_Cfg.m_ProcessorParams.m_RichInfoFlags |= nFlag; } - if (vm.count(cli::CONTRACT_RICH_PARSER)) - { - auto sPath = vm[cli::CONTRACT_RICH_PARSER].as(); - if (!sPath.empty()) - { - std::FStream fs; - fs.Open(sPath.c_str(), true, true); - - bufRichParser.resize(static_cast(fs.get_Remaining())); - if (!bufRichParser.empty()) - fs.read(&bufRichParser.front(), bufRichParser.size()); - - bvm2::Processor::Compile(bufRichParser, bufRichParser, bvm2::Processor::Kind::Manager); - - node.m_Cfg.m_ProcessorParams.m_RichParser = bufRichParser; - } - - node.m_Cfg.m_ProcessorParams.m_RichInfoFlags |= NodeProcessor::StartParams::RichInfo::UpdShader; - } - node.m_Cfg.m_pExternalPOW = stratumServer.get(); node.Initialize(); diff --git a/bvm/Shaders/Explorer/.DS_Store b/bvm/Shaders/Explorer/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..70190956369e9a62f9a345f842273e776550278c GIT binary patch literal 6148 zcmeHKy-ve05WXu#L}Ka4=!FO98-yx|2k6Fxk{}ooxl+|VFUH&l=({j6@ZArnp&5{n z5JGp7{hfVxKKqkm=ZJ_`yLL&mAff_IkVTmgnVvMw-1!{Hx<*Hjv~9OdSLca^{^FGE z{epVR)Y6WQ_Mbc1?iW+{v|Km2-{?vB20j^(`yrtTmX3p=ULEMP1OU!4tpZ(Y z35iLLrQ=`-3xq8cXrb&S23t7hllzs9gQ0~Jd-1`Z`J;GY&5rexx)Ya%(FX&;z?gwE z8!qJizr`mrS>%sHViXJn1OJQxo>%K?g+uw2ESuXG#?Wfhs%aA5ohC?U}W1HZt)JKh90g8%>k literal 0 HcmV?d00001 diff --git a/bvm/Shaders/Explorer/Parser.cpp b/bvm/Shaders/Explorer/Parser.cpp deleted file mode 100644 index 69b0bb34b7..0000000000 --- a/bvm/Shaders/Explorer/Parser.cpp +++ /dev/null @@ -1,3507 +0,0 @@ -#include "../common.h" -#include "../app_common_impl.h" -#include "../upgradable/contract.h" -#include "../upgradable2/contract.h" -#include "../upgradable3/contract.h" -#include "../vault/contract.h" -#include "../vault_anon/contract.h" -#include "../faucet/contract.h" -#include "../faucet2/contract.h" -#include "../dao-core/contract.h" -#include "../gallery/contract.h" -#include "../nephrite/contract.h" -#include "../oracle2/contract.h" -#include "../dao-vault/contract.h" -#include "../bans/contract.h" -#include "../amm/contract.h" -#include "../dao-core/contract.h" -#include "../dao-core2/contract.h" -#include "../dao-accumulator/contract.h" -#include "../dao-vote/contract.h" -namespace Masternet { -#include "../dao-core-masternet/contract.h" -} -namespace Testnet { -#include "../dao-core-testnet/contract.h" -} -#include "../minter/contract.h" -#include "../blackhole/contract.h" -#include "../sidechain_pos/contract_l1.h" -#include "../sidechain_pos/contract_l2.h" -#include "../pbft/pbft_dpos.h" -#include "../pbft/pbft_stat.h" - -template -void DocAddTextLen(const char* szID, const void* szValue, uint32_t nLen) -{ - char szBuf[nMaxLen + 1]; - nLen = std::min(nLen, nMaxLen); - - Env::Memcpy(szBuf, szValue, nLen); - szBuf[nLen] = 0; - - Env::DocAddText(szID, szBuf); -} - -void DocSetType(const char* sz) -{ - Env::DocAddText("type", sz); -} - -void DocAddTableHeader(const char* sz) -{ - Env::DocGroup gr(""); - DocSetType("th"); - Env::DocAddText("value", sz); -} - -void DocAddAmount(const char* sz, Amount x) -{ - Env::DocGroup gr(sz); - DocSetType("amount"); - Env::DocAddNum("value", x); -} - -void DocAddAmountSigned(const char* sz, Amount val, bool bPos) -{ - Env::DocGroup gr(sz); - DocSetType("amount"); - - char szBuf[Utils::String::Decimal::DigitsMax::N + 2]; - szBuf[0] = bPos ? '+' : '-'; - Utils::String::Decimal::Print(szBuf + 1, val); - - Env::DocAddText("value", szBuf); -} - -void DocAddAmountSigned(const char* sz, int64_t x) -{ - if (x > 0) - DocAddAmountSigned(sz, x, true); - else - if (x < 0) - DocAddAmountSigned(sz, -x, false); - else - DocAddAmount(sz, 0); -} - -void DocAddHeight(const char* sz, Height h) -{ - Env::DocGroup gr(sz); - DocSetType("height"); - Env::DocAddNum("value", h); -} - -void DocAddHeight1(const char* sz, Height h) -{ - DocAddHeight(sz, h + 1); -} - -template -void DocAddMonoblob(const char* sz, const T& x) -{ - Env::DocGroup gr(sz); - DocSetType("blob"); - Env::DocAddBlob_T("value", x); -} - -void DocAddPk(const char* sz, const PubKey& pk) -{ - DocAddMonoblob(sz, pk); -} - - -void DocAddAmountBig(const char* sz, Amount valLo, Amount valHi) -{ - if (valHi) - { - MultiPrecision::UInt<4> val; - val.Set<2>(valHi); - val += MultiPrecision::UInt<2>(valLo); - - MultiPrecision::UInt<1> div1(1000000000ul); - - char szBuf[64]; // little extra - char* szPos = szBuf + _countof(szBuf) - 1; - szPos[0] = 0; - - while (true) - { - MultiPrecision::UInt<4> quot; - quot.SetDivResid(val, div1); - - szPos -= 9; - Utils::String::Decimal::PrintNoZTerm(szPos, val.get_Val<1>(), 9); - - if (quot.IsZero()) - break; - val = quot; - } - - while ('0' == *szPos) - szPos++; - - Env::DocGroup gr(sz); - DocSetType("amount"); - Env::DocAddText("value", szPos); - - } - else - DocAddAmount(sz, valLo); - -} - -void DocAddAid(const char* sz, AssetID aid) -{ - Env::DocGroup gr(sz); - DocSetType("aid"); - Env::DocAddNum("value", aid); -} - -void DocAddAidAmount(const char* sz, AssetID aid, Amount amount) -{ - Env::DocArray gr(sz); - DocAddAid("", aid); - DocAddAmount("", amount); -} - -void DocAddCid(const char* sz, const ContractID& cid) -{ - Env::DocGroup gr(sz); - DocSetType("cid"); - Env::DocAddBlob_T("value", cid); -} - -void DocAddFloat(const char* sz, MultiPrecision::Float x) -{ - char szBuf[MultiPrecision::Float::DecimalForm::s_LenScientificMax + 1]; - x.get_Decimal().PrintAuto(szBuf); - Env::DocAddText(sz, szBuf); -} - -void DocAddFloatDbg(const char* sz, MultiPrecision::Float x) -{ - // convenient for debugging, to try the exact values on host - char szBuf[Utils::String::Hex::DigitsMax::N + Utils::String::Decimal::DigitsMax::N + 10]; - Utils::String::Hex::Print(szBuf, x.m_Num, Utils::String::Hex::DigitsMax::N); - uint32_t n = Utils::String::Hex::DigitsMax::N; - szBuf[n++] = ' '; - - if (x.m_Order >= 0) - szBuf[n++] = '+'; - else - { - szBuf[n++] = '-'; - x.m_Order = -x.m_Order; - } - - n += Utils::String::Decimal::Print(szBuf + n, x.m_Order); - szBuf[n] = 0; - - Env::DocAddText(sz, szBuf); -} - -void DocAddPerc(const char* sz, MultiPrecision::Float x, uint32_t nDigsAfterDot = 3) -{ - MultiPrecision::Float::DecimalForm df; - df.Assign(x); - df.m_Order10 += 2; // to perc - - MultiPrecision::Float::DecimalForm::PrintOptions po; - po.m_DigitsAfterDot = nDigsAfterDot; - - // remove unnecessary extra precision - auto df2 = df; - int32_t nExtra = -(po.m_DigitsAfterDot + df2.m_Order10); - if (nExtra > 0) - { - // loose extra precision - if (df2.m_NumDigits > (uint32_t)nExtra) - df2.LimitPrecision(df2.m_NumDigits - nExtra); - else - { - // loose all, make it 0 - df2.m_Num = 0; - df2.m_Order10 = 0; - df2.m_NumDigits = 1; - } - } - - char szBuf[MultiPrecision::Float::DecimalForm::s_LenScientificMax + 1]; - if (df2.get_TextLenStd(po) < _countof(szBuf)) - df2.PrintStd(szBuf, po); - else - { - df.LimitPrecision(nDigsAfterDot + 2); - po.m_DigitsAfterDot = -1; - df.PrintScientific(szBuf, po); - } - - Env::DocAddText(sz, szBuf); -} - -void DocAddFixedPoint(const char* sz, uint64_t val, uint64_t one, uint32_t nDigsAfterDot) -{ - char szVal[Utils::String::Decimal::DigitsMax::N + 10]; - auto n1 = Utils::String::Decimal::Print(szVal, val / one); - - if (nDigsAfterDot) - { - szVal[n1++] = '.'; - - while (true) - { - val %= one; - val *= 10; - szVal[n1++] = Utils::String::Decimal::ToChar(val / one); - - if (!--nDigsAfterDot) - break; - } - - szVal[n1] = 0; - } - - Env::DocAddText(sz, szVal); -} - - -#define HandleContractsStd(macro) \ - macro(Vault, Vault::s_SID) \ - macro(VaultAnon, VaultAnon::s_SID) \ - macro(Faucet, Faucet::s_SID) \ - macro(Faucet2, Faucet2::s_SID) \ - macro(Minter, Minter::s_SID) \ - macro(BlackHole, BlackHole::s_SID) \ - macro(Bridge_L2, SidechainPos::L2::s_SID) \ - macro(PBFT_DPOS, PBFT_DPOS::s_SID) \ - macro(PBFT_STAT, PBFT_STAT::s_SID) \ - -#define HandleContractsVer(macro) \ - macro(Oracle2, Oracle2::s_pSID) \ - macro(Nephrite, Nephrite::s_pSID) \ - macro(DaoVault, DaoVault::s_pSID) \ - macro(Bans, NameService::s_pSID) \ - macro(DEX, Amm::s_pSID) \ - macro(DaoCore2, DaoCore2::s_pSID) \ - macro(DaoAccumulator, DaoAccumulator::s_pSID) \ - macro(DaoVote, DaoVote::s_pSID) \ - macro(Bridge_L1, SidechainPos::L1::s_pSID) \ - -#define HandleContractsWrappers(macro) \ - macro(Upgradable, Upgradable::s_SID) \ - macro(Upgradable2, Upgradable2::s_SID) \ - -#define HandleContractsWrapped(macro) \ - macro(DaoCore, DaoCore::s_SID) \ - macro(DaoCore_Masternet, Masternet::DaoCore::s_SID) \ - macro(DaoCore_Testnet, Testnet::DaoCore::s_SID) \ - macro(Gallery_0, Gallery::s_pSID[0]) \ - macro(Gallery_1, Gallery::s_pSID[1]) \ - macro(Gallery_2, Gallery::s_pSID[2]) \ - -struct ParserContext -{ - const ShaderID& m_Sid; - const ContractID& m_Cid; - uint32_t m_iMethod; - const void* m_pArg; - uint32_t m_nArg; - - bool m_Method = false; - bool m_State = false; - - template - const T* get_ArgsAs() const - { - return (m_nArg < sizeof(T)) ? nullptr : (const T*) m_pArg; - } - - ParserContext(const ShaderID& sid, const ContractID& cid) - :m_Sid(sid) - ,m_Cid(cid) - { - } - - static void OnName(const char* sz) - { - Env::DocAddText("kind", sz); - } - -#define VER_TXT " v" - - static void OnNameVer2(const char* sz, uint32_t iVer, char* szBuf, uint32_t nNameLen) - { - Env::Memcpy(szBuf, sz, nNameLen); - Env::Memcpy(szBuf + nNameLen, VER_TXT, sizeof(VER_TXT) - 1); - Utils::String::Decimal::Print(szBuf + nNameLen + _countof(VER_TXT) - 1, iVer); - - OnName(szBuf); - } - - template - static void OnNameVer(const char* sz, uint32_t iVer) - { - char szBuf[nNameLen + Utils::String::Decimal::DigitsMax::N + _countof(VER_TXT)]; - OnNameVer2(sz, iVer, szBuf, nNameLen); - } - - static void OnNameUpgradable(const char* sz, const ShaderID& sid) - { - Env::DocGroup gr("kind"); - if (sz) - Env::DocAddText("Wrapper", sz); - DocAddMonoblob("subtype", sid); - } - - void OnMethod(const char* sz) - { - assert(m_Method); - Env::DocAddText("method", sz); - } - - struct GroupArgs :public Env::DocGroup { - GroupArgs() :Env::DocGroup("params") {} - }; - - struct GroupDbg :public Env::DocGroup { - GroupDbg() :Env::DocGroup("dbg") {} - }; - -#define THE_MACRO(name, sid) \ - void OnMethod_##name(); \ - void OnState_##name(); - HandleContractsStd(THE_MACRO) - HandleContractsWrapped(THE_MACRO) -#undef THE_MACRO - -#define THE_MACRO(name, psid) \ - void OnMethod_##name(uint32_t iVer); \ - void OnState_##name(uint32_t iVer); - HandleContractsVer(THE_MACRO) -#undef THE_MACRO - -#define THE_MACRO(name, sid) void On_##name(); - HandleContractsWrappers(THE_MACRO) -#undef THE_MACRO - -#define THE_MACRO(name, sid) \ - void On_##name() \ - { \ - OnName(#name); \ - if (m_Method) \ - OnMethod_##name(); \ - if (m_State) \ - { \ - Env::DocGroup gr("State"); \ - OnState_##name(); \ - } \ - } - - HandleContractsStd(THE_MACRO) -#undef THE_MACRO - -#define THE_MACRO(name, psid) \ - void On_##name(uint32_t iVer) \ - { \ - OnNameVer<_countof(#name) - 1>(#name, iVer); \ - if (m_Method) \ - OnMethod_##name(iVer); \ - if (m_State) \ - { \ - Env::DocGroup gr("State"); \ - OnState_##name(iVer); \ - } \ - } - - HandleContractsVer(THE_MACRO) -#undef THE_MACRO - -#define THE_MACRO(name, sid) \ - void On_##name() \ - { \ - OnName("Impl-" #name); \ - if (m_Method) \ - OnMethod_##name(); \ - } - - HandleContractsWrapped(THE_MACRO) -#undef THE_MACRO - - bool Parse(); - - struct Wrapped - { - enum Enum { -#define THE_MACRO(name, sid) name, - HandleContractsWrapped(THE_MACRO) -#undef THE_MACRO - count - }; - - static Enum Recognize(const ShaderID&); - }; - - void get_WrappedState(Wrapped::Enum); - - static void WriteUpgradeParams(const Upgradable::Next&); - static void WriteUpgradeParams(const Upgradable2::Next&); - void WriteUpgradeParams(const Upgradable3::NextVersion&, uint32_t nSizeShader); - static void WriteUpgradeParams(const ContractID&, Height); - void WriteUpgradeParams(Height, const ShaderID&); - static void WriteUpgradeSettings(const Upgradable2::Settings&); - static void WriteUpgradeSettings(const Upgradable3::Settings&); - static void WriteUpgradeSettingsInternal(const Upgradable3::Settings&); - void WriteUpgrade3State(); - void OnUpgrade3Method(); - static void WriteUpgradeAdminsMask(uint32_t nApproveMask); - static void WriteNephriteSettings(const Nephrite::Settings&); - void DumpNephriteDbgStatus(); - static void WriteSposSettings(const SidechainPos::L1::Settings&); - static void WriteSposValidators(const SidechainPos::L1::Validator*, uint32_t); - void OnSposBridgeOp(const SidechainPos::L1::Method::BridgeOp&); - static void WriteOracle2Settings(const Oracle2::Settings&); - static bool get_Oracle2Median(MultiPrecision::Float&, const ContractID& cid); - static void WriteBansSettings(const NameService::Settings&); - static void WriteMinterSettings(const Minter::Settings&); - template - void DocSetBansName_T(const T& x) { - DocSetBansNameEx(&x + 1, x.m_NameLen); - } - void DocSetBansNameEx(const void* p, uint32_t nLen); - - static void WriteAmmSettings(const Amm::Settings&); - static void DocSetAmmPool(const Amm::Pool::ID&); - static const char* get_AmmKind(const Amm::Pool::ID&); - - void AddNephiriteTroveNumber(const Nephrite::Method::BaseTxTrove*); - - static void WriteDaoVoteCfg(const DaoVote::Cfg&); - - template - struct NephriteEpochStorage - { - const ContractID& m_Cid; - NephriteEpochStorage(const ContractID& cid) :m_Cid(cid) {} - - template - void Load(uint32_t iEpoch, HomogenousPool::Epoch& e) - { - Env::Key_T k; - _POD_(k.m_Prefix.m_Cid) = m_Cid; - k.m_KeyInContract.m_Tag = nTag; - k.m_KeyInContract.m_iEpoch = iEpoch; - - Env::Halt_if(!Env::VarReader::Read_T(k, e)); - } - - template - void Save(uint32_t iEpoch, const HomogenousPool::Epoch& e) { - } - void Del(uint32_t iEpoch) { - } - }; - - - void OnDaoAccumulator_UserWithdraw(uint8_t nType); - void OnState_DaoAccumulator_Pool(DaoAccumulator::Pool&, const char* szName); - void OnState_DaoAccumulator_Users(DaoAccumulator::Pool&, uint8_t type, const char* szName); - - void On_PBFT_Settings(const PBFT_DPOS::Settings&); - void On_PBFT_ValidatorAddr(const PBFT_DPOS::Address&); - void On_PBFT_DelegatorAddr(const PubKey&); - void On_PBFT_Status(const char*, I_PBFT::State::Validator::Status); - void On_PBFT_Commission(uint16_t, bool bIsTbl = false); - -}; - -bool ParserContext::Parse() -{ - if (m_Method) - { - switch (m_iMethod) - { - case 0: - OnMethod("Create"); - break; - - case 1: - OnMethod("Destroy"); - } - } - -#define THE_MACRO(name, sid) \ - if (_POD_(m_Sid) == sid) \ - { \ - On_##name(); \ - return true; \ - } - - HandleContractsStd(THE_MACRO) - HandleContractsWrappers(THE_MACRO) - HandleContractsWrapped(THE_MACRO) -#undef THE_MACRO - -#define THE_MACRO(name, psid) \ - for (uint32_t i = 0; i < _countof(psid); i++) \ - if (_POD_(m_Sid) == psid[i]) \ - { \ - On_##name(i); \ - return true; \ - } - - HandleContractsVer(THE_MACRO) -#undef THE_MACRO - - return false; -} - -ParserContext::Wrapped::Enum ParserContext::Wrapped::Recognize(const ShaderID& sidArg) -{ -#define THE_MACRO(name, sid) \ - if (_POD_(sidArg) == sid) \ - { \ - OnName(#name); \ - return Wrapped::name; \ - } - - HandleContractsWrapped(THE_MACRO) -#undef THE_MACRO - - return Wrapped::count; -} - -void ParserContext::get_WrappedState(Wrapped::Enum e) -{ - switch (e) - { -#define THE_MACRO(name, sid) \ - case Wrapped::name: \ - OnState_##name(); \ - return; - - HandleContractsWrapped(THE_MACRO) -#undef THE_MACRO - - default: - return; // suppress warning - } -} - - -void ParserContext::On_Upgradable() -{ - // Get state, discover which cid actually operates the contract - Upgradable::State us; - - if (m_Method && !m_iMethod) - { - // c'tor, the state doesn't exist yet. Initial cid should be in the args - auto pArg = get_ArgsAs(); - if (!pArg) - return; - - _POD_(Cast::Down(us)) = *pArg; - _POD_(Cast::Down(us)).SetZero(); - - GroupArgs gr; - DocAddPk("owner", us.m_Pk); - } - else - { - Env::Key_T uk; - _POD_(uk.m_Prefix.m_Cid) = m_Cid; - uk.m_KeyInContract = Upgradable::State::s_Key; - - if (!Env::VarReader::Read_T(uk, us)) - return; - } - - ShaderID sid; - if (!Utils::Shader::get_Sid_FromContract(sid, us.m_Cid)) - return; - - auto eType = Wrapped::Recognize(sid); - if (Wrapped::count == eType) - OnNameUpgradable("upgradable", sid); - - if (m_State) - { - Env::DocGroup gr("State"); - - get_WrappedState(eType); - - { - Env::DocGroup gr("upgradable"); - DocAddPk("owner", us.m_Pk); - WriteUpgradeParams(us); - } - - } - - if (m_Method) - { - switch (m_iMethod) - { - case Upgradable::ScheduleUpgrade::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (!pArg) - return; // don't care of partial result - - OnMethod("Schedule upgrade"); - - GroupArgs gr; - WriteUpgradeParams(*pArg); - } - break; - - default: - OnMethod("Passthrough"); - } - } -} - -void ParserContext::On_Upgradable2() -{ - // Get state, discover which cid actually operates the contract - - Upgradable2::State us; - Upgradable2::Settings stg; - if (m_Method && !m_iMethod) - { - // c'tor, the state doesn't exist yet. Initial cid should be in the args - auto pArg = get_ArgsAs(); - if (!pArg) - return; - - _POD_(us.m_Active) = pArg->m_Active; - _POD_(us.m_Next).SetZero(); - _POD_(stg) = pArg->m_Settings; - - GroupArgs gr; - WriteUpgradeSettings(stg); - } - else - { - Env::Key_T uk; - _POD_(uk.m_Prefix.m_Cid) = m_Cid; - uk.m_KeyInContract = Upgradable2::State::s_Key; - - if (!Env::VarReader::Read_T(uk, us)) - return; - - uk.m_KeyInContract = Upgradable2::Settings::s_Key; - if (!Env::VarReader::Read_T(uk, stg)) - return; - } - - ShaderID sid; - if (!Utils::Shader::get_Sid_FromContract(sid, us.m_Active.m_Cid)) - return; - - auto eType = Wrapped::Recognize(sid); - if (Wrapped::count == eType) - OnNameUpgradable("upgradable2", sid); - - if (m_State) - { - Env::DocGroup gr("State"); - - get_WrappedState(eType); - - { - Env::DocGroup gr("upgradable2"); - WriteUpgradeSettings(stg); - WriteUpgradeParams(us.m_Next); - } - - } - - if (m_Method) - { - if (Upgradable2::Control::s_iMethod != m_iMethod) - { - OnMethod("Passthrough"); - return; - } - - auto pCtl = get_ArgsAs(); - if (!pCtl) - return; // don't care of partial result - - switch (pCtl->m_Type) - { - case Upgradable2::Control::ExplicitUpgrade::s_Type: - OnMethod("explicit upgrade"); - break; - - case Upgradable2::Control::ScheduleUpgrade::s_Type: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Schedule upgrade"); - - GroupArgs gr; - - WriteUpgradeAdminsMask(pArg->m_ApproveMask); - WriteUpgradeParams(pArg->m_Next); - } - } - break; - - case Upgradable2::Control::ReplaceAdmin::s_Type: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("replace admin"); - - GroupArgs gr; - - WriteUpgradeAdminsMask(pArg->m_ApproveMask); - - Env::DocAddNum("iAdmin", pArg->m_iAdmin); - DocAddPk("pk", pArg->m_Pk); - } - } - break; - - case Upgradable2::Control::SetApprovers::s_Type: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("set min approvers"); - - GroupArgs gr; - - WriteUpgradeAdminsMask(pArg->m_ApproveMask); - - Env::DocAddNum("num", pArg->m_NewVal); - } - } - break; - } - } -} - -void ParserContext::WriteUpgradeParams(const Upgradable::Next& us) -{ - WriteUpgradeParams(us.m_cidNext, us.m_hNextActivate); -} - -void ParserContext::WriteUpgradeParams(const Upgradable2::Next& us) -{ - WriteUpgradeParams(us.m_Cid, us.m_hTarget); -} - -void ParserContext::WriteUpgradeAdminsMask(uint32_t nApproveMask) -{ - //const uint32_t nDigs = Utils::String::Hex::DigitsMax::N; - //char szBuf[nDigs + 1]; - //Utils::String::Hex::Print(szBuf, nApproveMask, nDigs); - - //Env::DocAddText("approve-mask", szBuf); - - Env::DocArray gr("Approvers"); - - for (uint32_t i = 0; i < (sizeof(nApproveMask) << 3); i++) - { - uint32_t msk = 1u << i; - if (!(nApproveMask & msk)) - continue; - - Env::DocAddNum("", i); - } -} - -void ParserContext::WriteUpgradeParams(const ContractID& cid, Height h) -{ - if (!_POD_(cid).IsZero()) - { - ShaderID sid; - if (!Utils::Shader::get_Sid_FromContract(sid, cid)) - return; - - ParserContext pc2(sid, sid); // use sid as dummy cid. It won't be used anyway - pc2.WriteUpgradeParams(h, sid); - } -} - -void ParserContext::WriteUpgradeParams(Height h, const ShaderID& sid) -{ - Env::DocGroup gr("Next upgrade"); - - DocAddHeight("Height", h); - - ParserContext pc2(sid, m_Cid); - if (!pc2.Parse()) - pc2.OnNameUpgradable(nullptr, sid); -} - -void ParserContext::WriteUpgradeParams(const Upgradable3::NextVersion& x, uint32_t nSizeShader) -{ - ShaderID sid; - Utils::Shader::get_Sid(sid, &x + 1, nSizeShader); - - WriteUpgradeParams(x.m_hTarget, sid); -} - -void ParserContext::WriteUpgradeSettings(const Upgradable2::Settings& stg) -{ - WriteUpgradeSettingsInternal(Cast::Reinterpret(stg)); -} - -void ParserContext::WriteUpgradeSettings(const Upgradable3::Settings& stg) -{ - Env::DocGroup gr("Upgradable3"); - WriteUpgradeSettingsInternal(stg); -} - -void ParserContext::WriteUpgradeSettingsInternal(const Upgradable3::Settings& stg) -{ - Env::DocAddNum("Delay", stg.m_hMinUpgradeDelay); - Env::DocAddNum("Min approvers", stg.m_MinApprovers); - - { - Env::DocGroup gr1("Admins"); - DocSetType("table"); - Env::DocArray gr2("value"); - - { - Env::DocArray gr3(""); - DocAddTableHeader("Index"); - DocAddTableHeader("Key"); - } - - for (uint32_t i = 0; i < _countof(stg.m_pAdmin); i++) - { - const auto& pk = stg.m_pAdmin[i]; - if (_POD_(pk).IsZero()) - continue; - - Env::DocArray gr3(""); - - Env::DocAddNum("", i); - DocAddPk("", pk); - } - - } -} - -void ParserContext::WriteUpgrade3State() -{ - Env::DocGroup gr("Upgradable3"); - - { - Env::Key_T sk; - _POD_(sk.m_Prefix.m_Cid) = m_Cid; - - Upgradable3::Settings stg; - if (Env::VarReader::Read_T(sk, stg)) - { - Env::DocGroup gr1("Settings"); - WriteUpgradeSettingsInternal(stg); - } - } - - { - Env::Key_T vk; - _POD_(vk.m_Prefix.m_Cid) = m_Cid; - - Env::VarReader r(vk, vk); - uint32_t nKey = 0, nVal = 0; - if (r.MoveNext(nullptr, nKey, nullptr, nVal, 0) && (nVal >= sizeof(Upgradable3::NextVersion))) - { - auto* pVal = (Upgradable3::NextVersion*) Env::Heap_Alloc(nVal); - - nKey = 0; - r.MoveNext(nullptr, nKey, pVal, nVal, 1); - - Env::DocGroup gr1("Schedule upgrade"); - - WriteUpgradeParams(*pVal, nVal - sizeof(Upgradable3::NextVersion)); - - Env::Heap_Free(pVal); - } - } -} - -void ParserContext::OnUpgrade3Method() -{ - using namespace Upgradable3; - - assert(m_Method == (Method::Control::s_iMethod == m_iMethod)); - - auto pCtl = get_ArgsAs(); - if (!pCtl) - return; - - switch (pCtl->m_Type) - { - case Method::Control::ExplicitUpgrade::s_Type: - OnMethod("explicit upgrade"); - break; - - case Method::Control::OnUpgraded::s_Type: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("On Upgraded"); - GroupArgs gr; - - Env::DocAddNum("Prev version", pArg->m_PrevVersion); - } - } - break; - - case Method::Control::ScheduleUpgrade::s_Type: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Schedule upgrade"); - GroupArgs gr; - - WriteUpgradeAdminsMask(pArg->m_ApproveMask); - - if (pArg->m_SizeShader <= m_nArg - sizeof(*pArg)) - WriteUpgradeParams(pArg->m_Next, pArg->m_SizeShader); - } - } - break; - - case Method::Control::ReplaceAdmin::s_Type: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("replace admin"); - GroupArgs gr; - - WriteUpgradeAdminsMask(pArg->m_ApproveMask); - - Env::DocAddNum("iAdmin", pArg->m_iAdmin); - DocAddPk("pk", pArg->m_Pk); - } - } - break; - - case Method::Control::SetApprovers::s_Type: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("set min approvers"); - GroupArgs gr; - - WriteUpgradeAdminsMask(pArg->m_ApproveMask); - Env::DocAddNum("num", pArg->m_NewVal); - } - } - break; - } - -} - -void ParserContext::OnMethod_Vault() -{ - switch (m_iMethod) - { - case Vault::Deposit::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Deposit"); - GroupArgs gr; - DocAddPk("User", pArg->m_Account); - } - } - break; - - case Vault::Withdraw::s_iMethod: - OnMethod("Withdraw"); - // no need to include the account, it's visible in the sigs list - break; - } -} - -void ParserContext::OnState_Vault() -{ -} - -void ParserContext::OnMethod_VaultAnon() -{ - switch (m_iMethod) - { - case VaultAnon::Method::Deposit::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Deposit"); - GroupArgs gr; - - DocAddPk("User", pArg->m_Key.m_pkOwner); - } - } - break; - - case VaultAnon::Method::Withdraw::s_iMethod: - OnMethod("Withdraw"); - // no need to include the account, it's visible in the sigs list - break; - } -} - -void ParserContext::OnState_PBFT_DPOS() -{ - Env::Key_T k; - _POD_(k.m_Prefix.m_Cid) = m_Cid; - k.m_KeyInContract = PBFT_DPOS::State::Tag::s_Global; - - PBFT_DPOS::State::Global g; - if (!Env::VarReader::Read_T(k, g)) - return; - - g.FlushRewardPending(); - - const Amount nProbeOnePercent = 100000000; - - PBFT_DPOS::State::Global g2; - _POD_(g2) = g; - g2.m_RewardPending = nProbeOnePercent * 100; - g2.FlushRewardPending(); - - struct ValidatorPlus - { - PBFT_DPOS::State::ValidatorPlus m_Validador; - PBFT_DPOS::Address m_Address; - - bool HasVotingPower() const { - return m_Validador.m_Status < I_PBFT::State::Validator::Status::Suspended; - } - - void operator = (const ValidatorPlus& x) { - _POD_(*this) = x; - } - - bool operator < (const ValidatorPlus& x) const { - // 1. stake. The more - the better - if (m_Validador.m_Weight > x.m_Validador.m_Weight) - return true; - if (m_Validador.m_Weight < x.m_Validador.m_Weight) - return false; - - // 2. status. The less - the better - if (m_Validador.m_Status < x.m_Validador.m_Status) - return true; - if (m_Validador.m_Status > x.m_Validador.m_Status) - return false; - - // 3. Address - return _POD_(m_Address).Cmp(x.m_Address) < 0; - } - }; - - Utils::Vector vVals; - Amount totalStake = 0; - uint64_t totalPower = 0; - //uint32_t nCountWithPower = 0; - - { - Env::Key_T vk0, vk1; - _POD_(vk0.m_Prefix.m_Cid) = m_Cid; - _POD_(vk1.m_Prefix.m_Cid) = m_Cid; - _POD_(vk0.m_KeyInContract.m_Address).SetZero(); - _POD_(vk1.m_KeyInContract.m_Address).SetObject(0xff); - - for (Env::VarReader r(vk0, vk1); ; ) - { - auto& x = vVals.emplace_back(); - if (!r.MoveNext_T(vk0, x.m_Validador)) - { - vVals.m_Count--; - break; - } - - _POD_(x.m_Address) = vk0.m_KeyInContract.m_Address; - totalStake += x.m_Validador.m_Weight; - - if (x.HasVotingPower()) - { - totalPower += x.m_Validador.m_Weight; - //nCountWithPower++; - } - } - } - - { - Env::DocGroup gr("Settings"); - On_PBFT_Settings(g.m_Settings); - } - - DocAddAmount("Total stake", totalStake); - - vVals.Prepare(vVals.m_Count * 2); - auto* pVals = MergeSort::Do(vVals.m_p, vVals.m_p + vVals.m_Count, vVals.m_Count); - -/* - { - Env::DocGroup gr2("Validators"); - - DocSetType("table"); - Env::DocArray gr3("value"); - - { - Env::DocArray gr4(""); - DocAddTableHeader("Address"); - DocAddTableHeader("Status"); - DocAddTableHeader("Stake"); - DocAddTableHeader("Voting Power %"); - DocAddTableHeader("Commission"); - } - - for (uint32_t i = 0; i < vVals.m_Count; i++) - { - auto& x = pVals[i]; - Env::DocArray gr5(""); - - DocAddMonoblob("", x.m_Address); - On_PBFT_Status("", x.m_Validador.m_Status); - DocAddAmount("", x.m_Validador.m_Weight); - - if (x.HasVotingPower()) - DocAddFixedPoint("", x.m_Validador.m_Weight * 100, totalPower, 4); - else - Env::DocAddNum32("", 0); - - On_PBFT_Commission(x.m_Validador.m_Commission_cpc, true); - } - - } -*/ - - { - Env::DocGroup gr2("Validators/Delegators"); - - DocSetType("table"); - Env::DocArray gr3("value"); - - { - Env::DocArray gr4(""); - DocAddTableHeader("Validator"); - DocAddTableHeader("Delegator"); - DocAddTableHeader("Status"); - DocAddTableHeader("Commission"); - DocAddTableHeader("Voting Power %"); - DocAddTableHeader("Stake"); - DocAddTableHeader("Reward Pending"); - DocAddTableHeader("Reward %"); - } - - Env::Key_T dk0, dk1; - _POD_(dk0.m_Prefix.m_Cid) = m_Cid; - _POD_(dk1.m_Prefix.m_Cid) = m_Cid; - - for (uint32_t iV = 0; iV < vVals.m_Count; iV++) - { - auto& x = pVals[iV]; - auto& vp = x.m_Validador; - - PBFT_DPOS::State::ValidatorPlus vp2; - _POD_(vp2) = vp; - vp2.FlushRewardPending(g2); - vp.FlushRewardPending(g); - - _POD_(dk0.m_KeyInContract.m_Validator) = x.m_Address; - _POD_(dk0.m_KeyInContract.m_Delegator) = vp.m_Self.m_Delegator; - - auto weight = x.HasVotingPower() ? vp.m_Weight : 0; - - // self delegator - PBFT_DPOS::State::Delegator dp, dp2; - Amount dpStake = 0; - - bool bFoundSelf = Env::VarReader::Read_T(dk0, dp); - if (bFoundSelf) - { - _POD_(dp2) = dp; - dp2.Pop(vp2, g2); - dp2.m_RewardRemaining += vp2.m_Self.m_Commission; - - dpStake = dp.Pop(vp, g); - dp.m_RewardRemaining += vp.m_Self.m_Commission; - } - else - { - _POD_(dp).SetZero(); - _POD_(dp2).SetZero(); - } - - { - Env::DocArray gr4(""); - - DocAddMonoblob("", x.m_Address); - DocAddMonoblob("", vp.m_Self.m_Delegator); - - On_PBFT_Status("", vp.m_Status); - On_PBFT_Commission(vp.m_Commission_cpc, true); - - DocAddFixedPoint("", weight * 100, totalPower, 4); - - DocAddAmount("", dpStake); - DocAddAmount("", dp.m_RewardRemaining); - DocAddFixedPoint("", dp2.m_RewardRemaining - dp.m_RewardRemaining, nProbeOnePercent, 4); - } - - // other delegators - _POD_(dk1.m_KeyInContract.m_Validator) = x.m_Address; - - _POD_(dk0.m_KeyInContract.m_Delegator).SetZero(); - _POD_(dk1.m_KeyInContract.m_Delegator).SetObject(0xff); - - for (Env::VarReader r2(dk0, dk1); ; ) - { - if (!r2.MoveNext_T(dk0, dp)) - break; - - if (_POD_(vp.m_Self.m_Delegator) == dk0.m_KeyInContract.m_Delegator) - continue; // already handled - - _POD_(dp2) = dp; - dp2.Pop(vp2, g2); - - dpStake = dp.Pop(vp, g); - - Env::DocArray gr4(""); - Env::DocAddText("", ""); - DocAddMonoblob("", dk0.m_KeyInContract.m_Delegator); - Env::DocAddText("", ""); - Env::DocAddText("", ""); - Env::DocAddText("", ""); - DocAddAmount("", dpStake); - DocAddAmount("", dp.m_RewardRemaining); - DocAddFixedPoint("", dp2.m_RewardRemaining - dp.m_RewardRemaining, nProbeOnePercent, 4); - } - - } - - } -} - -void ParserContext::OnMethod_PBFT_DPOS() -{ - switch (m_iMethod) - { - case PBFT_DPOS::Method::Create::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - On_PBFT_Settings(pArg->m_Settings); - } - } - break; - - case PBFT_DPOS::Method::ValidatorStatusUpdate::s_iMethod: - OnMethod("ValidatorStatusUpdate"); - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - On_PBFT_ValidatorAddr(pArg->m_Address); - On_PBFT_Status("Status", pArg->m_Status); - } - } - break; - - case PBFT_DPOS::Method::AddReward::s_iMethod: - OnMethod("AddReward"); - break; - - case PBFT_DPOS::Method::DelegatorUpdate::s_iMethod: - OnMethod("DelegatorUpdate"); - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - DocAddMonoblob("Delegator", pArg->m_Delegator); - - if (pArg->m_RewardClaim || pArg->m_StakeBond) - { - DocAddMonoblob("Validator", pArg->m_Validator); - DocAddAmountSigned("Bond_change", pArg->m_StakeBond); - } - } - } - break; - - case PBFT_DPOS::Method::ValidatorRegister::s_iMethod: - OnMethod("ValidatorRegister"); - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - - On_PBFT_ValidatorAddr(pArg->m_Validator); - On_PBFT_DelegatorAddr(pArg->m_Delegator); - DocAddAmountSigned("Stake", pArg->m_Stake, true); - On_PBFT_Commission(pArg->m_Commission_cpc); - } - } - break; - - case PBFT_DPOS::Method::ValidatorUpdate::s_iMethod: - OnMethod("ValidatorUpdate"); - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - - On_PBFT_ValidatorAddr(pArg->m_Validator); - if (PBFT_DPOS::State::ValidatorPlus::s_CommissionTagTomb == pArg->m_Commission_cpc) - Env::DocAddText("Action", "Tomb"); - else - On_PBFT_Commission(pArg->m_Commission_cpc); - } - } - break; - } -} - -void ParserContext::On_PBFT_Settings(const PBFT_DPOS::Settings& stg) -{ - DocAddAid("Stake-Aid", stg.m_aidStake); - Env::DocAddNum("Unbond lock", stg.m_hUnbondLock); - DocAddAmount("Min stake", stg.m_MinValidatorStake); -} - -void ParserContext::On_PBFT_ValidatorAddr(const PBFT_DPOS::Address& addr) -{ - DocAddMonoblob("Address", addr); -} - -void ParserContext::On_PBFT_DelegatorAddr(const PubKey& addr) -{ - DocAddMonoblob("Delegator", addr); -} - -void ParserContext::On_PBFT_Status(const char* szName, I_PBFT::State::Validator::Status status) -{ - const char* szStatus = nullptr; - switch (status) - { - case I_PBFT::State::Validator::Status::Active: szStatus = "Active"; break; - case I_PBFT::State::Validator::Status::Jailed: szStatus = "Jailed"; break; - case I_PBFT::State::Validator::Status::Suspended: szStatus = "Suspended"; break; - case I_PBFT::State::Validator::Status::Tombed: szStatus = "Tombed"; break; - case I_PBFT::State::Validator::Status::Slash: szStatus = "Slash"; break; - - default: - Env::DocAddNum(szName, static_cast(status)); - return; - } - - Env::DocAddText(szName, szStatus); -} - -void ParserContext::On_PBFT_Commission(uint16_t commission_cpc, bool bIsTbl /* = false */) -{ - DocAddFixedPoint(bIsTbl ? "" : "Commission", commission_cpc, 100, 2); -} - -void ParserContext::OnState_PBFT_STAT() -{ - { - Env::DocGroup gr2("Validators"); - - DocSetType("table"); - Env::DocArray gr3("value"); - - { - Env::DocArray gr4(""); - DocAddTableHeader("Validator"); - DocAddTableHeader("Status"); - DocAddTableHeader("Weight"); - } - - Env::Key_T vk0, vk1; - _POD_(vk0.m_Prefix.m_Cid) = m_Cid; - _POD_(vk1.m_Prefix.m_Cid) = m_Cid; - _POD_(vk0.m_KeyInContract.m_Address).SetZero(); - _POD_(vk1.m_KeyInContract.m_Address).SetObject(0xff); - - for (Env::VarReader r(vk0, vk1); ; ) - { - I_PBFT::State::Validator vp; - if (!r.MoveNext_T(vk0, vp)) - break; - - Env::DocArray gr4(""); - - DocAddMonoblob("", vk0.m_KeyInContract.m_Address); - On_PBFT_Status("", vp.m_Status); - - DocAddAmount("", vp.m_Weight); - } - - } -} - -void ParserContext::OnMethod_PBFT_STAT() -{ - switch (m_iMethod) - { - case I_PBFT::Method::ValidatorStatusUpdate::s_iMethod: - OnMethod("ValidatorStatusUpdate"); - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - On_PBFT_ValidatorAddr(pArg->m_Address); - On_PBFT_Status("Status", pArg->m_Status); - } - } - break; - - case PBFT_DPOS::Method::AddReward::s_iMethod: - OnMethod("AddReward"); - break; - } -} - -void ParserContext::OnState_VaultAnon() -{ -} - -void ParserContext::OnMethod_Faucet() -{ - switch (m_iMethod) - { - case 0: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - - Env::DocAddNum("Backlog period", pArg->m_BacklogPeriod); - DocAddAmount("Max withdraw", pArg->m_MaxWithdraw); - } - } - break; - - case Faucet::Deposit::s_iMethod: OnMethod("deposit"); break; - case Faucet::Withdraw::s_iMethod: OnMethod("withdraw"); break; - } -} - -void ParserContext::OnState_Faucet() -{ -} - -void ParserContext::OnMethod_Faucet2() -{ - switch (m_iMethod) - { - case Faucet2::Method::Create::s_iMethod: - OnMethod("Create"); - break; - - case Faucet2::Method::Deposit::s_iMethod: - OnMethod("Deposit"); - break; - - case Faucet2::Method::Withdraw::s_iMethod: - OnMethod("Withdraw"); - break; - - case Faucet2::Method::AdminCtl::s_iMethod: - { - OnMethod("Admin-Ctl"); - - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - Env::DocAddNum32("Enable", pArg->m_Enable); - - } - } - break; - - case Faucet2::Method::AdminWithdraw::s_iMethod: - OnMethod("Admin-Withdraw"); - break; - } -} - -void ParserContext::OnState_Faucet2() -{ - Env::Key_T k; - _POD_(k.m_Prefix.m_Cid) = m_Cid; - k.m_KeyInContract = Faucet2::State::s_Key; - - Faucet2::State s; - if (!Env::VarReader::Read_T(k, s)) - return; - - Env::DocAddNum("Enabled", (uint32_t) s.m_Enabled); - DocAddHeight1("Last withdraw", s.m_Epoch.m_Height); - DocAddAmount("Epoch withdraw remaining", s.m_Epoch.m_Amount); - - { - Env::DocGroup gr("Settings"); - - Env::DocAddNum("Epoch duration", s.m_Params.m_Limit.m_Height); - DocAddAmount("Epoch Withdraw limit", s.m_Params.m_Limit.m_Amount); - DocAddPk("Admin", s.m_Params.m_pkAdmin); - } -} - -void ParserContext::OnMethod_DaoCore() -{ - OnName("Dao-Core"); - - if (m_Method) - { - switch (m_iMethod) - { - case DaoCore::GetPreallocated::s_iMethod: OnMethod("Get Preallocated"); break; - case DaoCore::UpdPosFarming::s_iMethod: OnMethod("Farming Upd"); break; - - case DaoCore2::Method::AdminWithdraw::s_iMethod: - { - OnMethod("Admin Withdraw"); - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - WriteUpgradeAdminsMask(pArg->m_ApproveMask); - } - } - break; - } - } -} - -void ParserContext::OnMethod_DaoCore_Masternet() { - OnMethod_DaoCore(); -} -void ParserContext::OnMethod_DaoCore_Testnet() { - OnMethod_DaoCore(); -} -void ParserContext::OnMethod_DaoCore2(uint32_t /* iVer */) { - OnMethod_DaoCore(); -} - - -void ParserContext::OnState_DaoCore() -{ -} - -void ParserContext::OnState_DaoCore_Masternet() { - OnState_DaoCore(); -} -void ParserContext::OnState_DaoCore_Testnet() { - OnState_DaoCore(); -} -void ParserContext::OnState_DaoCore2(uint32_t /* iVer */) { - OnState_DaoCore(); -} - -void WriteGalleryAdrID(Gallery::Masterpiece::ID id) -{ - Env::DocAddNum("art_id", Utils::FromBE(id)); -} - -void WriteGalleryPrice(const Gallery::AmountWithAsset& x) -{ - DocAddAidAmount("Price", x.m_Aid, x.m_Amount); -} - -void ParserContext::OnMethod_Gallery_0() -{ - On_Gallery_2(); // same, we only added methods -} - -void ParserContext::OnMethod_Gallery_1() -{ - On_Gallery_2(); -} - -void ParserContext::OnMethod_Gallery_2() -{ - switch (m_iMethod) - { - case Gallery::Method::AddExhibit::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("AddExhibit"); - GroupArgs gr; - - DocAddPk("pkUser", pArg->m_pkArtist); - Env::DocAddNum("size", pArg->m_Size); - } - } - break; - - case Gallery::Method::ManageArtist::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("ManageArtist"); - GroupArgs gr; - - DocAddPk("pkUser", pArg->m_pkArtist); - DocAddTextLen("name", pArg + 1, pArg->m_LabelLen); - } - } - break; - - - case Gallery::Method::SetPrice::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("SetPrice"); - GroupArgs gr; - - WriteGalleryAdrID(pArg->m_ID); - WriteGalleryPrice(pArg->m_Price); - } - } - break; - - case Gallery::Method::Buy::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Buy"); - GroupArgs gr; - - WriteGalleryAdrID(pArg->m_ID); - - DocAddPk("pkUser", pArg->m_pkUser); - Env::DocAddNum32("hasAid", pArg->m_HasAid); - DocAddAmount("payMax", pArg->m_PayMax); - } - } - break; - - case Gallery::Method::Transfer::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Transfer"); - GroupArgs gr; - - WriteGalleryAdrID(pArg->m_ID); - DocAddPk("newPkUser", pArg->m_pkNewOwner); - } - } - break; - - - case Gallery::Method::Withdraw::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Withdraw"); - GroupArgs gr; - - // TODO roman - DocAddPk("key", pArg->m_Key.m_pkUser); - DocAddAidAmount("Value", pArg->m_Key.m_Aid, pArg->m_Value); - } - } - break; - - case Gallery::Method::AddVoteRewards::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("AddVoteRewards"); - GroupArgs gr; - - DocAddAmount("amount", pArg->m_Amount); - } - } - break; - - case Gallery::Method::Vote::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Vote"); - GroupArgs gr; - - WriteGalleryAdrID(pArg->m_ID.m_MasterpieceID); - Env::DocAddNum("impression", pArg->m_Impression.m_Value); - } - } - break; - - case Gallery::Method::AdminDelete::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("AdminDelete"); - GroupArgs gr; - - WriteGalleryAdrID(pArg->m_ID); - } - } - break; - } -} - -void ParserContext::OnState_Gallery_0() -{ - OnState_Gallery_2(); -} -void ParserContext::OnState_Gallery_1() -{ - OnState_Gallery_2(); -} -void ParserContext::OnState_Gallery_2() -{ - OnState_Gallery_2(); -} - - -void ParserContext::WriteNephriteSettings(const Nephrite::Settings& stg) -{ - DocAddCid("oracle", stg.m_cidOracle1); - DocAddCid("oracle-backup", stg.m_cidOracle2); - DocAddCid("Dao-Vault", stg.m_cidDaoVault); - DocAddAmount("Liquidation Reserve", stg.m_TroveLiquidationReserve); - DocAddHeight("Min Redemption Height", stg.m_hMinRedemptionHeight); - DocAddAid("Gov Token", stg.m_AidGov); -} - -void ParserContext::AddNephiriteTroveNumber(const Nephrite::Method::BaseTxTrove* pArg) -{ - uint32_t iTrove; - - if (pArg && pArg->m_iPrev0) - { - Env::Key_T tk; - _POD_(tk.m_Prefix.m_Cid) = m_Cid; - tk.m_KeyInContract.m_iTrove = pArg->m_iPrev0; - - Nephrite::Trove t; - if (!Env::VarReader::Read_T(tk, t)) - return; - - iTrove = t.m_iNext; - } - else - { - Env::Key_T k; - _POD_(k.m_Prefix.m_Cid) = m_Cid; - k.m_KeyInContract = Nephrite::Tags::s_State; - - Nephrite::Global g; - if (!Env::VarReader::Read_T(k, g)) - return; - - iTrove = pArg ? g.m_Troves.m_iHead : (g.m_Troves.m_iLastCreated + 1); - } - - Env::DocAddNum("Number", iTrove); -} - - -void ParserContext::OnMethod_Nephrite(uint32_t /* iVer */) -{ - switch (m_iMethod) - { - case Nephrite::Method::Create::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - - WriteNephriteSettings(pArg->m_Settings); - WriteUpgradeSettings(pArg->m_Upgradable); - } - } - break; - - case Upgradable3::Method::Control::s_iMethod: - OnUpgrade3Method(); - break; - - case Nephrite::Method::TroveOpen::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Trove Open"); - GroupArgs gr; - - AddNephiriteTroveNumber(nullptr); - DocAddAmount("Col", pArg->m_Amounts.Col); - DocAddAmount("Tok", pArg->m_Amounts.Tok); - } - } - break; - - case Nephrite::Method::TroveClose::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Trove Close"); - GroupArgs gr; - AddNephiriteTroveNumber(pArg); - } - } - break; - - case Nephrite::Method::TroveModify::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Trove Modify"); - GroupArgs gr; - AddNephiriteTroveNumber(pArg); - DocAddAmount("Col", pArg->m_Amounts.Col); - DocAddAmount("Tok", pArg->m_Amounts.Tok); - } - } - break; - - case Nephrite::Method::FundsAccess::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Funds Access"); - GroupArgs gr; - } - } - break; - - case Nephrite::Method::UpdStabPool::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Stability Pool update"); - GroupArgs gr; - - DocAddAmount("New Amount", pArg->m_NewAmount); - } - } - break; - - case Nephrite::Method::Liquidate::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Liquidate troves"); - GroupArgs gr; - - Env::DocAddNum("Count", pArg->m_Count); - } - } - break; - - case Nephrite::Method::Redeem::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Redeem"); - GroupArgs gr; - - DocAddAmount("Amount", pArg->m_Amount); - } - } - break; - - case Nephrite::Method::AddStabPoolReward::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Add Stability Pool Reward"); - GroupArgs gr; - - DocAddAmount("Amount", pArg->m_Amount); - } - } - break; - } - - DumpNephriteDbgStatus(); -} - -void ParserContext::OnState_Nephrite(uint32_t /* iVer */) -{ - WriteUpgrade3State(); - - Env::Key_T k; - _POD_(k.m_Prefix.m_Cid) = m_Cid; - k.m_KeyInContract = Nephrite::Tags::s_State; - - Nephrite::Global g; - if (!Env::VarReader::Read_T(k, g)) - return; - - { - Env::DocGroup gr2("Settings"); - WriteNephriteSettings(g.m_Settings); - } - - DocAddAid("Token", g.m_Aid); - Env::DocAddNum("Troves created", g.m_Troves.m_iLastCreated); - - { - Env::DocGroup gr2("Totals"); - DocAddAmount("Col", g.m_Troves.m_Totals.Col); - DocAddAmount("Tok", g.m_Troves.m_Totals.Tok); - } - - Nephrite::Global::Price price; - const char* szPriceSource; - bool bHavePrice = true; - - if (get_Oracle2Median(price.m_Value, g.m_Settings.m_cidOracle1) && price.IsSane(price.m_Value)) - szPriceSource = "Main Oracle"; - else - { - if (get_Oracle2Median(price.m_Value, g.m_Settings.m_cidOracle2) && price.IsSane(price.m_Value)) - szPriceSource = "Backup Oracle"; - else - { - szPriceSource = "Unavailable";; - bHavePrice = false; - } - } - - Env::DocAddText("Price feed", szPriceSource); - if (bHavePrice) - { - DocAddFloat("Price", price.m_Value); - - if (g.m_Troves.m_iHead) - { - DocAddPerc("TCR", price.ToCR(g.m_Troves.m_Totals.get_Rcr())); - Env::DocAddText("Recovery mode", g.IsRecovery(price) ? "Yes" : "No"); - } - } - - g.m_BaseRate.Decay(); - DocAddPerc("Fee boost", g.m_BaseRate.m_k); - - { - Env::DocGroup gr2("Troves"); - - DocSetType("table"); - Env::DocArray gr3("value"); - - { - Env::DocArray gr4(""); - DocAddTableHeader("Number"); - DocAddTableHeader("Key"); - DocAddTableHeader("Col"); - DocAddTableHeader("Tok"); - DocAddTableHeader("ICR"); - } - - Utils::Vector vec; - vec.Prepare(g.m_Troves.m_iLastCreated); - - { - Env::Key_T tk0, tk1; - _POD_(tk0.m_Prefix.m_Cid) = m_Cid; - _POD_(tk1.m_Prefix.m_Cid) = m_Cid; - tk0.m_KeyInContract.m_iTrove = 0; - tk1.m_KeyInContract.m_iTrove = (Nephrite::Trove::ID) -1; - - for (Env::VarReader r(tk0, tk1); ; ) - { - Nephrite::Trove t; - if (!r.MoveNext_T(tk0, t)) - break; - - vec.Prepare(tk0.m_KeyInContract.m_iTrove); - _POD_(vec.m_p[tk0.m_KeyInContract.m_iTrove - 1]) = t; - } - } - - for (auto iTrove = g.m_Troves.m_iHead; iTrove; ) - { - Nephrite::Trove& t = vec.m_p[iTrove - 1]; - - NephriteEpochStorage storR(m_Cid); - auto vals = g.m_RedistPool.get_UpdatedAmounts(t, storR); - - Env::DocArray gr4(""); - - Env::DocAddNum("", iTrove); - DocAddPk("", t.m_pkOwner); - DocAddAmount("", vals.Col); - DocAddAmount("", vals.Tok); - - if (bHavePrice) - DocAddPerc("", price.ToCR(t.m_Amounts.get_Rcr())); - else - Env::DocAddText("", ""); - - iTrove = t.m_iNext; - } - - } - - g.m_StabPool.AddReward(Env::get_Height()); - - { - Env::DocGroup gr2("Stability pool"); - - DocAddAmount("Tok", g.m_StabPool.get_TotalSell()); - DocAddAmount("Col", g.m_StabPool.m_Active.m_pDim[0].m_Buy + g.m_StabPool.m_Draining.m_pDim[0].m_Buy); - DocAddAmount("BeamX", g.m_StabPool.m_Active.m_pDim[1].m_Buy + g.m_StabPool.m_Draining.m_pDim[1].m_Buy); - } - - DocAddAmount("BeamX reward remaining", g.m_StabPool.m_Reward.m_Remaining); - - DumpNephriteDbgStatus(); -} - -void TestEqual(Amount a, Amount b, const char* szErr) -{ - // allow for little error - a = (a >= b) ? (a - b) : (b - a); - if (a > 10) - Env::DocAddNum(szErr, a); -} - -void ParserContext::DumpNephriteDbgStatus() -{ -/* - Env::Key_T k; - _POD_(k.m_Prefix.m_Cid) = m_Cid; - k.m_KeyInContract = Nephrite::Tags::s_State; - - Nephrite::Global g; - if (!Env::VarReader::Read_T(k, g)) - return; - - GroupDbg gr0; - - { - Env::DocGroup gr1("Totals"); - Env::DocAddNum("Tok", g.m_Troves.m_Totals.Tok); - Env::DocAddNum("Col", g.m_Troves.m_Totals.Col); - } - - { - Env::DocGroup gr1("stab"); - Env::DocAddNum("Tok", g.m_StabPool.get_TotalSell()); - Env::DocAddNum("Col", g.m_StabPool.m_Active.m_pDim[0].m_Buy + g.m_StabPool.m_Active.m_pDim[1].m_Buy); - - } - - Nephrite::Pair trovesTotalsOrg, trovesTotalsAdj; - _POD_(trovesTotalsOrg).SetZero(); - _POD_(trovesTotalsAdj).SetZero(); - - MultiPrecision::Float weight(0u); - - { - Env::DocGroup gr1("troves"); - - Env::Key_T tk0, tk1; - _POD_(tk0.m_Prefix.m_Cid) = m_Cid; - _POD_(tk1.m_Prefix.m_Cid) = m_Cid; - tk0.m_KeyInContract.m_iTrove = 0; - tk1.m_KeyInContract.m_iTrove = (Nephrite::Trove::ID)-1; - - for (Env::VarReader r(tk0, tk1); ; ) - { - Nephrite::Trove t; - if (!r.MoveNext_T(tk0, t)) - break; - - char sz[Utils::String::Decimal::DigitsMax::N + 1]; - Utils::String::Decimal::Print(sz, tk0.m_KeyInContract.m_iTrove); - Env::DocGroup gr2(sz); - - { - Env::DocGroup gr2("org"); - Env::DocAddNum("Tok", t.m_Amounts.Tok); - Env::DocAddNum("Col", t.m_Amounts.Col); - } - - trovesTotalsOrg.Tok += t.m_Amounts.Tok; - trovesTotalsOrg.Col += t.m_Amounts.Col; - - auto vals = g.m_RedistPool.get_UpdatedAmounts(t); - - { - Env::DocGroup gr2("adj"); - Env::DocAddNum("Tok", vals.Tok); - Env::DocAddNum("Col", vals.Col); - } - - trovesTotalsAdj.Tok += vals.Tok; - trovesTotalsAdj.Col += vals.Col; - - DocAddFloatSc("weight", t.m_RedistUser.m_Weight); - DocAddFloatSc("Sigma", t.m_RedistUser.m_pSigma0[0]); - - weight += t.m_RedistUser.m_Weight; - - } - } - - { - Env::DocGroup gr1("redist"); - Env::DocAddNum("Tok", g.m_RedistPool.m_Active.m_Sell); - Env::DocAddNum("Col", g.m_RedistPool.m_Active.m_pDim[0].m_Buy); - DocAddFloatSc("Weight0", g.m_RedistPool.m_Active.m_Weight); - DocAddFloatSc("Weight1", weight); - DocAddFloatSc("Sigma", g.m_RedistPool.m_Active.m_pDim[0].m_Sigma); - } - - // Totals must be equal to the sum of effective (adjusted) trove amounts - TestEqual(g.m_Troves.m_Totals.Tok, trovesTotalsAdj.Tok, "errz-1-Tok"); - TestEqual(g.m_Troves.m_Totals.Col, trovesTotalsAdj.Col, "errz-1-Col"); - - // All troves must be part of redist pool - if (g.m_Troves.m_Totals.Tok != g.m_RedistPool.m_Active.m_Sell) - Env::DocAddText("errz-2", ""); - - // extra collateral in the redist pool must be equal to diff of ordinal vs adjusted trove values - TestEqual(g.m_RedistPool.m_Active.m_pDim[0].m_Buy, g.m_Troves.m_Totals.Col - trovesTotalsOrg.Col, "errz-3"); -*/ -} - -void ParserContext::WriteSposSettings(const SidechainPos::L1::Settings& stg) -{ - DocAddAid("Staking Token", stg.m_aidStaking); - DocAddAid("Liquidity Token", stg.m_aidLiquidity); - DocAddHeight("Per-phase End", stg.m_hPreEnd); -} - -void ParserContext::WriteSposValidators(const SidechainPos::L1::Validator* pV, uint32_t nV) -{ - Env::DocGroup gr1("Validators"); - DocSetType("table"); - Env::DocArray gr2("value"); - - { - Env::DocArray gr3(""); - DocAddTableHeader("Index"); - DocAddTableHeader("Key"); - } - - for (uint32_t i = 0; i < nV; i++) - { - const auto& v = pV[i]; - - Env::DocArray gr3(""); - Env::DocAddNum("", i); - DocAddPk("", v.m_pk); - } -} - -void ParserContext::OnMethod_Bridge_L1(uint32_t /* iVer */) -{ - switch (m_iMethod) - { - case SidechainPos::L1::Method::Create::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - - WriteSposSettings(pArg->m_Settings); - WriteUpgradeSettings(pArg->m_Upgradable); - - if (m_nArg >= sizeof(*pArg) + sizeof(SidechainPos::L1::Validator) * pArg->m_Validators) - WriteSposValidators((const SidechainPos::L1::Validator*) (pArg + 1), pArg->m_Validators); - } - } - break; - - case Upgradable3::Method::Control::s_iMethod: - OnUpgrade3Method(); - break; - - case SidechainPos::L1::Method::UserStake::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("User stake"); - GroupArgs gr; - - DocAddAmount("Amount", pArg->m_Amount); - DocAddPk("Pk", pArg->m_pkUser); - } - } - break; - - case SidechainPos::L1::Method::BridgeExport::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Bridge Export"); - GroupArgs gr; - OnSposBridgeOp(*pArg); - } - } - break; - - case SidechainPos::L1::Method::BridgeImport::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Bridge Import"); - GroupArgs gr; - OnSposBridgeOp(*pArg); - WriteUpgradeAdminsMask(pArg->m_ApproveMask); - } - } - break; - } - -} - -void ParserContext::OnSposBridgeOp(const SidechainPos::L1::Method::BridgeOp& op) -{ - DocAddAidAmount("Value", op.m_Aid, op.m_Amount); - DocAddMonoblob("cookie", op.m_Cookie); - DocAddPk("pk", op.m_pk); -} - -void ParserContext::OnState_Bridge_L1(uint32_t /* iVer */) -{ - WriteUpgrade3State(); - - Env::Key_T k; - _POD_(k.m_Prefix.m_Cid) = m_Cid; - k.m_KeyInContract = SidechainPos::L1::Tags::s_State; - - SidechainPos::L1::State s; - if (!Env::VarReader::Read_T(k, s)) - return; - - { - Env::DocGroup gr2("Settings"); - WriteSposSettings(s.m_Settings); - } - - - { - k.m_KeyInContract = SidechainPos::L1::Tags::s_Validators; - Env::VarReader r(k, k); - - SidechainPos::L1::Validator pV[SidechainPos::L1::Validator::s_Max]; - uint32_t nKey = 0, nVal = sizeof(pV); - - if (r.MoveNext(nullptr, nKey, pV, nVal, 0) && (nVal >= sizeof(SidechainPos::L1::Validator)) && (nVal <= sizeof(pV))) - WriteSposValidators(pV, nVal / sizeof(SidechainPos::L1::Validator)); - - } -} - -void ParserContext::OnMethod_Bridge_L2() -{ - switch (m_iMethod) - { - case SidechainPos::L2::Method::BridgeEmit::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Mint"); - GroupArgs gr; - OnSposBridgeOp(*pArg); - } - } - break; - - case SidechainPos::L2::Method::BridgeBurn::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Burn"); - GroupArgs gr; - OnSposBridgeOp(*pArg); - } - } - break; - } - -} - - -void ParserContext::OnState_Bridge_L2() -{ - // no state -} - -void ParserContext::WriteOracle2Settings(const Oracle2::Settings& stg) -{ - Env::DocAddNum("Validity Period", stg.m_hValidity); - Env::DocAddNum("Min Providers", stg.m_MinProviders); -} - -bool ParserContext::get_Oracle2Median(MultiPrecision::Float& ret, const ContractID& cid) -{ - Env::Key_T key; - _POD_(key.m_Prefix.m_Cid) = cid; - key.m_KeyInContract = Oracle2::Tags::s_Median; - - Oracle2::Median med; - if (!Env::VarReader::Read_T(key, med)) - return false; - - if (med.m_hEnd < Env::get_Height()) - return false; - - ret = med.m_Res; - return true; -} - -void ParserContext::OnMethod_Oracle2(uint32_t /* iVer */) -{ - switch (m_iMethod) - { - case Oracle2::Method::Create::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - - WriteOracle2Settings(pArg->m_Settings); - WriteUpgradeSettings(pArg->m_Upgradable); - } - } - break; - - case Oracle2::Method::Get::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Get"); - - GroupArgs gr; - - MultiPrecision::Float val; - if (get_Oracle2Median(val, m_Cid)) - DocAddFloat("Result", val); - else - Env::DocAddText("Result", "NaN"); - } - } - break; - - case Oracle2::Method::FeedData::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("FeedData"); - GroupArgs gr; - - Env::DocAddNum("iProvider", pArg->m_iProvider); - DocAddFloat("Value", pArg->m_Value); - } - } - break; - - case Oracle2::Method::SetSettings::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("SetSettings"); - GroupArgs gr; - - WriteOracle2Settings(pArg->m_Settings); - WriteUpgradeAdminsMask(pArg->m_ApproveMask); - } - } - break; - - case Oracle2::Method::ProviderAdd::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("ProviderAdd"); - GroupArgs gr; - - DocAddPk("pk", pArg->m_pk); - WriteUpgradeAdminsMask(pArg->m_ApproveMask); - } - } - break; - - case Oracle2::Method::ProviderDel::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("ProviderDel"); - GroupArgs gr; - - Env::DocAddNum("iProvider", pArg->m_iProvider); - WriteUpgradeAdminsMask(pArg->m_ApproveMask); - } - } - break; - - } -} - -void ParserContext::OnState_Oracle2(uint32_t /* iVer */) -{ - Oracle2::StateMax g; - uint32_t nProvs = 0; - - Env::Key_T key; - _POD_(key.m_Prefix.m_Cid) = m_Cid; - key.m_KeyInContract = Oracle2::Tags::s_StateFull; - - { - Env::VarReader r(key, key); - uint32_t nKey = 0, nVal = sizeof(g); - if (!r.MoveNext(nullptr, nKey, &g, nVal, 0)) - return; - - nProvs = (nVal - sizeof(Oracle2::State0)) / sizeof(Oracle2::State0::Entry); // don't care about overflow - if (nProvs > g.s_ProvsMax) - return; - } - - { - Env::DocGroup gr1("Settings"); - - WriteUpgrade3State(); - WriteOracle2Settings(g.m_Settings); - } - - Height h = Env::get_Height(); - - { - Env::DocGroup gr1("Feeds"); - DocSetType("table"); - Env::DocArray gr2("value"); - - { - Env::DocArray gr3(""); - DocAddTableHeader("Index"); - DocAddTableHeader("Key"); - DocAddTableHeader("Last Value"); - DocAddTableHeader("Last Height"); - DocAddTableHeader("Comment"); - } - - Height h1 = (h > g.m_Settings.m_hValidity) ? (h - g.m_Settings.m_hValidity) : 0; - - for (uint32_t i = 0; i < nProvs; i++) - { - const auto& x = g.m_pE[i]; - if (_POD_(x.m_Pk).IsZero()) - continue; - - Env::DocArray gr3(""); - - Env::DocAddNum("", i); - DocAddPk("", x.m_Pk); - DocAddFloat("", x.m_Val); - DocAddHeight1("", x.m_hUpdated); - - Env::DocAddText("", (x.m_hUpdated > h1) ? "" : "outdated"); - - } - } - - { - key.m_KeyInContract = Oracle2::Tags::s_Median; - Oracle2::Median med; - if (Env::VarReader::Read_T(key, med)) - { - bool bValid = (med.m_hEnd >= h); - if (bValid) - DocAddFloat("Median", med.m_Res); - else - Env::DocAddText("Median", ""); - } - } -} - -void ParserContext::OnMethod_DaoVault(uint32_t /* iVer */) -{ - switch (m_iMethod) - { - case DaoVault::Method::Create::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - - WriteUpgradeSettings(pArg->m_Upgradable); - } - } - break; - - case Upgradable3::Method::Control::s_iMethod: - OnUpgrade3Method(); - break; - - case DaoVault::Method::Deposit::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Deposit"); - //GroupArgs gr; - - //DocAddAidAmount("Value", pArg->m_Aid, pArg->m_Amount); - } - } - break; - - case DaoVault::Method::Withdraw::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Withdraw"); - //GroupArgs gr; - - //DocAddAidAmount("Value", pArg->m_Aid, pArg->m_Amount); - WriteUpgradeAdminsMask(pArg->m_ApproveMask); - } - } - break; - } -} - -void ParserContext::OnState_DaoVault(uint32_t /* iVer */) -{ - WriteUpgrade3State(); -} - -void ParserContext::WriteBansSettings(const NameService::Settings& stg) -{ - DocAddCid("Price oracle", stg.m_cidOracle); - DocAddCid("Dao-Vault", stg.m_cidDaoVault); - DocAddCid("Anon-Vault", stg.m_cidVault); - DocAddHeight("Activation height", stg.m_h0); -} - -void ParserContext::DocSetBansNameEx(const void* p, uint32_t nLen) -{ - if (nLen > NameService::Domain::s_MaxLen) - return; - - uint32_t n0 = ((const uint8_t*) p) - ((const uint8_t*) m_pArg); - if (n0 + nLen > m_nArg) - return; - - char sz[NameService::Domain::s_MaxLen + 1]; - Env::Memcpy(sz, p, nLen); - sz[nLen] = 0; - - Env::DocAddText("name", sz); -} - -void ParserContext::OnMethod_Bans(uint32_t /* iVer */) -{ - switch (m_iMethod) - { - case NameService::Method::Create::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - - WriteBansSettings(pArg->m_Settings); - WriteUpgradeSettings(pArg->m_Upgradable); - } - } - break; - - case Upgradable3::Method::Control::s_iMethod: - OnUpgrade3Method(); - break; - - case NameService::Method::SetOwner::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Set Owner"); - GroupArgs gr; - - DocSetBansName_T(*pArg); - DocAddPk("New owner", pArg->m_pkNewOwner); - } - } - break; - - case NameService::Method::Extend::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Extend period"); - GroupArgs gr; - - DocSetBansName_T(*pArg); - Env::DocAddNum32("Periods", pArg->m_Periods); - } - } - break; - - case NameService::Method::SetPrice::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod(pArg->m_Price.m_Amount ? "Set Price" : "Remove Price"); - GroupArgs gr; - - DocSetBansName_T(*pArg); - - if (pArg->m_Price.m_Amount) - DocAddAidAmount("Price", pArg->m_Price.m_Aid, pArg->m_Price.m_Amount); - } - } - break; - - case NameService::Method::Buy::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Buy"); - GroupArgs gr; - - DocSetBansName_T(*pArg); - DocAddPk("New owner", pArg->m_pkNewOwner); - - } - } - break; - - case NameService::Method::Register::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Register"); - GroupArgs gr; - - DocSetBansName_T(*pArg); - DocAddPk("Owner", pArg->m_pkOwner); - Env::DocAddNum32("Periods", pArg->m_Periods); - } - } - break; - - } -} - -void ParserContext::OnState_Bans(uint32_t /* iVer */) -{ - WriteUpgrade3State(); - - Env::Key_T k; - _POD_(k.m_Prefix.m_Cid) = m_Cid; - k.m_KeyInContract = NameService::Tags::s_Settings; - - NameService::Settings s; - if (!Env::VarReader::Read_T(k, s)) - return; - - { - Env::DocGroup gr2("Settings"); - WriteBansSettings(s); - } - - { - Env::DocGroup gr2("Domains"); - DocSetType("table"); - Env::DocArray gr3("value"); - - { - Env::DocArray gr4(""); - DocAddTableHeader("Name"); - DocAddTableHeader("Owner"); - DocAddTableHeader("Expiration height"); - DocAddTableHeader("Status"); - DocAddTableHeader("Sell price"); - } - - Env::Key_T k0; - _POD_(k0.m_Prefix.m_Cid) = m_Cid; - _POD_(k0.m_KeyInContract.m_sz).SetZero(); - -#pragma pack (push, 1) - struct KeyPlus { - Env::Key_T k; - char m_chTerm; // 1 more byte, to place 0-terminator - } k1; -#pragma pack (pop) - - _POD_(k1.k.m_Prefix.m_Cid) = m_Cid; - Env::Memset(k1.k.m_KeyInContract.m_sz, 0xff, NameService::Domain::s_MaxLen); - - Height h = Env::get_Height(); - for (Env::VarReader r(k0, k1.k); ; ) - { - NameService::Domain d; - uint32_t nKey = sizeof(k1.k), nVal = sizeof(d); - if (!r.MoveNext(&k1.k, nKey, &d, nVal, 0)) - break; - - if (sizeof(d) != nVal) - continue; - - nKey -= (sizeof(k0) - NameService::Domain::s_MinLen); - if (nKey > NameService::Domain::s_MaxLen) - continue; - - k1.k.m_KeyInContract.m_sz[nKey] = 0; - - Env::DocArray gr4(""); - - Env::DocAddText("", k1.k.m_KeyInContract.m_sz); - DocAddPk("", d.m_pkOwner); - DocAddHeight("", d.m_hExpire); - - const char* szStatus = - (d.m_hExpire > h) ? "" : - (d.m_hExpire + NameService::Domain::s_PeriodHold > h) ? "On Hold" : - "Expired"; - Env::DocAddText("", szStatus); - - if (d.m_Price.m_Amount) - DocAddAidAmount("", d.m_Price.m_Aid, d.m_Price.m_Amount); - else - Env::DocAddText("", ""); - } - - } - -} - -void ParserContext::WriteMinterSettings(const Minter::Settings& stg) -{ - DocAddCid("Dao-Vault", stg.m_cidDaoVault); - DocAddAmount("Issuance fee", stg.m_IssueFee); -} - -void ParserContext::OnMethod_Minter() -{ - switch (m_iMethod) - { - case Minter::Method::Init::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - WriteMinterSettings(pArg->m_Settings); - } - } - break; - - case Minter::Method::View::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("View"); - GroupArgs gr; - - DocAddAid("aid", pArg->m_Aid); - } - } - break; - - case Minter::Method::CreateToken::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Create token"); - GroupArgs gr; - - DocAddAmountBig("Limit", pArg->m_Limit.m_Lo, pArg->m_Limit.m_Hi); - - if (Minter::PubKeyFlag::s_Cid == pArg->m_pkOwner.m_Y) - DocAddCid("Owner", pArg->m_pkOwner.m_X); - else - DocAddPk("Owner", pArg->m_pkOwner); - - // TODO - aid - } - } - break; - - case Minter::Method::Withdraw::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Withdraw"); - GroupArgs gr; - - DocAddAmount("amount", pArg->m_Value); - DocAddAid("aid", pArg->m_Aid); - } - } - break; - } -} - -void ParserContext::OnState_Minter() -{ - Env::Key_T k; - _POD_(k.m_Prefix.m_Cid) = m_Cid; - k.m_KeyInContract = Minter::Tags::s_Settings; - - Minter::Settings s; - if (!Env::VarReader::Read_T(k, s)) - return; - - { - Env::DocGroup gr2("Settings"); - WriteMinterSettings(s); - } - - { - Env::DocGroup gr2("Tokens"); - DocSetType("table"); - Env::DocArray gr3("value"); - - { - Env::DocArray gr4(""); - DocAddTableHeader("Aid"); - DocAddTableHeader("Metadata"); - DocAddTableHeader("Owner"); - DocAddTableHeader("Minted"); - DocAddTableHeader("Limit"); - } - - Env::Key_T k0, k1; - _POD_(k0.m_Prefix.m_Cid) = m_Cid; - _POD_(k1.m_Prefix.m_Cid) = m_Cid; - k0.m_KeyInContract.m_Aid = 0; - k1.m_KeyInContract.m_Aid = (AssetID) -1; - - for (Env::VarReader r(k0, k1); ; ) - { - Minter::Token mt; - if (!r.MoveNext_T(k0, mt)) - break; - - Env::DocArray gr4(""); - - DocAddAid("", k0.m_KeyInContract.m_Aid); - - char szMetadata[1024 * 16 + 1]; // max metadata size is 16K - AssetInfo ai; - auto nMetadata = Env::get_AssetInfo(k0.m_KeyInContract.m_Aid, ai, szMetadata, sizeof(szMetadata) - 1); - szMetadata[nMetadata] = 0; - - Env::DocAddText("", szMetadata); - - if (Minter::PubKeyFlag::s_Cid & mt.m_pkOwner.m_Y) - DocAddCid("", mt.m_pkOwner.m_X); - else - DocAddMonoblob("", mt.m_pkOwner); - - - DocAddAmountBig("", mt.m_Minted.m_Lo, mt.m_Minted.m_Hi); - DocAddAmountBig("", mt.m_Limit.m_Lo, mt.m_Limit.m_Hi); - } - } -} - -void ParserContext::OnMethod_BlackHole() -{ - switch (m_iMethod) - { - case BlackHole::Method::Deposit::s_iMethod: - OnMethod("Deposit"); - break; - } -} - -void ParserContext::OnState_BlackHole() -{ -} - -void ParserContext::WriteAmmSettings(const Amm::Settings& stg) -{ - DocAddCid("Dao-Vault", stg.m_cidDaoVault); -} - -void ParserContext::DocSetAmmPool(const Amm::Pool::ID& pid) -{ - DocAddAid("Aid1", pid.m_Aid1); - DocAddAid("Aid2", pid.m_Aid2); - Env::DocAddText("Volatility", get_AmmKind(pid)); -} - -const char* ParserContext::get_AmmKind(const Amm::Pool::ID& pid) -{ - switch (pid.m_Fees.m_Kind) - { - case 0: return "Low"; - case 1: return "Medium"; - case 2: return "High"; - } - return ""; -} - - -void ParserContext::OnMethod_DEX(uint32_t /* iVer */) -{ - switch (m_iMethod) - { - case Amm::Method::Create::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - - WriteAmmSettings(pArg->m_Settings); - WriteUpgradeSettings(pArg->m_Upgradable); - } - } - break; - - case Upgradable3::Method::Control::s_iMethod: - OnUpgrade3Method(); - break; - - case Amm::Method::PoolCreate::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Pool Create"); - GroupArgs gr; - - DocSetAmmPool(pArg->m_Pid); - DocAddPk("Creator", pArg->m_pkCreator); - } - } - break; - - case Amm::Method::PoolDestroy::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Pool Destroy"); - GroupArgs gr; - DocSetAmmPool(pArg->m_Pid); - } - } - break; - - case Amm::Method::AddLiquidity::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Liquidity Add"); - GroupArgs gr; - DocSetAmmPool(pArg->m_Pid); - } - } - break; - - case Amm::Method::Withdraw::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Liquidity Withdraw"); - GroupArgs gr; - DocSetAmmPool(pArg->m_Pid); - } - } - break; - - case Amm::Method::Trade::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Trade"); - GroupArgs gr; - DocSetAmmPool(pArg->m_Pid); - } - } - break; - } -} - -void ParserContext::OnState_DEX(uint32_t /* iVer */) -{ - WriteUpgrade3State(); - - Env::Key_T k; - _POD_(k.m_Prefix.m_Cid) = m_Cid; - k.m_KeyInContract = Amm::Tags::s_Settings; - - Amm::Settings s; - if (!Env::VarReader::Read_T(k, s)) - return; - - { - Env::DocGroup gr2("Settings"); - WriteAmmSettings(s); - } - - { - Env::DocGroup gr2("Pools"); - DocSetType("table"); - Env::DocArray gr3("value"); - - { - Env::DocArray gr4(""); - DocAddTableHeader("Aid1"); - DocAddTableHeader("Aid2"); - DocAddTableHeader("Volatility"); - DocAddTableHeader("LP-Token"); - DocAddTableHeader("Amount1"); - DocAddTableHeader("Amount2"); - DocAddTableHeader("Amount-LP-Token"); - DocAddTableHeader("Rate 1:2"); - DocAddTableHeader("Rate 2:2"); - } - - Env::Key_T k0, k1; - _POD_(k0.m_Prefix.m_Cid) = m_Cid; - _POD_(k1.m_Prefix.m_Cid) = m_Cid; - _POD_(k0.m_KeyInContract.m_ID).SetZero(); - _POD_(k1.m_KeyInContract.m_ID).SetObject(0xff); - - for (Env::VarReader r(k0, k1); ; ) - { - Amm::Pool p; - if (!r.MoveNext_T(k0, p)) - break; - - Env::DocArray gr4(""); - - DocAddAid("", k0.m_KeyInContract.m_ID.m_Aid1); - DocAddAid("", k0.m_KeyInContract.m_ID.m_Aid2); - Env::DocAddText("", get_AmmKind(k0.m_KeyInContract.m_ID)); - DocAddAid("", p.m_aidCtl); - DocAddAmount("", p.m_Totals.m_Tok1); - DocAddAmount("", p.m_Totals.m_Tok2); - DocAddAmount("", p.m_Totals.m_Ctl); - - if (p.m_Totals.m_Tok1 && p.m_Totals.m_Tok2) - { - char szBuf[MultiPrecision::Float::DecimalForm::s_LenScientificMax + 1]; - - MultiPrecision::Float f1(p.m_Totals.m_Tok1); - MultiPrecision::Float f2(p.m_Totals.m_Tok2); - - for (uint32_t i = 0; i < 2; i++) - { - auto k = i ? (f2 / f1) : (f1 / f2); - auto df = k.get_Decimal(); - - // print the ratio nicely. Limit to 8 precision digits, prefer std notation - const uint32_t nPrecision = 8; - df.LimitPrecision(nPrecision); - - MultiPrecision::Float::DecimalForm::PrintOptions po; - - if (df.get_TextLenStd(po) <= nPrecision + 2) - df.PrintStd(szBuf, po); - else - df.PrintScientific(szBuf, po); - - Env::DocAddText("", szBuf); - } - - } - else - { - Env::DocAddText("", ""); - Env::DocAddText("", ""); - } - } - - } - -} - -void OnDaoAccumulator_PoolType(uint8_t nType) -{ - static const char s_szName[] = "Pool"; - switch (nType) - { - case DaoAccumulator::Method::UserLock::Type::BeamX_PrePhase: - Env::DocAddText(s_szName, "Beam-BeamX pre-phase"); - break; - - case DaoAccumulator::Method::UserLock::Type::BeamX: - Env::DocAddText(s_szName, "Beam-BeamX"); - break; - - case DaoAccumulator::Method::UserLock::Type::Nph: - Env::DocAddText(s_szName, "Beam-Nph"); - break; - } -} - -void ParserContext::OnDaoAccumulator_UserWithdraw(uint8_t nType) -{ - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Withdraw"); - GroupArgs gr; - - OnDaoAccumulator_PoolType(nType); - - DocAddPk("pk", pArg->m_pkUser); - } -} - -void ParserContext::OnMethod_DaoAccumulator(uint32_t /* iVer */) -{ - switch (m_iMethod) - { - case DaoAccumulator::Method::Create::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - WriteUpgradeSettings(pArg->m_Upgradable); - DocAddAid("beamX", pArg->m_aidBeamX); - DocAddHeight("Per-phase end", pArg->m_hPrePhaseEnd); - } - } - break; - - case Upgradable3::Method::Control::s_iMethod: - OnUpgrade3Method(); - break; - - case DaoAccumulator::Method::FarmStart::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Farm Start"); - GroupArgs gr; - - WriteUpgradeAdminsMask(pArg->m_ApproveMask); - DocAddAid("LP-Token", pArg->m_aidLpToken); - DocAddAmount("Total Reward", pArg->m_FarmBeamX); - Env::DocAddNum("Total Duration", pArg->m_hFarmDuration); - - } - } - break; - - case DaoAccumulator::Method::UserLock::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Lock"); - GroupArgs gr; - OnDaoAccumulator_PoolType(pArg->m_PoolType); - DocAddPk("pk", pArg->m_pkUser); - DocAddHeight("hEnd", pArg->m_hEnd); - } - } - break; - - case DaoAccumulator::Method::UserWithdraw_FromBeamNph::s_iMethod: - OnDaoAccumulator_UserWithdraw(DaoAccumulator::Method::UserLock::Type::Nph); - break; - - case DaoAccumulator::Method::UserWithdraw_FromBeamBeamX::s_iMethod: - OnDaoAccumulator_UserWithdraw(DaoAccumulator::Method::UserLock::Type::BeamX); - break; - } -} - -void ParserContext::OnState_DaoAccumulator_Pool(DaoAccumulator::Pool& p, const char* szName) -{ - Env::DocGroup gr(szName); - - p.Update(Env::get_Height()); - - DocAddAmount("Reward remaining", p.m_AmountRemaining); - Env::DocAddNum("Farming duration remaining", p.m_hRemaining); -} - -void ParserContext::OnState_DaoAccumulator_Users(DaoAccumulator::Pool& p, uint8_t type, const char* szName) -{ - Env::DocGroup gr2(szName); - DocSetType("table"); - Env::DocArray gr3("value"); - - { - Env::DocArray gr4(""); - DocAddTableHeader("LP-Tokens"); - DocAddTableHeader("Locked until"); - DocAddTableHeader("Reward"); - DocAddTableHeader("Key"); - } - - Env::Key_T k0, k1; - k0.m_KeyInContract.m_Tag = type; - k1.m_KeyInContract.m_Tag = type; - _POD_(k0.m_Prefix.m_Cid) = m_Cid; - _POD_(k1.m_Prefix.m_Cid) = m_Cid; - _POD_(k0.m_KeyInContract.m_pk).SetZero(); - _POD_(k1.m_KeyInContract.m_pk).SetObject(0xff); - - for (Env::VarReader r(k0, k1); ; ) - { - DaoAccumulator::User u; - if (!r.MoveNext_T(k0, u)) - break; - - Env::DocArray gr4(""); - - DocAddAmount("", u.m_LpToken); - DocAddHeight("", u.m_hEnd); - - u.m_EarnedBeamX += p.Remove(u.m_PoolUser); - DocAddAmount("", u.m_EarnedBeamX); - - DocAddPk("", k0.m_KeyInContract.m_pk); - } -} - -void ParserContext::OnState_DaoAccumulator(uint32_t /* iVer */) -{ - WriteUpgrade3State(); - - Env::Key_T k; - _POD_(k.m_Prefix.m_Cid) = m_Cid; - k.m_KeyInContract = DaoAccumulator::Tags::s_State; - - DaoAccumulator::State s; - if (!Env::VarReader::Read_T(k, s)) - return; - - DocAddAid("BeamX", s.m_aidBeamX); - DocAddHeight("Pre-phaseend height ", s.m_hPreEnd); - - if (s.m_aidLpToken) - { - DocAddAid("LP-token", s.m_aidLpToken); - - OnState_DaoAccumulator_Pool(s.m_Pool, "Pool Beam/BeamX"); - } - - DaoAccumulator::Pool p_Nph; - k.m_KeyInContract = DaoAccumulator::Tags::s_PoolBeamNph; - - if (Env::VarReader::Read_T(k, p_Nph)) - OnState_DaoAccumulator_Pool(p_Nph, "Pool Beam/Nph"); - else - _POD_(p_Nph).SetZero(); - - OnState_DaoAccumulator_Users(s.m_Pool, DaoAccumulator::Tags::s_User, "Beam/BeamX users"); - OnState_DaoAccumulator_Users(p_Nph, DaoAccumulator::Tags::s_UserBeamNph, "Beam/Nph users"); -} - - - - - -void ParserContext::OnMethod_DaoVote(uint32_t /* iVer */) -{ - switch (m_iMethod) - { - case DaoVote::Method::Create::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - GroupArgs gr; - WriteUpgradeSettings(pArg->m_Upgradable); - WriteDaoVoteCfg(pArg->m_Cfg); - } - } - break; - - case Upgradable3::Method::Control::s_iMethod: - OnUpgrade3Method(); - break; - - case DaoVote::Method::AddProposal::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Add proposal"); - GroupArgs gr; - - DocAddPk("moderator", pArg->m_pkModerator); - } - } - break; - - case DaoVote::Method::MoveFunds::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - OnMethod(pArg->m_Lock ? "Funds Lock" : "Funds Unlock"); - } - break; - - case DaoVote::Method::Vote::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Vote"); - } - } - break; - - case DaoVote::Method::AddDividend::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - OnMethod("Add dividend"); - } - break; - - case DaoVote::Method::GetResults::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - OnMethod("Get results"); - } - break; - - case DaoVote::Method::SetModerator::s_iMethod: - { - auto pArg = get_ArgsAs(); - if (pArg) - { - OnMethod("Set moderator"); - GroupArgs gr; - - DocAddPk("moderator", pArg->m_pk); - Env::DocAddNum32("Enable", pArg->m_Enable); - } - } - break; - } -} - -void ParserContext::OnState_DaoVote(uint32_t /* iVer */) -{ - WriteUpgrade3State(); - - Env::Key_T k; - _POD_(k.m_Prefix.m_Cid) = m_Cid; - k.m_KeyInContract = DaoVote::Tags::s_State; - - DaoVote::State s; - if (!Env::VarReader::Read_T(k, s)) - return; - - { - Env::DocGroup gr("Settings"); - WriteDaoVoteCfg(s.m_Cfg); - } - -} - -void ParserContext::WriteDaoVoteCfg(const DaoVote::Cfg& cfg) -{ - DocAddAid("Voting asset", cfg.m_Aid); - Env::DocAddNum("Epoch duration", cfg.m_hEpochDuration); - DocAddPk("Admin", cfg.m_pkAdmin); -} - - - -BEAM_EXPORT void Method_0(const ShaderID& sid, const ContractID& cid, uint32_t iMethod, const void* pArg, uint32_t nArg) -{ - Env::DocGroup gr(""); - - ParserContext pc(sid, cid); - pc.m_Method = true; - pc.m_iMethod = iMethod; - pc.m_pArg = pArg; - pc.m_nArg = nArg; - - pc.Parse(); -} - -BEAM_EXPORT void Method_1(const ShaderID& sid, const ContractID& cid) -{ - Env::DocGroup gr(""); - - ParserContext pc(sid, cid); - pc.Parse(); -} - -BEAM_EXPORT void Method_2(const ShaderID& sid, const ContractID& cid) -{ - Env::DocGroup gr(""); - - ParserContext pc(sid, cid); - //pc.m_Name = false; - pc.m_State = true; - pc.Parse(); -} diff --git a/bvm/Shaders/Explorer/Parser.wasm b/bvm/Shaders/Explorer/Parser.wasm deleted file mode 100644 index 4cfd23076c36b88f81e76f436f4f5f4575377dcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78411 zcmeEv3!Ifzx%Ye9mzh1lR#A!Z^6stDOi3aN=%~m$qC$$0AX%pl4$Kzj!pt}q#1jLf zB2sE$nU~U}vak}<)Q)K>*+n#uVOqyJWt3K0+M#nirIq>p|Ib?QZNGaDGr;$&@B1D7 zG5dYjeLc^!p4)oXdX1L8m8M}B=1t~XF0j_EGcGXk&oJ=3*0{i4#}xiG*D)7=9lY>2 z&0l#k@Mbc}FxR5&TB)&C)y7|I?OLRx05efRewdWP8w;Z+zg@nt1hd#PJ6mg5*V_~9 zQrD{5+1<;$*49O()%}LSgq%t^v$uPo$1s^P1}Ud?cK4N3niVN^&cMp)#~XH}q2|u+ zrG^tPa@^Ed(_U|H%Ozz^t2AjkJ+HKK*~%Ux#YW_%=aTTHuhbvDwDnCf(kxc9xTUvm z$?07KD~$}_$H@D~@nFD+cr zGIiQ?qej|h^1FN6`b%nFb$maw)W5i;b3i9$nG`luD-C;{o!!ffS~lU#Y3b}YWOlX7 zOZ`jcl-icB=r?jQR3>BfC%v+?vb*;Z%gD|v^{?n|T{6Y^km)}kYg`pP zPc^PKYw!N8y}|skX^~uy7{Y&s=XMnBBjwRG@|Q}|&_-r_gn#oY$M)XtO?IvNCd061 z@qgEBu3a?7aLt0_nFY(9)~i#r7qO|NS&T4*WfeUO84Z8fa?WgISAa@*Am zaxEAh8Zj4QXc(Ml=5J(?aXCp|cOH|Qkum5QeopmStInE@{N-#zb(Z_RZ93~T=yn+a z>;xv(0<@2r%(PbUr`g>&)9S>NIn%m;Ka$Xj@eW=0yPw+At@9NS=Hur(Mti}rW(g#0 zZ>Q0Yv}cX>{3m6Gj+aG3gLOeM<<)i-(_U?l4<0Ym?xwsKjIL-}nrSa)VreO+ZF(|Z z&|%`{YtpfjHWRn4KP8q3^rXC@t-o|)sivep^6$sQQfrXvVvwC3dXyM?9mk*TTbRc41jjkYnvCIoGHy1;e3ivgB8ARd4Lp|uyC$%f%gIfGPHm0C5CIEqL} zYr89IDir4eg4$*H6!pcF<6yCv>+Ix$QAlsFjG}Y;7*d{-znSeWMj^{0Zt5)Nx~Z*hdaIjRTdZk*6aS67e6U!%rI?y-)uB{vvwNjm19};3MuS87 z_o7O=kmX!VWU2~oW=*V$l)Svzcoz#}$@t~bWxF(t)U`+jJlw4GgPu}bF#vaiYfiJW z#oG05W@t;%8Dn_suy`>IjM~w?Vip{3E*$PmD=Wj{Slt{)yQWw(6R56HqZS4cA8t@( zBMPZ$s5%&muBB(-a0Y(gkr`)H6B%^p)~sP~4rk?XR?c*ch`_b-w-6C^7MTww(m&mr zz!gZGSf1;qI*QJ!=~iB)8O5v=A?cw=wg`-^axJ9w0!%8=DT24Ha?>g?i^OcC5Eva& zY;Qt){!{E2Lja-YU8kSFbw$HXt&+ARJ&U$dt5C&Z2ZSM4g%m=slIW;J*7M6ju3(PM z>t3EC5s9il|UEYcpGubha zUN1lcz|`oSc0CLIn{UtUupJ6p@(*cB=*!*;A;(2Wv||OP*SppY`#x&={2&Y~vCnPG;}$&o>Vw@kMnnmL8!^k#y}E6j}zSD#%_scdSI zT6$_2B_Ll)B;w`0IT_81gqfuaja$qt6&>~Rn5rL zZnjJUDE!ogGZz`KrU>+anGBCrU8`*B`4C`w>e+~BNYX~w3g(`7vlS(Vk5_O?g;#%i zN@7%>p5on_V#B$ChgY3jP^D~Q6q9jstv0c!#2`lN;) z;HXM`OQ;fSCBw{L!Lmwms8A!KMC%$>RGrLU$=bP3WQ3$FVH8$G(Xf2YT!CkXfx$K# zGYmuVl19TQ+RetfvYO24Mqcq)3s2xJMi$DsQAk;{>{$esXU;)Ei_0!gIpf(_027dq zZO?z64f|Cj|wF`gQXLBf(A z9dD3x!OxjgBAcy^uDu3g+dhAci796w)C|>5TD6k`(W@40%u0j6Lkk@v0Rd-R4ut>& z=w5MAXc7K;D%Px}e!>KIV==vUO_A&wCGiFbtX%_kt(7?2twA=+twEOEY;HiM!#6gY zm#@d0v9Oq_FWAthopx`V;hpMc>W2qZhYu(~%2mh|BnTo3X#yQkB#@Brc(djcbA_}( zHi9x_Z8O@pZp5SnvRPu-Q8=U~4j8A)k(?IfShE1vOb2ua(G6U~8$aEsBfSXi+EfI* z@w5#k14vH0COWc3_Xk*R{r>iy+n@i?y2WG697eQRzhdmDC58YsLsAm0MUoz+4(O&1 z3K>fO6roEW;jCW$ZfM~m$ z?eMI2jSdXlAen=VRFV|oWYTE1!GPYX3P3CM4j%y6Qymu-Q>P;zby64>e>$YLS~n21 zv_7CVC{0-zmifqumBNw0bG+z3LFeGnr;9C-rLbQb+|;vlhSP>`4^Rw zrL-s(W$jN!`w9@`D_CxV0SBBxVIa}L6wWr0`VL9O(7h=F^ZbVhpNW1!U;};u%m{N< z9VoWBu1_%G8erR4K2E^~ZGu+Yfz}L(G8=V#WKqN>*MiCbh@iIuSQo6BcEy@iD+H^e z0Vx6Eb7_kz`wwQ!X!;;but-%yN-YCu(nL+#n*uWMr-`v()G`dr-|i^XNF@#}EmNvA zAF)U=TOhj#nwnpz<>*{avo@R|#t+gUEnuwzkm2~VV3~js02MliG6is_1dJdMXz_+* z72wOQ!KgVijU9{RmlpV;W6rJGe5b6T(i7vkv0~4Z?FtK@Fzq`{l|O1;OI2I~&57 z5VQ1p2EK)PjNhAO;fG}xKb3(Kw!Ealc2#Wcu}%(E94{?&B#z8cu=%% zC|bY8v1t?8zQ7zZ0}m<24kxCGKfnPDFU-aSsfp016A=7mvxphYvcXzG8p2tFf8dZgU!qVycd zdg&0d9(^iV57%j0WIc;xL|WEE7iyOlAQa#-=L>UD{d~=-T=)*-(w+viNP9{isSlib zN1g@!NoXbyP_EWEpIv)IH1X+=0ly(p_L!F9+ zgRO%hvt4NjxgS{Ad2nDdE4c^_z{3KqFPgxC01_!3Ma$ctN{W@gov6@;h_|v`y#p)0 zM!1&Docsz1GNC?$dkl%5jt6*5o7dqTMnP%~$=ZmDgy;1a9 zSalXLPPkw>g7V8$Rn@kys>006=5l|qY#Tb4a{N&tHN8^_K6IA9h9>Pq-&;rVhTRuH z7RHuq&Id=fXxZ2@Yng?kjX&|b`re^pN?@K9lP1-?{<}B-C<~J%MT-WWfQ@kT=rl}6 zTQ#)IH-FzRM$|a8Y*M~u1N(6yxE2i5Z8U1q^`cOKTro7jQU-?wKNn*Jb}>=>H~~oO zyaNEzIwHnsei&48m!(YOkTy^jnfVVB0v2!t$cTWaU7~!WNcBw=1#W51hZ@Bd<&BhP zKYqr_w=l>_OXb*c<}=6V63w zT^1R?MTf=pL@ca1%kwQYK!!e5XY2ahPswMfZecyv2%E-(<3EsbH@{#s*EWN=>XBoe z0f)DG^#~>92uf1GN>L)*W+`KYzI&yF(#0gv5dQ!#e}d$KW} z{KeoN3OJce2kF*W%P@_c_o>@}Gw*Yu6AeSviFbsFdh`(M-n~rq+&q4Uu#@b40d6WZ zz-E+miFTU*B1=*7V!=%|4ur<(eeGHn1*zcgW&A6^;Q$TqnTm~nsY>Ht8eQYBR&4yf zDvjSU(#APoj{Uk1VlE+ITqD1=Y78Gxdu1|f85JiJ= zfLj#+Zi$HGpkJ-n;SVc!nE&$V8ov(4X&fSVmCg6wM2Wl0N<5P&@s+X?uO>>|Q&!@- zt77BOQ2p<4l0JQ6rGQTJ_e%W`NcUE(KLo8*!+SUNpQ%{?h7s2vy1LT%@2Ff~&+hRs zSMvbQ?7p&@ZLZkzgJIq1%tqLuonTne*2HA=-Xzk! zY#t0j{ASqp^?o5~R+u*BB(qjw391(gDm~5@F>2vNxxHP1`Pc#T*&G|FnztHgxc0Us z%2@gGGCLDx>_nNNO;Mn*FC+h;043~ebE1qHlo5OiL2ZkbQds}Gv_zE@&3=O~0tMPA zfhuI>K4Y5NBmn1LOGO|M$EFg;B(l6WSyXI^QJ}z7B09p}y*nv$bzs=%h3$(t^;D49 z(~^rp0G}#0%kT>M^?X+XSN%nNfol0n5y6rB+z7{b?7kmkUHiy~`3)5>r+7^kkfdLR zDi%`Av5rAMKd?b)BCG&N($KVGu=}r%114fCstrIs!shcXy*`9*BJi%_o}nl*0YpD6 z^#ub#+Vx>tE_b%CH+?-6LYzymk{%+qWTA-GWJK2y7$NN|Kl&|f?Auiu+ctb--;6f) z`KtIA$coaa;5sc1S4B%dL$H-E6eCpX0?PT<*$=HJK?|yb`H};)qV_!*G^erEOG%UcKaGsb)%CjcV0LjqblwzLu9z(>A zCQ`;?f^F=8N612Y$a|53cSLM@4ce(4qvhK}wYn-FkY>GxitCJs!47ScF$X^l?L>{^ zxncKzLe^ZBCC%i&%lUynv6^@hF~IzzD$yXZ&?MY0KuA+dy^{k}sgE(W3U#Y;nz@Z^ zQt+O|IS0L%Uo%Bmo8C<(0#z{+C}A{M)D)~>qa=&d~G8J3PoMtBZva~ z5VfjP=FsoWlS0x&kNGE9S#~$POJkWN(SOsK0o}63Fm(IV5z?)cQ*^5)nU^`>d0P#` zXf-)1h>UTEmMWE!82=)1ua5>wc)BI6Eq8|u2X@uV`>#aYI!wS z_PXn9r5Q}Oe6fdJf3~b^U%p}9J8RmN+{k^AGFcl(H{QUZNts+Qw4gE z4U7c{`*c_{P)fd1A?=|sO);`M#AWgcA+t0*Vr&chMhc;7spfJ&s*OrNM&p~l^ivEH zqqMwSpslH~`hVe;s>4B$RBdgonMr3IUxzzt?wFcj2sIkKKM4mK9hCPgNgtI)?7hr7 z=)ou`5~yQDHnm6e3_rJ?d{+1Thke&G7P;XaMR98sun=CrAn<2yeKC~$E`>gKCjTab z)P`3b;S-y0hGYv!U}KCkkI{$^i< zrwOZid-Y;?Mpg0ZxJk%$>*Q}GN!P*mD+74P+%f530BJpdtM}aiMutzsV#QXYw}~U* z3OPzmghQWHu)P~(WKr@+1_avCfWSKLOKDn2sfj{KOX-PzYS@X&=C(md!?q3}jb{yM zWQCC4k{DUil(W3@iIV%u@TSfkgAHU&2#y|J#JGzslDkLH7n}^`K)sLE(1}qbINzoz zfm?nA5cC1CbUgxJ7(7@RK&%g$sE;&_1|8t=(pzIp`_S`!ymD`v@JEG?@5@|KMH7%O zGPzfURja4zGy9(m+c6+!V0n*-4k9vOm*LBR&sjQVJ+Lg`=C>4U#d`g*cxp1f;$?Z6 zr1xekH4y#};Zh5p?s2ciE~MbwVl)I^QgToXd)e6IETmkMo*@LKwtKaT14+3e;z0p< zCGEhMYCRMC;p85@DijdA-B3?tpA-#+kwFL?LeJd4L%TWcMzWH!%r*1hCxgjhq*%V# zG$=EFQD6rPXqkhqeJ4w9H(+`}z~rl)GUkMnYcIf*8wN}&`~Y3n>^m?$wL38VV9&tx zM*)))Qj@b!sR@zAlxG#GDdSU9YTtqBhr0vQkE(#_v%@dCSN{K^rl*GmQ~sGMK-$fc z+bH{kV?$aRyH9CpzhP);KcAMy?K@if@vuMwXZp#Wf$0VT)BiUN{6BUFrl0N^m~Is? z)r8bkvrnlBF6gS9sm`aS+I>e&KieIco*OZk5CLwAJ@<#KRz?p&s?HbZt&HJZ%)2^h{aaqta(o3%{Px5=uGqcRZTSHBq|= zURImCB|l8mO&V0O6IR||BmR}&s}VKYdA$c?;>4~R)ElF2_@lH{cjLG*>5z<>ioPCc zdZE7kWhV$%QnaH&m15MBGScD^6Lfp<_of1br=rG|YvkV`0s>3zJ8<_WO|@^rto9)u zAs4g>L&@;eLANN1l1JY(LCKk08e}I{GRVGLxgYOorqe9L&|vMuJj;KA!^YcqL_UI? z4Da}M`UfTIG!X36cS<)y5-6`^U6 z8yFf$O7>DmG{RT*s4t;&#o1I}>cl63Yn^1ib}2E%rycV2?4=cOc2~7Tuh@>@Y|}s! ztjJeGy}pQ$Yj7S3B$lj6D8qKVNqNM?3}J~&n2G64nr>Zyyl+Yfz26cNc7o5F9^1i> zkw;{S-sEVoF7PH{iw$A_mVtWQZBwWcWFy)9^QG7hs{qp^3$ddz$?sJfa0wU;!W$Yg z^I)_?zF$)MQhB~LPja4Y+(ic(gBq=A!EUbW8AOta4A;~N(pIPX&s47t`0Z9DW zg@FnS3v*smIYXD~9EE#cXW}9&xEU8NrLu1EM$$DVO?MsWS>pUmUFJ0CvF(y(&rNa z#Ah7-$hcO)0I;y#5}b$wq(Tp88nBh!Qv!~KQ4wXanB<%y4vuLk(z6a9sRNXB@^H7rl~#J0{i=MCfd6Z_hFT*OlFhuH3!6@av^H%_WbiC2Z$ObH`>qIMY;J4k{tE1 zjSOL6=U696LZk2PXnsq z5&hu-hbb{@zem_IIKgDCVN7l_k4|Tm9fNC#YSt8RQ5Kk8tz4v#b5lwUh#IMw0W=>F znaE`qvd+yBl=z8*GUtP` zt}q6e%HUXx6cczC$Kr+su&;40a>2I7q3O?9odq^;_9J;raX&l)GsXSe3kSISxu`JS z-LG(jSe<%4h(*F6w_(3lT% zyy6XqE8C?47;4TP@4kgi9PA#9+VzEr?pr`46AD>D{{iT=wgbCRIijynui6%%<%mBE zaTY+pk3`0ExE54YXY(SZU&E*~f#!xscCk#W)m+~V28}=fT zLPwAv4Z%?KIH5#fFfX#0To=-4yO83DA6+wpPmD+N$0&sghr6Od%)tO&GUz5l!8w$Q zNH^>Neh=?SkKZ`sUlg2aEjCsco0h9{$kQ8Ydx(^I^Wa= zo2h2f<=jJ#G0rGX6#JomE04oSqZ7r70QAAcExDfnd))1KvBiqO>26vPxW@quh|C=D z09m>ICOIUUy2p-c_BRoMP#{|rc>;b)rOnbutwROdrj5c70=CJ*1Uef9M^7syI~^$5 zkaF$rM7Lfk*|~(0ou-nF+a0PX*}hi;&8zjSr+rxS3&z@_>(&ev50eXb1ptSM8KnVW zX#j8n9P#J?;HtLv4hSi2X$TNp_b}XOH3(A$QWWC`VuCw51PTzP!xVt_JA46AvHcd% zLD;MwyAzX<&M8+Y+i+5i5y9hoG z((gYy`egK62eqBhwmFrEwWtZ1sXfe%-w4bFp~$>y0j^4}11V5eKZ!vtWyZTvCJk0s z@QsWEXmSK^N<2JoV5L%&Jnx$vO6xO`Fx}clORr(N^)l|v#1n;;TGzsUP48uhqqyR~ z%|S(|QuKMg?05})blh5WE2`ee8Ge$#`;-=8)0+0ciATt|IgkhwR`rvuj3g!Ize_Ha z1jYaFQo%a-hgvG)UCt`A5=s$_fJ5C32sW2fOGycLw@yqv-=f22q|<(+P+aaeX1I;5 z!o1554i4iSHUsaf8S}30W9P7%1U9jE=OGRXDt~swO`OZ!ma^>d?9^T1E}FM9;mZE| z+An)%iTp0~Tq-bx8arG*LsZo1`#Ax>J1gw!PbkyZRWW*gV2MLj3_L#*DmZ@7pmO{m zGw}Nu5zosV?0*00*6pAeJpj|YgS$<5yB(}M&VlcUxL$5YMG&-RXA#C3V_r#J)r#x4 zBAHFv^LA8M)mu_fu~i4~_*U0dA?^{^sz(yt7EQ8FC#q#AOjO$l0tD^~wt@Oh%ijTt zMBNx((ZxT1GtUJ|cvHCrdqysH^x(0;wmP6`!Eo_`S->kcj-V#%?I+~=;VbCWI1`io zgK@@1xsHmRT69w4hDbSF#CBaX|8q(y@)C52runBXzf(jPHUVKENwU6Z+-EnDUhUlP z6u%L4;9?7$M1z;%8HmM@?yM5`6UPziu^fVr2L)(8$~|E z<2zwTNukiER3Sg?SnpQBe8~N?K8veJmD2(2y!$?n zet{FkfW2?I@6-)Q-j)cHG6nR$1jgrAP`f~`XQP2cV zMd6AdUcZLx7R8EJUn$^?Zuu_|*~Ans?0SsP+6j+(fe-#Ui-(GyV%OZ_(qGi@{#_;D zUMgiEdcR5xZeKCp|B{vkz-n3*7H!g*^IBL7sIJ3hc~MSE;Wuh;v|`;yfzNbJdu{5vX}Yl1XgeTPCrcOk$Ls-hod} zWHBDl$)0hhJF@8Xm9*h)5v&N~7vP)Wu0J@P0Go^l`&y9n85j#w`WT_-x^npmCam}_G>(Lv{8Inhzq z#d2c99uv!ojeBf7D?0FT@vP{`^YN_c(D#dHMaRB>JS#f*1L9e+(T|Vk#fE=iSzdJf z2bJYTCvb3CUUUW%%JQO9cuQGcbPf~C@?w*yFUyS0;*j#p=rj&3&y3FFuxKXl#8m9b zJ6xwL_L6%n6Fp(M2|BW+WD3_8V^Hi0F(|m`IcsDxW;E{PejL||9^8v=*8heVF<`mg zg)aaFvf)oEvBAK>ZN)#o6AA~{Q0JW$HxACs?dL~Dh9~B(xCL!1!5TG4M2LZ-TJ#6@ z;0HUE7(w6%mh_7-NtI)HC$#5xk&9E+!Cm-s@(33lGT_lc2{?M83$YA-5u8#4du2Kl zFQls%Ryu*Vk~YA-g&%$|;{;ZM1l`Q0@CY%x20yrObG4t#4b&s?f?EgjpJuU%-Um4& zBq2-9ixCo%=xquo8-#yie`lIrMRbdvtDKLjv| z3L+6m{;|I;Rp#SURzB>RzAe0pcaV?UFbmGT>-czNMksaWMQz<6equs)t zkIv*sBUH+=vwja(={CSsavnh#gyn4t42fM?#FN>$C)B@oVO+47p~yhH<5D}Xq_)nvR!a$t4{o%@ytNdvgwG!DOajGYeDQy)TT0Nyu^BYo4fw4e$4Hi+o-a-}Lv z1=s86oxDFDI~M~;c_()9T2@CnFVGGzT#jvx8|q+?r|@buTCK{e@)Wl~ix()u)oPk7 zQp6g3Phc1|(Eefc%28;ePlc2)idsM2qgpSP*HQujNa6MD%?NA2Dz{n(i@56DO)sv; zezxV^A_qHhpu4?LLz=P`G0bOB(r_BG*0lCSLw0LGZL0&0gqI!)5xIR8REI&~BH{@5 zd4iM*?z5f0k`FQ!7Q201z=G zO&DqshoV{NNa!GuL=6-OCx+Qz!H;WKDnjn@Y*cyJVF&yM z;{}JI@=!ZW04vmp9IkMp7Lm?mYtXnb$<4U*LLP-V$6`<+obG@;eVIe?DyR!}HK>^X zC9@GFs+xN=j0pw1@vnQ>h8WCBYJ;F)JDKI}*yt!{lR(d7HjyE@7G?W?vNN)=udzis zLxyO@X)Oz=K8fTCAJX@v$0&>1jSmU;oEyiX;`c{hF}TLzpdf%0bM`Nqc)H4*ar|uK|*@H$oS^p-5lYGq+(WKgS{c`2828!gj zKolu8LmKVr= z@(EfwwUSPBcjZ<%T9VEEqZn;OKS`=Z4_EJpbUliGe6>XhH}aAlw$Do*J1E6Vqikp} z!RJ>u=H!rqLGQ!iT#C=_mJi4KBon=l@UIfsP;Gddxyk@@ zl$DC%Y=f~TGglx8tRl>Nn}zR3pa{mQ3PvUHGn^`Pk{$e2C4df*z&k>dNL`I1n9{?* z=cG{K37a;j*rncP>}AWUDW>v&Q0t+=x*hQ{3V)6EW($|~%lG2MnSYnMSp%eL$>+di zq(#K!@{4l1gqzV{U>Tifkrol@@{+nzfjxI z`Wi>{EIt$>#zp?WnS&H;mqGVQ`ClWE@jaV@9_l@;o6EO*dVJnvOp1B<_mw>&YKEc@ zwZ<#xti$@bM^Q`hD+0E9$XK#3rLT;()((MKq?T`wkS~$7@-tajn2aeG>(WMKGyWmQ zIpsZN_+jGEU@UKF>`CU0K#)A_@)upXtiaMs$Pc7>2y&N0cd}IZCTH%{+axr~GX5z$ ztUFouIAwP;*XmQSm2X6>8Xna;znQUTn)%+ylkVY3JIw0lv^r{s#~ahA43hxU1xYrT zpRkHK#`GfQy1$r0ATR#OT=PgOpLGtkB-WA<-G(2NnDMvca{LUVv`I+uTZ~^`r-y|E zU0gORZQnFk{6zB}d~r_vUEA(zGRU_Q>C6#dz`s2$WYI zl>gf-c`R5mdc$Xt6h|HljtsTB&eakfKPwa~z5v#xMvUdNxnK`ngHAAlh|LCLULmE{ zubV;$yMA2-7QAH;G*?;5~~(Ujr94zJF~%&u9)#}diTQ<4@QlX zT--zD6|Uy94E;kodkS5h;FBs$t`p_`|3(iw~bO^G5X}&zb3$#42P9TH^Iim4JQ`NQoN)Rn@FQ`fr zJ#{sz_!N-L*>cBTT7u6^g=x5G4IT)UuPz-%^Kxj)pP;3mh&U>IGyaQmmjoI^YY}?puqGP?g#K?c7~+rX>OeF_WkuF?u$es5Er{CiwlbH9 z3h&F*H_YX{dlMH{>{coTTQ)dXrMGP0Uh(f%d}z2)!>Wpm+S=n$Kfz822LBMY@240O zco;Awf7j(XmiC@eb#NKR0<9n?p;{Lk-Hg+Tl`BI3{z!+^lTjbxGe`Q=eD?Ue;gDX80riMI1?q^dO0mlnsDM!P6}Gfi7H*_7P;EB4#_Ks3@yLzNO>dINc%PH} z=)jUl#}@|6kRAwfs5Hsgi><@=894QEx;Gi<@W5^=`!W!bFj@wJQTj4)`)(@xq6n3h zp3XbieNpru!&mkNK<*C*r}#NiM%D*`%bUWjKY%vE_J`;R0cj;z1laziwy=HXVwu8G zKLk9Kv;7f~j#Q76jusKWkV!@HyRSsVtL3b;0t-m`#$Ml}T7TQ4TE7Vqs-cl&QppkS z+M`;p?NP0vPY0`W6eHZUN40J$uN4!0a7!zZHpGWb6$o}`1-XcFp2)?TP%fez(;)dG zi7fbbt^{Ph-4E9l$Kl(jTZ~RSWx6$o-X#Bj7ji&`;rk9Z%f13mE=Mg!h`b)}?PntH z4o`EuQ}Cpyu;Aa$CH^$znqRT7iIqJbEUz$f6p!zgZpf=iK{7+lS{f@Qc(#^&*SZTT=T9yswom2<1MBj z!qouqK&<1Mba&$x+6J)C@`#Ou^)DZ3PHjF6di^gX5{O=ftS+Ch_ zq1iirG@t-B!V8IN7{Rt-RbcsmvZ3$bs~G~C6aWJ(Hyedo*Or@Sh@lQ{`2lx0`^~r^ z{0u@>+`_TqYwE%F*wDK5g<8)m)Nr0Cq)H%ZRsrEO830eV5A-HoM$G^}bPU%j#N%g* zKLeE8{UkUpj7)HjduGTX@Ds(k8afIrzzr&b^SbsTg3b`h%%Z(64nNgkh8Q#&0uh54 z5G$6!U^$Nr@<|QY_{cB_2}#2vy&Q$RM|wG#R6;ti0{p_6?=w8jrho%zpTe@DDOybz zM_1zdKz>(@*e0N zqOV;l>qH%6OX@26WRKQWj7A(Kfadd~M9riru0P2mwpe@*V?rg9?uAf!jQTz~SRGl; zM+d`JO7|#-%~AhnV$@0XCH5g9@2{-EXfJ)&wE}~04&(bhN$c_|aJdTRFc>JV={y#D zMdZW^r9h}{8Wy5pKEr;zEiyi!1EH0cpZN7iVo>tYFflj6kDrwV&eNr0dz)mimqsX{ zDjv0Q8bZLc@|U8fL1;i@mgijVRy!K6$^+rnkusyW(R#ZH>c?3H;56Z@{DKK!sa&Nj zY+yIku(0yyVARPSz$D%3Ffm`pZnVLZy`PU@y0J6H97uz8wy2EWtBKmX?H1F3E7yBN zYF@@^aMfcEjdP655<#w429rbyu;*(a`w$YsRFRWR!*$-;3Ifb^+lKc^DY>2{B^3p6 zkRVKCmv;q67(O0%J!J!G^x2FW*w`AQMr|%-{N1G=!uymZ!o>ZPjjqz_UL?>4!-+S_ zJQ({LX9f5qR61zVk1Tyq#x7J7>tws6qb01B>RXg6}vzF5H-4Nubt)uLrCK0i)uW5LEYeJw=ZT@j@mjHp%qw;6b}2iYPe>U|1uG-;E2Nf0YJDN9w-c zvf_81AE-7$O!ak{D%5v^gr6Wt(%|;pRYzT8nvN*YD9&AKg;yZ#LSR8fN$?`fO>a9v zo|FVHWr=#p#oiTg`e%+bL0FO{==RyY=QJ5F>4v?cYNFCj51VA8pjaJ8EX z@dxVcn7R=FuQC|?7}%46_8u7v+zfE;sL%x+6U?9oe(Q!|3wj!GR0I(W2(C~glW}Wd zZ0G*XG}HbuHjKJpoDdPfoA8`iw2(+!2N6Sxx#_bN z(Qox4R?On%Dt-{d6_|VlUgKTMbOwg$Q~FfAEf4z;eyD+pWC7%W&?vi z$+vqWU8`^RhF$ynEnJE|9rcDRE3#e)7)qp<@Dncp$5ei`<3``xj z$h*cg%UDyiwkWOvMuBQfbk?xQ_+omiGJf_y*S~-{1wE zr{0j5^Dq0h=|p$%^mT+DP=0TfU7)EoNp~E|M}tB-7oEI2@3kX&uROc$`ufc}I}oh7;#H#(d0dh2GW5B{##UE%%FAnQ8Cc8n+-2s z7qoH`+8J)rR5P_R+@$dmb%w)+g|tH(j9Uo(>n8o{xN%gR;VvY{U?I~?D9V595cfH& zVER2ZDd=#IJ^)9t26KKB|Bbu6s18&x0Y@s*07?x(L;w}xe8qu^8eI|{@w^4gtwC0* z+1!9ihi_~)FJF&0V`0(3{oV`((7j{KI8@=(!)FFK;g(&H9HTI1(KU)6kf=2)GH#@S zPPaa%qnICUfgXMjRX7{_xR*z+M1M#Soq1ub^tz&^<R&W6%xPs63 zaP=chLG-hS_s}$e?>&@qEbMPvI8N^))+pKwKs}fPxSse`0RSu&^*=ZYZW;qL2yFZ$ zfSuOB#yVPqL)DHrZ^bi=;z}VY2X+R)j^GO#N;-f%zqoq9avdEw~x&TLuRK3_K5q z!yy>Tb{J$}Xp2=;d9)AKDOF~nN{&6TdwB6NOgO3uN&F-rnbMF%OC(!fyXxZOBh)EG zwF3hv?_J0?6#x$`1Hem_15cA}8o)!_AX^YC$<~?$(BUj1QONBhKnDj=NC;dF;6i{T zI%hI4i?0>C8622r3P{=>xjY050MEba- z6UF|}ps+tMWZT80k->k9>T%YJZh8cjhfL44bDyKDE4xLwKimgKr_#l=@VtBiA9S)peMA1CF0isR>21Ae6GmW6z6m!N6)}GrLC+kCd($v zG>)l`E!UN|jCS2RspX3;7vcaMI2&tfjWB0Gn_0ZN*y#|lwxxY5JKcbAe(9~}@-@QA zgbrpHl^aSqDY>&F`XO#xsSbiWn0K&vunqxvy@y*& zkpyY>!IJ7yAKGB9OUDFAF0~Z|iOt|*b}eL!k~)LMTIgdah0}XiLc+Kk2W8B85Dgf# zY?(pf31AGQh%Tn8P|W2oZ#Le=!o0~{mq(Y_Lk0bNYh|YmJ9A0}Goh1zf-0U!3l6Qn zh|A?b_-f#3&*d6-RuxfUyh=5S07yUU+dzY}O2|;sda1eTM5q$|y~VVzuw^hyq9DDs zShL=>wiauLwiGRJt#!C5J0qr`oPfmUFmfSJ13DTk*35*D1sQ}$RtRAb>|`d!lU1-$ z49*9kTMJPgRKXEQ4J=g$pw+cBoUpTvZy=F#vI~U;HUT`aS9OYV4STZ)J@64Mc?CU* z;m56%?RnhEFhrD62X>u)r7nZntpZ4}X!%|TlPI+cm7RVh(l|vTIM*tWsw9br766g9 zo7c^-KzKHEE=6QjZPO|?#UrBX8G9~VAK}e%Kd?-5t@rB@MFnDmG9DE8%805#vni`L zvLM7*UsQiDzik+xkCj^zQ$QYJ->oo(S{E12dJh6 zP6C_tPh)bp+V1Y#4`e-uZU#WdW~dfi^XHF&a)Vbm55@Ep=px;0y0%r&vpbJR83Gh8(C7xg8z4|~3xd~!2MWK~&GaBr2={_^Pqv5}b8MSCe; ze#i|G=pi3u^AnNu6YN2zDOgi-=N|f#V*K7%{uXu+`D7rnU@!ztlah7@e#J-ADHE21 zCDsFGZ=osNu5Hq|fTM!Eq|sQ9bAv)>SWPKpW4|BS&61ZNggP&ku9ix!c|PBfV$$g3 z{T@)IMP1PDGVudA5$={I*x4}+kV6h@@qa12j))FylwbfsCl!G7C@#c!-4{>%d9y;(DAYXnd z?w1_0T@DQJAg%@Ve-tcWfPhC4gEhfW03pQPq9-vlNP9zM99cRtX@NbQbdXIxSBT zvH%~Jokjl@oxEi}ABH_5lg>i4h!TLVYn6LlQZN!hNA$X&ZGgd|*M$r#0U^pty0PGk zv6LGNrNxa!;<^sN1Dqkl7b7xxP#NRk1V|^%+xb6o6}rL%)|;M5qsz+u(XsVu7A_#Q zLSz96c+f01C}b_jB^W79v5MzM&<{qB&es%dPKERsTM`iXIL9S2P%jBZQpq->BqiDd zS3#mN&{?QGL{@=FR=BRXRAu}alUfD#AOKJ?N|dWWi!fb69NL%=++-av@wp(lu>+5Q zYi@B<^$G?Pr2{Jo8}SZA^+bs=2c|?!B;w4GA#vsou}kN>UeQ@m1@IMIGV)+m*x{-$ zMGatrUKNC?zL-c>g|9FG@+MXVvx8M(`yvh-9t(>Zxa-JR^is&kH5epF0Y1o)-Z1Sz zO)1JF0_Z?>$zv!4@}DIC#v|4VrsNFb@nwXQOEN=kkQkQB-K{r>$fQtNJ!G}j*ksC-jGnS~Bv`u5*1IpcL!NmN(`0+yVj%WgiJ}P2qn<3%Wx58$7uUCO-W@Zv~YK{K4UN zb(G!vQ3CeKPEGiR5of)gqf`?c(RQ@yjW0W{I9iJ`zn2ze9v0|-I%DITnsTs&1fBGFYc{F;zc?nE+SO-(2?b0n)k{{!cjP~ zMoT;UV(;w^(9Sw4;08vl&RIrBJVL&xj#`eQqT&k$6O6++8XgcsolC(_^yC_}5;=|u zFBKLhyi}uf*SLGRxLi=dcTH-%+|OZr3q+0%do^@~&X+1j;h>Hgjqo=AUJ>5fW0`9Q zHG>ZejsQ<}1Jvbs6<(Py*xtuKL*^GnV$$&%4^I3%YlsUgde$%ZWY)ITnPmWuCKBv# zZfBq$27WRs91rqCyV-1n)idlG}HQ1TJ$H;4*^-tp=6U6wb3S!d-F$!rAi@6yEu^M$lQG7;-MdB8zm`$caEsRNtqfn6m2w32l zxV1_9(^`XdSRsDGEVn;RZa+e+*Fg^^6mZ~#b4XA;N^abL1yXhT`$EZbt`~Iy%_UH&YDjr?2Vp98zpIwJVE5prSA>tD490{+? z4C_cet|$#AMP{t63N@0(hy|!eED?PQlHt-iv|Obq%wuG@Bvq}4+#7bvLKKxL|17NH zMg!h&6+|*lIVpsJfm^@<35<}ps8Bz}7GPaB8V$lJQC9~aV*cMSXwaflBDjn+*1_THLF-=>)~N}c@pz0}E%N0(Qa+GwFq=GxoJ)z;k@ zE#B{;{DSx)2DMw_qc@Z{kzAAp_*Hyejuza%*jsS_g5X|(scT7ylLo0HMNCE63h9SI zJSkWDgV5y%C!yvrCJ4mKARvfZMD;)*V<+SbT(lE4Gf8%&u)jYKQ%bSlHVoP4(tfElEUj z`C)cM1o8=oUEmSA^<=(=Aujw zoB_8h;4lq&B{>_IN4O7!s|q0HWs6SqFc>P_WOlq$QG<*XH9+xMVby2>te59>kd!Z` z=JR|9V@VljNvj5&$0*iBHGfCNq4}G=MX2;X>(sZ_BZ0;Zcq4tp68DBsY`ll2O-*FO zM6=G|)_P%`Ic3`T8{@pQUM`h56{lrf875?r9H8_!AG2anavpW?C{H))D15MKfhYVx zf20m?aYNF>!6?Y3+$(m5_h~69NolF!!ui8#jD`Rl0)S8kEYv8!DAuwS5 z&4)q_BxCCc6U>Cs6L_;x7V{T%ff@@YA*feo687KKOiVU`YbzAmDNY6L+TfGv`BU@b z@32=JShOlIfCU2tIXjj004GnALDcAc(D(9f4YsYPdO88$mk=lf%SP zQZuz;GZnPkM7#L>5kyjl`J1YYL#*fi(=t;LhG{E4CKyCOlv5t>=};|VU=z$tEDG zC?XMtI}^cG7+c5~Oe8w7l8n}bW)T#EvW651Uc8p0#CRomF|C6a(E)=O^C}&OwHfJ& zUQ`ECn7twq3xQq* z2fZljxsKowjYpvMarH{Xk+!Z^uSV{hA6t_m|^dL%F#KT4SCc9Squ z4UG_HY$XOW=pj*<`77>Y3M!)n;d3gwJ92|I)T6T1UM;#CB5-uk-6T2z^vI*TRTYA& zdUSUl9?VE|w+|3(m-s9QQZO3boyRc=w`z2^W;fYl9oM)?#)Gd9#MsMN=0I0et6#@` zk5%uq&&DtxI?vw4fsfNmusjZY99GXiKpZ&Xtoi5-q&?87@X@j$@PLm(7?EXaMy>fM zl#PI;2YfVIGT@_OImJgMP8>o9x4j{7oZ=_jo{SxT*m4+yWUgaaBm_7PY9a(5X6Oc< zw}AV6y&MQBrVx~$mf$!jCft%0$;cxa%qO!&{C@dq1+F!rXB;Teyq4!ce6f!RB}UQ{ zO4L^dDf4k^#70Ct#$q=MRnt|;R?4`oG>kKMxL{Xj!MUwkqvjA;;N{I}9?T;UGJ_E{ zoKg*^q+tp8mjwl`oW|+eG5|tIhXBN->bnCVuv!&>)G~JmKms`dK(dA50H_;I0+6jG z0T^j+Hvp{MFaXGg0|07{R2hJ9ErkHg?jC?x0aXD=k+?ema>xk))>*>?P&b?eAX`fU zFw)#^09d(U0FVs_0EAVdWn2Xcg!UBz5US|zC=i^fDgf2ugB~=@66TN-0HnP)90lrz zlK^CENdQKg+YJCKHw*x>;Q)a8#FJ3qPwjMQwlTaHLpSBX-BxaxZBQ}}%4B-I){?*s zaTE}d!qA<`3=2GV2>y=nxUFs`dS)vvXRxRp%HcXk_#lLn@G2){am)`{T&xx?K9!}a zVRX8ph6HZUY!5~-Oe^4AdBpEQ706Pb#N8wyOSFcWscGWq9_N^eOfR*Y>5(og%nhnR z)wu;#$|lA&GO~%`U^;shU#f#y)x~GUl|nuECQ9Ah4jT-bhB+c_Ia^>B`@{Z}sS=lA zmg0?P&lG0GJxa{t>=`f{$}WW?FdrYYBEtklFe$3eUg$yBDgyv%JPv^H1X?Bf2wMRR z;5i{?>EERn&OuudyyEPaz96`k4tViXLC{Q7?}`oC-RA9ju2XXBz0a$Hx11MmUrbEV^G(J&b~ zj)t8E71>T!6LUw)E!i;l;fTkr88DF~K%A#n7=$5yMmc>1e{&knHR1QXTLjDwKfyHz zBRX|L24RS3SO;sVdUVG{if$;G4LR9$&P1qnhU;q^R=5aDU z5yud##3kK5)p6+nmo)$%@Rt%HOe+#cGcp7zDr)>X$gfEjQvC`c)v{mTJS;}S*XzU! z&jjtE&e1M}m9eo{D<0~cFU)G)I+(l6fm(p_@Wt2qF<0WD9#darHyo>`)ocgvK;K69 z{Fr+2sN;TR5Tk_BR5;Q>SH3#ZfrIJ1O#*{vygi6(xGPDJ>EHi?D{640WB6N0YAfAB zqJ!w^W|d$naAN>i$SXsKGfr?|(m1?;YcGI7Tu{_t@C=g)r!EjHyG?*JJ^@BZr?42t zvqUT)KyBtDAV85=?C_!l1Vqm=Q3a0&1fa7H^aw?X^aULqG>8)!vkGREG{8H2iqk9v zqmA?Ar%QB(+e>`nOOg6Y$vtPU+|%m;@S1@qX=BVltW>|J3T8-Z%` z3^+%YFp>&5Hv*i4p#bKJp~#&-!cf2*${C8>a$*EH2SWkQjq+nWI%I-({$QnmhrqPa zcm5#4Aadsqb`gA>3&x>P6ZyE{#LnibZrx8pdlk-kBa8n*kPmyFq^zW(0s zON<*HeeT!)-PLg5mv(-%w&W_4_{_x{oU9zkAL^XWA3}*pX=WKuA!CB7dFjqHpaa%`Iud2ocf`Q3-y=1(DL*R zzxaxK^{qLTA@{u3=&0C)wI^$LA-S64;(3ID2(<&x)8 zla4;5>6Uvhzi4gE&I9Uq9P!{Onb*Ga?*I7X1FQdX>)=E8PVN6>-+62Hzv}u)8y`C0 zxLeF~PWslg_buD?R_Cm*eeLzD-gWcPmUnJ^^g|!*f8fyk2TmE>_|y~APHZ{-taqOK z)sI~FrNbA019iKh^*i|1na>C@#pY^S? zmj9$T^{uAgU;WJAzW>CXcRqT}XOEe^;ij`cdHvv9XZ-9>-+bTf8~-rB`7e*n_{*bz zJLkl=onLoX%k7Wc+Wm>wKU+WXyA4Mgk^jbj;E%nJOe&ms%QLs$u+03QWncby)8liG zI{YoSx1Mv$>|<7+y5_XO=TE)(p6)BxZh2qoe;!)-(dS;i{ySsl-t%vdrau3X554yI zMRV)DEr-wg;=|8$4}9y|L)X1`qxF?rCY|xI+?Bui*LhFhv*CuWnQz{5@@JoJ`djA2 z6JCDVIN_!3-+SNRK6U-)HoWVPuhb7NSTm{i2krY!{qhISuX*R(1IC}wxZvC|FEriL zZ{PCXYrVVQ_HgQfu4{J9`u#&6X`b-h2M@UBjW5r8DgDCRezxgPiynI7wRzKK8s|Uv zIrGgOUmJhSmh(4#=$7aI{Q3RX|E2qz&z=6>51)P2RO8R5yz%my4PX9b@yRu>zVhPs zLymO+yY2TEJ?oucD(0?gc<{o1x&F$o6V6|F{fiIuzOVV1#shMH&Ru?X>+L7rarCFR zeP-oJ-JyWT%;=Cq&OYwf(C_4tl$;}6UJ_LK*1bN*@ezs;F& zM6T03>FoP%JL`%^o~XO$swb~Ly!P22KlSltZ@IAjPapjEH&%RU?PJd@J+S+G_G90; z_7Pu`uay*@SJg~9g@Ex7%$9WQ=i_Sm0!J6^u~nHTSyc;HWdf9Lxr{_cv? zn-6{9!~1>XqEoCXKb-SS=hJ_ha@y9DX5aL+^PYO&DZjgC@;!~%d`sDG> zfwNb=KIx1#(;uGqqr)G}{QTz~H+*GX&rgnjV(^LY+|e}e>7L`K)g5@-*{?tR)q^+x z@!V-|4&L(4tN!`Uma{(mG9Kl{ow4D?$f$^!8_FNl6ftC{iWWnQh$)L2wa8l zXSQ^9mU=H)G9`FAHh7w9bYI+6>NN&>miM-_wk+)|84LT#k`^voQEDCNEV(MDWGrau z>+4_9+dZ&+MWpmpqqMrGvu#;he^9Wu)YI9rtmL+|u59Zv+C2H`=`i|A{Vr16mY$y8 z?p3AUKBH@3rQro{=ag25jm%Me^1NVJ$AL+9wp?P&i?tw)_Zj^%@VQ;BrPan+rAv&3 zrT+f5uH}8k{4Q5DQED|7^p;k+?6u>2O8H-yw+ge-tyLY-@))LaI4V&9Hqd9B*1d9NTc5PPxSQR(3%V~Z^}0u~ z02(~Eba6{>tGl4o)rw62^{B8(0)C+HydLygGQ8GSRUzz1=QMYBwJuqoYvmSyeLL+0xbt zxGfy$>%o}u#73CV+0wTn?5NLpw?bBP%d(En?&WSzskg1W)tJ|^+P&C^Y^#QMkRX_w zd|H2}ae9|vPbCDXP^qoP*)4tjVKb-qbT3;Gyt=)ml`U;ugr>@99q4V5>8e-1F}JgA zC2*}M5$k2LESxhzkDv)Gj_zfEc&l+nOE2hiIVh%8m393FjF#U1B>>xk-nM0en$uUW zXj_UVdpd-G`r7`bg!y*0EH8Pz{Xm4#)v^+6sMN1&G!I;2tZ3;Y8Xy&;ntN^uv<|d#1)W=JEv@X4WWCbP>|W(A>h36Y8RrZD%e@#O z7O6WQs0U?t0{0y{>9o%7zLI{P*WKE7;U&fy16{3suD5I%sRv}dw5_wP{}RxDcPH3_ z(DON^i(OCYK>nagE|i{CC9WK*MjTTK3_%qF4BWDo^mlcV%~L$#@S2bWXQ%Mycd3?d}FD zRZqrTlne*dgQ*$KrIwZFtG^&cS=}K;qHG7LNex%cnLttR3rf9{dq5H;_w+6-M_@*? zodq36b8lPga%8OT>F(|K-{!8Aw`JYk9c_X`NnJm2tMP5kVlBBo_0$Qa^+y;E6TGsUz)J{+Wt3+le`H6&PoCUo0?zu$u$r z-;hVX zhCEEg0~-+Poh*b5n3NPvMiSNIIXx?kr9$i>-2y$rF}X@Xrb=`MOO$eSw$F{vrkGhl zLRa|_zU}i|pL0jD{E=ghs9$Pz!6e!`brT>jJy?>7!mLYRC`<{AIjdvT8V%n$l`z8{ zz{=}W3CPi}RKs)8ihr@#u;gqYulbBcOJ*;a zzfe6bT;we>z#}>*`+8yYC88Y0l6?(P5<@jH_Ij*p*3X@4DE2zla90`UlzLY5wm}S` zQ#F-lh&5yO>E|%l=q;7<`8iOz6wg?=qGjr|>HF0%<=q7S{&jo=-3f0#Aj>ya8ec2* zJ?b|HI&)e&`wyyJUg}?>`1ZkL`0SAw=XPD#J>f(J5XC(fwk_`}wKhP>>~)uQclGtZ z?P#pNK1qer2&u+DM^iv{HooO;yQ>=1Xq-4ZTDG}u`R@Bj_S;zBwW_O@ z)<(6csp-7AUHvB?KQObY336g~+bRgYwpJt@?H)TYv!Pn)Nk><12zAulCp8{2FBk;) zyxZK?e;zndUsF>n_`f`WEh4q=T~a&olB%!cS&hJQ|X?@AaV z|5Dl~6FF>{p34Cj>3Q04Ae=TZa|9qfe5OWxTdN|mDu@SsE0J2G>y_j0jLz%74GLr1 zg>B3J(WiFg$%<;RyqCoZwjwSflnYvEJZe_OQe`wNN@c*s;+$gA2_tFYv~EzyYOICR zS~{0e%$6D&-+E5Pn$55{(0|)1AM#;;0h5l*B1mg&cz?jcf<#yR8&NJuf5*wkP9YCG zx23JG6mr3!5}5InfzHk{me_dE0!YMCZ!i^kZD@Sk;brObyP$JJb6O(mMnmJJpSXR>ogQrB!f`lcDPL_N) zd+`{sCMv8mkJc_kF$v-7g z3+%tyXtZW9vJUc@f_s?EBW%kQgEYD;Qpo)>t|z zL5EAEbzfLDMElZ=*C&|^&xvMIgPUSm>Y=c#4OLFA<`i-R@cCnUADm1mbVfVIfdZFE7)7OC1dZU~!D{HCdi zPKQOSrHmTi+Zww@uXKg&N=yDCC`*nJepy}_v6tmeYV6*y*N6(+963KMuQRE!XZ>Ce zMC))(O=>qb29`K=1te2eWm4lshlfL3(9)*upL3VN?V&35E(!~%`GO5_W3{PiZeMe$ zv-{!*HL!)CuZqqo-D=;oWUC}0?puoQtmTplLZGpKlO-a2PWQ_0<)yCffj(~f0RY@3 zka&=ju_(bl;AR3VJ-NSkpma1M5cs!@wEh02)D9oAZ+Rgy!GAfN}huu>^kA|7ppL{Qb70+g2WEG?x#U%XEIQD(+#$2;~K zCmZ$9P3w7jJUcV~vfRYPy^MxM$j1HCY?v$pN4Er5th7-tQ`DC0k|Fk&F8y>dr4u zpr0SLKHZ`ATr%gJ@&;0+UtARivhS(;alWVV!(GG>@d>wowPw9MY;9JQe~wX6LZvrl z4ag>$(U(=fFdxG(de#1IAX(>_B59P~>WPiPI|?1VaB;}6WG#Hl*Y`VDkq zt6V)9Nk?ztex43w$FPX8_Y*p4Q`hMoT#FIWV36QVQI6&fW;gmhv_E!Ih3s4sB~Czptt^z5a!xzW|0QAas4*smBsLPjrB#&M1eM!$qIx|uRg za%AvuA(YX{lyRDhy##uPVy`h260zrn!dXf*ZfEU?dtopG;LwjLMbE(MpHqsS!OZ9v z+>`C1fo^cGMUUh3?fSJV2xhMLzJ_M;$-v@|e#5Z=>&TTsGm0(pQrYJ&IqY-Y>MA9N zlHCeZt~58dRnz|m{!UyojGJ4QW`^sHhGDzz&88!?|F=cybLtWTgXz7uF@($bNZ)u^ Vc|7-U1m_<;#joUC=yvAu=O0{(ZNUHl diff --git a/bvm/Shaders/Explorer/modules/amm.parser.wasm b/bvm/Shaders/Explorer/modules/amm.parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..038b73e2d386093771fda15536bf22d410434ea3 GIT binary patch literal 10595 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 literal 0 HcmV?d00001 diff --git a/bvm/Shaders/Explorer/modules/blackhole.parser.wasm b/bvm/Shaders/Explorer/modules/blackhole.parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..bfaf64b15df2cb8348bd53b73c7472d2572dce8e GIT binary patch literal 894 zcma)5zi-n(82vum`O&x`5tSH#!EL1q$vE@}6B1HQTQvxEK(HVoC64_ixV3%ed~V5t z17%@hLSkZIf`NenCN>rr`xhX@%0Ix!UD}2s1~}>Nd-we0v%mKayevilz`1f43+QTv zTmZUyQ50BoOR^|N(pYF4hEB<@xz2ny2sSy(Qvk)(4w>8ZKmaPDE{U~>WppUg6j$D& z*iVO`>m|b|At z7Qr}%D^NOyOHe+B%TTF(N23ky+tHH|G)HoP`$l2+#h7`d7;V+kT~A7 z7tMu#eA3Z@|0y#AgmK^Qu2UvB8^SuJEDHs!aqsbu`}ZGCeVaLVF#qvt5I-iDyfdiF=jP_?P=rHH1owv%nJ`T$)NH%6;M)PD|)h zmQmpJhIp#YV(M|)v;4?Q2Ib}D)>7*-JjaIc_<%&GFZ+^n%Br^6%cC9VFl~0@#KvK% zu+R8j6gje6AtzrrY?pY%l7U@|^GJldUX+vFh;!lfB60>1>v>UT&m=4n+)L9i894n^ asNmWSPJQB(_~eLTN|{~F!a?H5+wu#^JPKO? literal 0 HcmV?d00001 diff --git a/bvm/Shaders/Explorer/modules/dao-accumulator.parser.wasm b/bvm/Shaders/Explorer/modules/dao-accumulator.parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..564f6fde0b8b489cf210621672650a6ea53483ab GIT binary patch literal 8718 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 literal 0 HcmV?d00001 diff --git a/bvm/Shaders/Explorer/modules/dao-core.parser.wasm b/bvm/Shaders/Explorer/modules/dao-core.parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..773b0535c07c873d2260d0ffca2f045a9b81c1b9 GIT binary patch literal 2142 zcma);&u<$=6vyA}de@HEiQN`TNebOW5d^GFo1{`jPn{;vmXg4sRXHFz6Ys=zv%i>K zJNQto3#F>~AufpD5<-zs4ybVGp+_Ky3V}qBxKIhiKLCOgLX|3J*N!{02nk!-eSV*r zH{Z9jZ=QjKE&>2Fp)aEtmX(-a0G8D_j#0d<@mu2IZWJpQ^D6b)#)4nRwta&6tpFhL z6nmaC^o0me;uz+RdB+cFZ;+Ds^hN5{gAS-d49pnm^kVd*F16gb*-Vh$C`Hw^9B2sT zG!!6&G!=oO7f_6Fx0^HaCw1MWuFpCOlxwvxBK5Ue;5WU9G8GDoG&=9wwL_5KG3Q`t z$DD!UjyVfPacfAs&KHRBuieXCsC4-U@VAMLKTSQCQqN{$k88@YyI)fo(Q~Q>NYM>CZ=$IhKV_hW|)-3SO!X2?9W0m zjR&$&%;P~3#!n9F=Rn_IxssOA5qV$4Q6Jhn#*tmlKNGlbooO7R9c`2DP znwS^H5wA;r15?5Ag$ZRC36z!6 z(RrJZb-+Qu{5EAF1cVVcgn33uL}7vW*1XRsJV6+r&@j&iHn`~l3TsWzh7&Y0pW$O2 z$FK7VHe^2Q>Z_MZ2ij*gZykT-gYDe@iCwmP^oLJ24$rjTnA~T5e0uA2;}+Alj{g4I zk9WTR?%K7RuWuY&xbp5(@4t2N;Uho)^~G}w@BI1n@!Q`Vxqb7_(qoT4Tl$P_e)*yQ z-rpNzqhC)=!Y?T25tl;A;L1bFrq`1;wuwq0HYX(XB}HyYYQG!h`s33UqlrC8A52Ku zpluu~OrB%Sh@K4^jMy}Nq~Rh7*QQ!t*lc*zHhIr^WYAmY2CZer7&MvuZuGAvHB>~9 zpJu*IA_518_}191I^P^r;%1$OA+@cQ4jMV>yL5%ob+hgeuc6P*PR~pqhBr|;BCJ89 z+A80}7NcRIYOJ)JHLKSYt7YMb;-RuZ6W5L`i?GmKj~8jCyryMV)|#)k5+hEdFocAH5cS AbN~PV literal 0 HcmV?d00001 diff --git a/bvm/Shaders/Explorer/modules/dao-core2.parser.wasm b/bvm/Shaders/Explorer/modules/dao-core2.parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..6d1d1ace9157fb06de97f0388410b9d7f73c47d8 GIT binary patch literal 2073 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 literal 0 HcmV?d00001 diff --git a/bvm/Shaders/Explorer/modules/faucet2.parser.wasm b/bvm/Shaders/Explorer/modules/faucet2.parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..004cc0033b722abe6a681655a62d287dc00386d3 GIT binary patch literal 2030 zcma)7OKclO82)G0>)2j9UV(%VT-E_aiHt+@P!6UFnI>*pL3*GS95^^@@5EkbU+m5% zwFGri!s`MTIDx0~IhZae4$ zh=aE7w~1wKgnk?V5|Tn9xkN8Bz+)yCVs~*Nk(9W}n&U?_aZ`?4EiXZ4EYKOpZ-FWV z`RC0rYBs#sg{(N2X7 z&AQa}!#;*`vl%h7z0(YQ+ha6TAh$_b*SDIBP#ChOKpV32P#m%gP%8YARnH?dz^eu{ zN?;)QAh1!vJk#MmRFJ||1|o*O&p+^pV0#s0fFNLCGU!d=5@;Gh+6`XnfZRLae)@s1 zCcg@v+?A56Qu4LnD=JKLTM;90R2^wRzDm)%NqGS36_R3R9)7lC05!r+`os^>|+JFX^GS0Co>g)c zg?uEsN(b<*upxJ(BpLj*WF%+M%lc~~QqqO+)w%EcqoPRSd*h_9`&a&oBtQ}ofCEZAtmEIU^3Gq75(*57wJY4GHi^mq?as2V+aq@J?TelGJs5p zpZT=n9th){VgHjT0Kp~R|p%1!ULRr zNz)E60{MUa8{Izq@Rg@-#ee3?=7fBohZV3h7^p^I1b}62v$;sMBmJD;8jPu z<)v)uB;a;pgtWQiAe%3Y@bw567mr}^)DbGqmyYmp@+xZizGF1J-Flt7KSxcAhKUBB8m6`uEHQK%xvFU$%OwUd{ zfKGsXzJOq2F7z#vneb#j;2fWK7@;C(+cb)(RcrOpA^t&r{+ZO8OF*@cC<`MD){ z7nPYAb|`CZ^Nq$KjdE436+1h%Z0z{LBhS`O(p4XM|rHF1%mYEI0n#@~Yf E0N>kl*Z=?k literal 0 HcmV?d00001 diff --git a/bvm/Shaders/Explorer/modules/gallery.parser.wasm b/bvm/Shaders/Explorer/modules/gallery.parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..737b3e9a73a6dc9c809c06499e8242b32620cbd0 GIT binary patch literal 3246 zcmds4TZkJ~82-;pCYxj?o1h|Ukxo{(bQ`nnW=q9B*q(N4n};n$YXuQ@CzI3cB$-QR zCc7Iin{BOay?|D&7qIG!Rti?Ih%a7>7leW$SkWgbRwzP+f>!z<)N|%cveVryloot2 z%bs)o|3Byd{#(xZ1Da3arb~5dQz@#B#L&GkE$QWt5V`Ibi2v-q{ zDBapLhl~7J2tzq*R)ZATgI!l^ap0~d&Wnk0Dc+M1gqVaJgped65aJ2cMtF8MCiiTK z$4z3|ZcBj7*qG;QdVS2X4a+C42#HbRPuP{QVMukBt3d87halZq7NIw_FDq?Ds4c8l zVN)7Z6bx8Y5f)2Jasq|hI}14^QaRU&NBqt-%7l~g(<`Ega^M`gU1?aBc+b+J(u zdNXoLp;?v`ML~&pGN#CC4ELAPGJcbt#&7JVBUgxz1naBKs5@@voe_9CF!xb8JNpAyXmbfk1WO{`ErAz=*iNriv7^j|LW0Hk6k1L8lIA z)7DAYd*9Q}76=Zylg+2%2RilQNN9ZHH+Rj6bU%awU zzqr{0!6g#8gE23{qmeHqFG3W(U+}^c3*#&BvgNjApJqt%kM!MYhp#}k-Y0NdqU!#` zM?kpj5eTU6BS0zk2nf+fKnNcJ?h$?9vYlA|Pu-G#7Z7`mWAbU?rpNwvzgU*L=kTew zUe(bB{ewemPnP*0}=)9W7J_{5oYQ^)Q7Ge;hgE_`Ob_{+IhzD}2pfBTK} z?(@%FJh`j11Rq(t{^;kY?BJNIv1&d5=X}O!J)y`@G{Eynp-9Q*iM?VCQWf7FPEE*dV#md`Amc;*p8pSS*OKUp!qXgqWcAV zlDN#?e9CM#d?P4}e8z10TDd_ARhm$(;pK0%Y|D2w$1$vGVW;D>ZabfG39T$*>7>9a N#mgsHNDA~9!@us#*1Z4# literal 0 HcmV?d00001 diff --git a/bvm/Shaders/Explorer/modules/minter.parser.wasm b/bvm/Shaders/Explorer/modules/minter.parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..7892f6a98835c4b9d180b2e59c9e3515e36fd66e GIT binary patch literal 6952 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 Rxk#TXU&bU-Mjh#%(xVAEOrY}3w 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 a^Tu}kXxxscN8_!mt!6hDn4N8f8T@}^-!Lu! literal 0 HcmV?d00001 diff --git a/bvm/Shaders/Explorer/modules/oracle2.parser.wasm b/bvm/Shaders/Explorer/modules/oracle2.parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..6a0fa086105afcf80e1b580e150c5b1e0daee599 GIT binary patch literal 11394 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 bSw{xz!ReqLRHuVc+U6P~2})n1h=~6M*`EE% literal 0 HcmV?d00001 diff --git a/bvm/Shaders/Explorer/modules/pbft.parser.wasm b/bvm/Shaders/Explorer/modules/pbft.parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..e4a7929d1622fc806eb88e48d84c6cfdcafcb31b GIT binary patch literal 21895 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 QF$ZhxNHH!R!dpcD8!z8|j{pDw literal 0 HcmV?d00001 diff --git a/bvm/Shaders/Explorer/modules/sidechain_pos.parser.wasm b/bvm/Shaders/Explorer/modules/sidechain_pos.parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..a05ba4173d62184dc312d77069acb7b927c97da2 GIT binary patch literal 5288 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 literal 0 HcmV?d00001 diff --git a/bvm/Shaders/Explorer/parser_common.h b/bvm/Shaders/Explorer/parser_common.h new file mode 100644 index 0000000000..4be51ac1b1 --- /dev/null +++ b/bvm/Shaders/Explorer/parser_common.h @@ -0,0 +1,313 @@ +// Copyright 2018 The Beam Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "../common.h" +#include "../Float.h" +#include "../upgradable2/contract.h" +#include "../upgradable3/contract.h" + +template +inline void DocAddTextLen(const char* szID, const void* szValue, uint32_t nLen) +{ + char szBuf[nMaxLen + 1]; + nLen = std::min(nLen, nMaxLen); + + Env::Memcpy(szBuf, szValue, nLen); + szBuf[nLen] = 0; + + Env::DocAddText(szID, szBuf); +} + +inline void DocSetType(const char* sz) +{ + Env::DocAddText("type", sz); +} + +inline void DocAddTableHeader(const char* sz) +{ + Env::DocGroup gr(""); + DocSetType("th"); + Env::DocAddText("value", sz); +} + +inline void DocAddAmount(const char* sz, Amount x) +{ + Env::DocGroup gr(sz); + DocSetType("amount"); + Env::DocAddNum("value", x); +} + +inline void DocAddAmountSigned(const char* sz, Amount val, bool bPos) +{ + Env::DocGroup gr(sz); + DocSetType("amount"); + + char szBuf[Utils::String::Decimal::DigitsMax::N + 2]; + szBuf[0] = bPos ? '+' : '-'; + Utils::String::Decimal::Print(szBuf + 1, val); + + Env::DocAddText("value", szBuf); +} + +inline void DocAddAmountSigned(const char* sz, int64_t x) +{ + if (x > 0) + DocAddAmountSigned(sz, x, true); + else + if (x < 0) + DocAddAmountSigned(sz, -x, false); + else + DocAddAmount(sz, 0); +} + +inline void DocAddHeight(const char* sz, Height h) +{ + Env::DocGroup gr(sz); + DocSetType("height"); + Env::DocAddNum("value", h); +} + +inline void DocAddHeight1(const char* sz, Height h) +{ + DocAddHeight(sz, h + 1); +} + +template +inline void DocAddMonoblob(const char* sz, const T& x) +{ + Env::DocGroup gr(sz); + DocSetType("blob"); + Env::DocAddBlob_T("value", x); +} + +inline void DocAddPk(const char* sz, const PubKey& pk) +{ + DocAddMonoblob(sz, pk); +} + +inline void DocAddAmountBig(const char* sz, Amount valLo, Amount valHi) +{ + if (valHi) + { + MultiPrecision::UInt<4> val; + val.Set<2>(valHi); + val += MultiPrecision::UInt<2>(valLo); + + MultiPrecision::UInt<1> div1(1000000000ul); + + char szBuf[64]; // little extra + char* szPos = szBuf + _countof(szBuf) - 1; + szPos[0] = 0; + + while (true) + { + MultiPrecision::UInt<4> quot; + quot.SetDivResid(val, div1); + + szPos -= 9; + Utils::String::Decimal::PrintNoZTerm(szPos, val.get_Val<1>(), 9); + + if (quot.IsZero()) + break; + val = quot; + } + + while ('0' == *szPos) + szPos++; + + Env::DocGroup gr(sz); + DocSetType("amount"); + Env::DocAddText("value", szPos); + + } + else + DocAddAmount(sz, valLo); + +} + +inline void DocAddAid(const char* sz, AssetID aid) +{ + Env::DocGroup gr(sz); + DocSetType("aid"); + Env::DocAddNum("value", aid); +} + +inline void DocAddAidAmount(const char* sz, AssetID aid, Amount amount) +{ + Env::DocArray gr(sz); + DocAddAid("", aid); + DocAddAmount("", amount); +} + +inline void DocAddCid(const char* sz, const ContractID& cid) +{ + Env::DocGroup gr(sz); + DocSetType("cid"); + Env::DocAddBlob_T("value", cid); +} + +inline void DocAddFloat(const char* sz, MultiPrecision::Float x) +{ + char szBuf[MultiPrecision::Float::DecimalForm::s_LenScientificMax + 1]; + x.get_Decimal().PrintAuto(szBuf); + Env::DocAddText(sz, szBuf); +} + +inline void DocAddFloatDbg(const char* sz, MultiPrecision::Float x) +{ + // convenient for debugging, to try the exact values on host + char szBuf[Utils::String::Hex::DigitsMax::N + Utils::String::Decimal::DigitsMax::N + 10]; + Utils::String::Hex::Print(szBuf, x.m_Num, Utils::String::Hex::DigitsMax::N); + uint32_t n = Utils::String::Hex::DigitsMax::N; + szBuf[n++] = ' '; + + if (x.m_Order >= 0) + szBuf[n++] = '+'; + else + { + szBuf[n++] = '-'; + x.m_Order = -x.m_Order; + } + + n += Utils::String::Decimal::Print(szBuf + n, x.m_Order); + szBuf[n] = 0; + + Env::DocAddText(sz, szBuf); +} + +inline void DocAddPerc(const char* sz, MultiPrecision::Float x, uint32_t nDigsAfterDot = 3) +{ + MultiPrecision::Float::DecimalForm df; + df.Assign(x); + df.m_Order10 += 2; // to perc + + MultiPrecision::Float::DecimalForm::PrintOptions po; + po.m_DigitsAfterDot = nDigsAfterDot; + + // remove unnecessary extra precision + auto df2 = df; + int32_t nExtra = -(po.m_DigitsAfterDot + df2.m_Order10); + if (nExtra > 0) + { + // loose extra precision + if (df2.m_NumDigits > (uint32_t)nExtra) + df2.LimitPrecision(df2.m_NumDigits - nExtra); + else + { + // loose all, make it 0 + df2.m_Num = 0; + df2.m_Order10 = 0; + df2.m_NumDigits = 1; + } + } + + char szBuf[MultiPrecision::Float::DecimalForm::s_LenScientificMax + 1]; + if (df2.get_TextLenStd(po) < _countof(szBuf)) + df2.PrintStd(szBuf, po); + else + { + df.LimitPrecision(nDigsAfterDot + 2); + po.m_DigitsAfterDot = -1; + df.PrintScientific(szBuf, po); + } + + Env::DocAddText(sz, szBuf); +} + +inline void DocAddFixedPoint(const char* sz, uint64_t val, uint64_t one, uint32_t nDigsAfterDot) +{ + char szVal[Utils::String::Decimal::DigitsMax::N + 10]; + auto n1 = Utils::String::Decimal::Print(szVal, val / one); + + if (nDigsAfterDot) + { + szVal[n1++] = '.'; + + while (true) + { + val %= one; + val *= 10; + szVal[n1++] = Utils::String::Decimal::ToChar(val / one); + + if (!--nDigsAfterDot) + break; + } + + szVal[n1] = 0; + } + + Env::DocAddText(sz, szVal); +} + +// Upgradable-wrapper helpers. Free functions; do not depend on ParserContext. +// Per-contract parser modules and the explorer host both call these to render +// the upgradable plumbing (admins mask, settings table) consistently. + +inline void WriteUpgradeAdminsMask(uint32_t nApproveMask) +{ + Env::DocArray gr("Approvers"); + + for (uint32_t i = 0; i < (sizeof(nApproveMask) << 3); i++) + { + uint32_t msk = 1u << i; + if (!(nApproveMask & msk)) + continue; + + Env::DocAddNum("", i); + } +} + +inline void WriteUpgradeSettingsInternal(const Upgradable3::Settings& stg) +{ + Env::DocAddNum("Delay", stg.m_hMinUpgradeDelay); + Env::DocAddNum("Min approvers", stg.m_MinApprovers); + + { + Env::DocGroup gr1("Admins"); + DocSetType("table"); + Env::DocArray gr2("value"); + + { + Env::DocArray gr3(""); + DocAddTableHeader("Index"); + DocAddTableHeader("Key"); + } + + for (uint32_t i = 0; i < _countof(stg.m_pAdmin); i++) + { + const auto& pk = stg.m_pAdmin[i]; + if (_POD_(pk).IsZero()) + continue; + + Env::DocArray gr3(""); + + Env::DocAddNum("", i); + DocAddPk("", pk); + } + + } +} + +inline void WriteUpgradeSettings(const Upgradable2::Settings& stg) +{ + WriteUpgradeSettingsInternal(Cast::Reinterpret(stg)); +} + +inline void WriteUpgradeSettings(const Upgradable3::Settings& stg) +{ + Env::DocGroup gr("Upgradable3"); + WriteUpgradeSettingsInternal(stg); +} diff --git a/bvm/Shaders/Explorer/parser_module_abi.h b/bvm/Shaders/Explorer/parser_module_abi.h new file mode 100644 index 0000000000..f1fcfd4388 --- /dev/null +++ b/bvm/Shaders/Explorer/parser_module_abi.h @@ -0,0 +1,73 @@ +// Copyright 2018 The Beam Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "../common.h" +#include "parser_common.h" + +// Per-contract explorer parser module ABI. +// +// Every parser module exports four BEAM_EXPORT entrypoints: +// +// Method_0(sid, cid, iMethod, pArgs, nArgs) — parse a method invocation. +// Mirrors monolith Method_0. +// Method_1(sid, cid) — emit kind / identification only. +// Mirrors monolith Method_1. +// Method_2(sid, cid) — emit full state. +// Mirrors monolith Method_2. +// Method_3(out_buf, out_cap) — return the SIDs this module handles. +// Two-call protocol: +// call with out_buf=nullptr, out_cap=0 +// -> module returns N (count of SIDs). +// Host allocates N * sizeof(ShaderID), +// calls again -> module writes +// min(N, out_cap) entries and returns +// the actual count written. +// +// Method_0/1/2 keep monolith call shape so the host's existing wasm-call paths +// (ProcessorInfoParser::ParseExtraInfo / get_ContractDescr) keep working +// unchanged for per-module dispatch. Method_3 is new. +// +// A module may declare multiple SIDs (versioned contracts ship every entry of +// their s_pSID[] in one module). The module recovers iVer by scanning its own +// s_pSID[] inside Method_0/Method_2. +// +// All output goes to the host's doc stream via Env::Doc* and the helpers in +// parser_common.h. State lookups go through Env::VarReader keyed by the +// passed-in cid. Modules are restricted to the manager-mode Env import surface. + +// Convenience helper: copy `n` SIDs from `src` to `out_buf`, capped by `out_cap`. +// Returns `n` regardless of cap (the two-call protocol relies on the unclamped count). +inline uint32_t ParserModule_FillSids(ShaderID* out_buf, uint32_t out_cap, const ShaderID* src, uint32_t n) +{ + if (out_buf) + { + uint32_t nCopy = (n < out_cap) ? n : out_cap; + for (uint32_t i = 0; i < nCopy; i++) + _POD_(out_buf[i]) = src[i]; + } + return n; +} + +// Boilerplate macros for the common module shape. +// Use only when Method_1 and Method_2 are exactly `OnKind()` (no per-cid state body). + +#define PARSER_MODULE_EXPORT_SIDS(SIDS) \ + BEAM_EXPORT uint32_t Method_3(ShaderID* out_buf, uint32_t out_cap) { \ + return ParserModule_FillSids(out_buf, out_cap, SIDS, _countof(SIDS)); } + +#define PARSER_MODULE_EXPORT_KIND_ONLY(FN_KIND) \ + BEAM_EXPORT void Method_1(const ShaderID&, const ContractID&) { Env::DocGroup gr(""); FN_KIND(); } \ + BEAM_EXPORT void Method_2(const ShaderID&, const ContractID&) { Env::DocGroup gr(""); FN_KIND(); } diff --git a/bvm/Shaders/StableCoin/contract.wasm b/bvm/Shaders/StableCoin/contract.wasm old mode 100644 new mode 100755 index 85afb38999f144d5bd2d7fd636806797b2fdc939..0b8fa14bf92e7ca8f793a0409a32839f1b6e2301 GIT binary patch literal 5124 zcmbtYL2MjJ6|L&->F${xXWB^!5kjK6iB>Z>6Oyd8V;so3lWgR$Yhfj92z#+7iXB}aW9g^JySRyavz;fb%GzU0vL0SofRtV67ID`{fi9@8l>=6keafA1(y4!6h zijc6SnP0!^|N2$+|NDPFtM^wpV~k%c&hst4HP6_*wnap4i~d09>Pw9oR?&(91Aia| z_<$s6j8E-jUed$PP4jYiBUo5qj0VPZy&W-5q!aY}VRXJ1)}xSV#Idf_Z-!UvJ*Lai zYu)-nIx0ZR<**&r`=QcQl;Rh{e$?yUQY>>OT!BhvNb&RacKaffW$^O)o!yBg*}}a=c8_qm5dAY<=Qi0 zwA5XgJIxL!D+#ck`5e60m z<=&G<;HGKsDm(QGO$n`{GhY|HqI(;@QPY_)g#N||SMO5fSf5?v8*e1mN*T|Pv!3oi zmoAJ=Xh^p>jV+Y8t+uG_6R#+7dsp1o@lx1TS!VkN?NZs0Y|_8GI}9f|c^tg|xNn^M z5B^Gb{G2k_Ovcv0x6g_D!oUX_UpKQOXycexF`($qA-U3$R+TKV&qlu z^2E#S<=I2w48JzQoiu3Zq$g+98=qkhxS-b-EqpxSE%%4?;&hW$c5RYvb9Je+HGN%C z(=~lnQByU2Nl_CueO|rUQD2vugKCFA)jbjg+--cq6AyvH>@ z;9Kw|#ynl=tTNITFrmBOC)H3R2k)q(U@6>7p4l@J2~PXtd6k5mB%L;H;0Gj@giVQ} z2I~SI^Anic6>-%*&QEk1(R?f5WEpwe9#qL9w#Qu*9j&Bi+0$_%x>pS0m4&uKIpLN$- z&8D089fNNf1AWUG#0hjqOA{!>k+!Ds^&tWfHyHek?=ylJWQCl_m_aTUc(LSDsX{5t zrVIB0+3RVLxUHRG7x7v^WMIgIqNaiDtfHTj$>Sun%k+`>JH}W&0Z7K0ulh(V@r)eP zMYG^{tmT{cgJ`Wz_{Vb*6 z+CBvm^PeMZWiemX8o1NP90@qh<*;iSsW=`x17BhkWoSPy93)klgY$@Qa0 zJ8|F3lhfr;*~ABO2g=~QG>(iG`MBb1r#l@5@X<(ND{D!RaC8j zOiP+%FOtACT{~h8pE3oIYAR^}@F;HNQPUuBiHD4k4UEyDC}m5U*tvlR!5`VKV{25i zAY&k3QOzPL)bvZBkTAWPzD@27vQpFU$K8dv>7gA8dG=5B;&@mfj( zm{#?TG(ksn!?|U>ZVdqr8VYnmct;fDdflOlCd)%jQ`qC&@S;7Qr7nA_#wzi(*O-UL z=V#a{#aN{uWb#GU)h}4wC?PietOZFxPQP`5`#ZpWp&SRbb5dkHN=sm;%o$J|8SbM$ z{B?b-I@axvzx~^3=a-Lv^Us;Nzc+sUi}yNzYyB(u%VGAhZglD^Av-YA=ysxBy%C*w zlR7Ow*FVkT)(Dqf5iQ#g(UV??Va08bT&4qJ?rDBlao@wX;+97~?sgPt0*wx5x5rV; zwl_w0I~xZwO^uT5O}Mf(G5VF)R~OKrneFy3QRAXhZ*YOeWmlcs%O^PQF9iWntj*@dvTmEkFTBmLPe=d`!1)`w#$o0(guumkU!PK z$rm`YPV~CCo;v$teihVOBkc8g5o9Aob8De`{T4qk-CYT<_rfclvE z$V*YZN1db_Xn?Kt!oEG`TwiN1S5?nwtdtp4yQ|UIkp>!C)n;cw-bWP|+G}?^i(`cq zI@-;8do3I*t*ps6sV=s=*X!;6*rASey4BTYXR&%?HKO*@Sg9A@2zw!Jz8c+H4f|tu Mzq#0{hU?LP0j;LYK>z>% literal 5153 zcmbVQUu+yl8K0Tm+ugf8#~TPGLOjeaQSi|iIjL1A4y4{BjT~AFD^W}6OMJDL#25Q6 zy1PV)WS>)#v?)-;pO^G4Z>|JLNIbSe1%Xsh9snWHN_~igkn&gwA@K&k@0*>yJtvI> zjt1WsCmMaLkYC3rLZ~K!84A1vwxM z>f@{aF2|j$ebqaYeJ5R65rR7Id~>ZYBsIgd*US1Rx>>WI2}KnDZ1ZaNaILC(2Xd>u zDKlvG)Rp#1@5RpYCE*h@s)>0VdDJ<;!U#khNtexhI@>tF1woIfP?*yc0h zbGA7xo~qrBgMUb=w!U-&eq-cZ`5Gg1~TCjXT!!(4RQ3p(GVn$8F zhL{yTe*9J{jm7CyL^sKcFQEUvXqoARH?eS!ndYZixWyLo`QEnXf>vbOn4FwY6VdC$ zDbJGpNCo|SoD;YGirn%C*g5>q*ZiKml&E6OWg2TmYxNPCU@y=-H6{#IpcB2p?u2TN zyqFXRpC_(X4JSw(EgMd}k+?HXpk3{}GA7OD)g|Q1GKu?&^_z8Km$|VM!j_}mO<2f> zNDs9pg}^ArLS#m1?6A-<7NVhr#F=p-3~Zc>5|;*QY%rOI7&-voNsniQO`cBN6!?JHY%tYL4E zglve+xU5MQX%UIyz_4`!hS7x;GECgT>AN}X@KZh?7MwxXZV=A->kv{EKM5VSk9!V-~WD*aH99m+Bz zi8NE`pGw3}1W`U1QqV)Pu+l}^XOpk!Cl0%#of+|##8x8B^|RtlX>ub);IS{02v-yb zlnJ97wcY8z&BQ&X0`NoaZSo8^j;VU6 zop9|5Sn(VJ>^Xxr1U0v4qX}wIdVzvzVDms@hS86SORY3+;d9XDZyA|>QOB0M181u` zu#lh%7=}^g_B?)&s|<1P$W}TsFcD~QW|SPjvSZj>^AR{P2FrL7{g9lE6*OK`N97!T zr(mv?TL2=PiXy3u&jSQR!#U1SGliiTY;0Vk51GTL-Xi@YSCs@%lygb%8-x-f{jF%l z9+n3Mb(3J>FlUxb|IIq6J7kC^#=hXAThUKBv+PKqeX56yH|H2{$WR$^C?Vk?17?Z} zN_DP;M_?_*E=q|-!l54+Fv^`kSb~oAYB<+6@l}77=j))Ndpq7+ls|x zv7af40U>1iqZ08GUiCXe3ivnj-a~2DZz*vJ9He#u4)BG%{6M0-s{$P)TQ8x52|U1q zZ)}{~VT0k}3Hp8+9?Y=@OaHM1&=+S0?8tm#6FvzCNgYKA6#_M{szYFR$bHRKum)%k zb6rFtx(SuMjbs@!nDv;*vkh^FLUtFV-cPB;w zkE~2w;Wdb>6rB}RynIIE1LJX(y(7PLHLv(^-cFP>;Ji6ck$v(DCmn0W9q^P;O-YOZ z0L|j?WCtS+u!(Mj%o5n#01)_u5aoOULilu`Vp_C~^`XO)Nv2XhP#&O|&@m=IB_Z~3 z%<=gCfGDN#CAf>t?E|5W64WRz8WjB?92^pG-U8vskbpD-;Wx#JOQv*=@=${87+TFZ z*B}$4u;s;!G83ov;>-f(BWIQ!h1wokJahJe>-SV^9||81FMp{#dWU#`JA^cR$O14> z-Dn*cFyQnkU=YC}o5Xk=V36ix0E5Vn0}RSzS_mql&T(%|u%$eK7;zoj%n}aEc7ElqAY071k^88GjR0=M$aO;4?xwt~X?##uQ7!_iIv4;Ac zWO#9P1z11h%$tLo4OpO#ZQ5g$LRcm^P#{A2S^;N>LZ|=IwSoee*c*vSgKBX#z+`No zCu)Eagd{K*6Rn^`<`JXj@&cPGAD>_*XWJV^NPvN2MSy{%s8RxyX}D!nwaRHYHq|&O zj6#tVJ3|etc#!Hm?WDnTL3x4eCWGjWVX>#Xx=c&eKV=*#1H=SLAVn;&@cPe)2B`9= zI6~W-136trIo$BY6*@l@r4Nb&dH7{1(i=gjKl=TjuRT5abf-7{`mg81Uw-)BKNrq_ zy!`IZ-){e{^{@2)9`P&3Z8z65`7`J9B7gUh{N$s`uRV@^=yCo0ji*w2-tk6WcKrNN zC-C$4oNE4*QzHgmal+vPPQCngGd6s-*;RV68Rs{ch@W6~fBmJ)D|mfc?DS5z`&qZ$ zT$}h-r+X>u?mwW<_M5M+WhXkT?b+EvY_-4IY3t=qyVu{}_{_H<)6ZsS7dlrnel?mX zD;;mHHQUQsEeVr@o4R F{{>|rQWV3P>W2@IcBq7UIEFpZHbL-J=OPbx; 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 Q9c>_alDl%{75M-E05XL(EdT%j diff --git a/bvm/Shaders/amm/contract.wasm b/bvm/Shaders/amm/contract.wasm old mode 100644 new mode 100755 index f7bc69d0887f1dd9c12587eb4d5b8053b1bd450e..3447c50f3d106117fd198209e52ba61615f9773a GIT binary patch literal 8936 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 QVP$^pX7trFzm5O?56zwzKmY&$ diff --git a/bvm/Shaders/amm/parser.cpp b/bvm/Shaders/amm/parser.cpp new file mode 100644 index 0000000000..d2ece25876 --- /dev/null +++ b/bvm/Shaders/amm/parser.cpp @@ -0,0 +1,208 @@ +// Parser module for Amm / DEX (versioned, behind Upgradable3). +#include "../common.h" +#include "../Explorer/parser_module_abi.h" +#include "contract.h" + +static void OnKind() { Env::DocAddText("kind", "DEX"); } + +static void WriteAmmSettings(const Amm::Settings& stg) +{ + DocAddCid("Dao-Vault", stg.m_cidDaoVault); +} + +static const char* get_AmmKind(const Amm::Pool::ID& pid) +{ + switch (pid.m_Fees.m_Kind) + { + case 0: return "Low"; + case 1: return "Medium"; + case 2: return "High"; + } + return ""; +} + +static void DocSetAmmPool(const Amm::Pool::ID& pid) +{ + DocAddAid("Aid1", pid.m_Aid1); + DocAddAid("Aid2", pid.m_Aid2); + Env::DocAddText("Volatility", get_AmmKind(pid)); +} + +static void OnMethod_Inner(uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + switch (iMethod) + { + case 1: Env::DocAddText("method", "Destroy"); break; + + case Amm::Method::Create::s_iMethod: + Env::DocAddText("method", "Create"); + if (nArg >= sizeof(Amm::Method::Create)) + { + auto* p = (const Amm::Method::Create*) pArg; + Env::DocGroup gr("params"); + WriteAmmSettings(p->m_Settings); + WriteUpgradeSettings(p->m_Upgradable); + } + break; + + case Upgradable3::Method::Control::s_iMethod: + // Control method handling intentionally minimal — host emits wrapper info. + Env::DocAddText("method", "Upgradable3 Control"); + break; + + case Amm::Method::PoolCreate::s_iMethod: + if (nArg >= sizeof(Amm::Method::PoolCreate)) + { + auto* p = (const Amm::Method::PoolCreate*) pArg; + Env::DocAddText("method", "Pool Create"); + Env::DocGroup gr("params"); + DocSetAmmPool(p->m_Pid); + DocAddPk("Creator", p->m_pkCreator); + } + break; + + case Amm::Method::PoolDestroy::s_iMethod: + if (nArg >= sizeof(Amm::Method::PoolDestroy)) + { + auto* p = (const Amm::Method::PoolDestroy*) pArg; + Env::DocAddText("method", "Pool Destroy"); + Env::DocGroup gr("params"); + DocSetAmmPool(p->m_Pid); + } + break; + + case Amm::Method::AddLiquidity::s_iMethod: + if (nArg >= sizeof(Amm::Method::AddLiquidity)) + { + auto* p = (const Amm::Method::AddLiquidity*) pArg; + Env::DocAddText("method", "Liquidity Add"); + Env::DocGroup gr("params"); + DocSetAmmPool(p->m_Pid); + } + break; + + case Amm::Method::Withdraw::s_iMethod: + if (nArg >= sizeof(Amm::Method::Withdraw)) + { + auto* p = (const Amm::Method::Withdraw*) pArg; + Env::DocAddText("method", "Liquidity Withdraw"); + Env::DocGroup gr("params"); + DocSetAmmPool(p->m_Pid); + } + break; + + case Amm::Method::Trade::s_iMethod: + if (nArg >= sizeof(Amm::Method::Trade)) + { + auto* p = (const Amm::Method::Trade*) pArg; + Env::DocAddText("method", "Trade"); + Env::DocGroup gr("params"); + DocSetAmmPool(p->m_Pid); + } + break; + } +} + +static void OnState_Inner(const ContractID& cid) +{ + Env::Key_T k; + _POD_(k.m_Prefix.m_Cid) = cid; + k.m_KeyInContract = Amm::Tags::s_Settings; + + Amm::Settings s; + if (!Env::VarReader::Read_T(k, s)) + return; + + { + Env::DocGroup gr2("Settings"); + WriteAmmSettings(s); + } + + { + Env::DocGroup gr2("Pools"); + DocSetType("table"); + Env::DocArray gr3("value"); + + { + Env::DocArray gr4(""); + DocAddTableHeader("Aid1"); + DocAddTableHeader("Aid2"); + DocAddTableHeader("Volatility"); + DocAddTableHeader("LP-Token"); + DocAddTableHeader("Amount1"); + DocAddTableHeader("Amount2"); + DocAddTableHeader("Amount-LP-Token"); + DocAddTableHeader("Rate 1:2"); + DocAddTableHeader("Rate 2:2"); + } + + Env::Key_T k0, k1; + _POD_(k0.m_Prefix.m_Cid) = cid; + _POD_(k1.m_Prefix.m_Cid) = cid; + _POD_(k0.m_KeyInContract.m_ID).SetZero(); + _POD_(k1.m_KeyInContract.m_ID).SetObject(0xff); + + for (Env::VarReader r(k0, k1); ; ) + { + Amm::Pool p; + if (!r.MoveNext_T(k0, p)) + break; + + Env::DocArray gr4(""); + DocAddAid("", k0.m_KeyInContract.m_ID.m_Aid1); + DocAddAid("", k0.m_KeyInContract.m_ID.m_Aid2); + Env::DocAddText("", get_AmmKind(k0.m_KeyInContract.m_ID)); + DocAddAid("", p.m_aidCtl); + DocAddAmount("", p.m_Totals.m_Tok1); + DocAddAmount("", p.m_Totals.m_Tok2); + DocAddAmount("", p.m_Totals.m_Ctl); + + if (p.m_Totals.m_Tok1 && p.m_Totals.m_Tok2) + { + char szBuf[MultiPrecision::Float::DecimalForm::s_LenScientificMax + 1]; + + MultiPrecision::Float f1(p.m_Totals.m_Tok1); + MultiPrecision::Float f2(p.m_Totals.m_Tok2); + + for (uint32_t i = 0; i < 2; i++) + { + auto kv = i ? (f2 / f1) : (f1 / f2); + auto df = kv.get_Decimal(); + + const uint32_t nPrecision = 8; + df.LimitPrecision(nPrecision); + + MultiPrecision::Float::DecimalForm::PrintOptions po; + + if (df.get_TextLenStd(po) <= nPrecision + 2) + df.PrintStd(szBuf, po); + else + df.PrintScientific(szBuf, po); + + Env::DocAddText("", szBuf); + } + } + else + { + Env::DocAddText("", ""); + Env::DocAddText("", ""); + } + } + } +} + +BEAM_EXPORT uint32_t Method_3(ShaderID* out_buf, uint32_t out_cap) +{ + return ParserModule_FillSids(out_buf, out_cap, Amm::s_pSID, _countof(Amm::s_pSID)); +} +BEAM_EXPORT void Method_0(const ShaderID&, const ContractID&, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); OnKind(); + OnMethod_Inner(iMethod, pArg, nArg); +} +BEAM_EXPORT void Method_1(const ShaderID&, const ContractID&) { Env::DocGroup gr(""); OnKind(); } +BEAM_EXPORT void Method_2(const ShaderID&, const ContractID& cid) +{ + Env::DocGroup gr(""); OnKind(); + { Env::DocGroup grSt("State"); OnState_Inner(cid); } +} diff --git a/bvm/Shaders/amm/parser.wasm b/bvm/Shaders/amm/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..038b73e2d386093771fda15536bf22d410434ea3 GIT binary patch literal 10595 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 diff --git a/bvm/Shaders/asset_man/app.wasm b/bvm/Shaders/asset_man/app.wasm old mode 100644 new mode 100755 index ee41f20beb0e42e2912e39842dd6e5b9db5f65d3..38f350e735c6f8c55275ba37c6c754cc0754b3ef GIT binary patch literal 4487 zcmb_gUu+yl8J|CA`|Lg2OB;$w0~#MBJ>#6?+QlsfA&-+ZK`04oQTupa-;K|EzT3U- z?m4!I;!AAY0HrO^04)^~JoEwagb)uPp@IYw52%qqLINt(Jf%pKhk{f@MEJg$y}do# z2`~7ho!RgE=J$Q`&2MJsGjYNOC4|t=<(B9cSt4YKZ9xkUy0z55rT?JEp%XW#yiAsc zj1Heho$NA`Aun z=TyTDrwP|1o^pb)bk1K_=g}b3F(@}TNuM6B4K%3n5qp(E;B4;kYGi4zi*-I?1ANP`f+rwHjowci8NV2|pS3gyU8Gh7sZ<&!|XG zQit9DWE7MeO*6?@tAjCGNI|F~Gee9F#zJJ^g7cw4I>ZR;wyS0r=nHAQko`*I^BoKgF}BgH28f+r$xqU@j?sg^eM~EQ*s&THOHnzFmwTUHfb|rTm_2-n|eaP}% zM3BGNIB8$)dm+o8=m>9iBfJ}qi8KAQu5re<=;e>Z8KP@>`cd6y3v59UDeP^W^XXwC z$v6{Kk~!AIW}XOW{;8dQ6HValEl^&9Hao{Qa6BN;0-A&DHmSk$7OCYqwC|CcB=$}W z&11_;fN*9QkP2)=W*;Bs7MP|%d*Su~4HL_fyO>}3Z=GeG!5jq;K_~cXKC}4PuE;F5 z|HHQz3%fhmZQmZ)UL4cXcKf~2?Zxcw4l1(OK!*b8k6|C|P+ovO42Rxh*LHSx9_6b7 zC;khVjW~ZIJ4rJ=Q$)!aC;Xu7G#hMc6yjvV58^OrZtmo!L4_J_*?Nh+<BW)F+X?L z%R2~@I646Xa7|KDm??oZ&QtVEEyl&*Nr+5Y3v~*Wwu@ zOFf$Kks}{@mygix@DaORKJpYFd5Vub;UhrBeC#>#^a%qA7xtGh4EYKsRc{9S%P25M zK@Nid8>6hlzIK;=FehSPM^i&ApkfGk(42?ncd)1Nh)5X4WAz+~Ks|+|0~KkU(!k3Vo3D z!2M4sTu+#}UPH5lIcD{wRv)_HfJAvN?_9Y(@QloE2rkDq%v)f8wKu~McESN`H?`TP z*Ydn`=BBgFk@W?Dr1RvsfWz+Nj4ZZ)`G*siALRnX_8iM$Q{yq&XO39QXATM@gJFybXy(Zgkr6Bvh7Iq)c`(R< za}Gw}JOd2`Wt=~^*Lem4Gj6Px`nsIELDurb$kS=Y9gIKuHsXMf*MUy9{Q^z|K1pxj z=SQDm^4GD!bXQO1PmMnQEWq(}6$iqRXHa82a~F6KRlsuj4kBq#wg46YXf6oa0KbEK zem`r2y(A{PIS$xnl(|I2qu7GE5`YSFBkZrCH>4&`3M9CV%rOhR13_ogaiccL?0Ej( zT|AmANheP8ZT^;?aW^V+N$J>_1427|6%7w-cfi7L?-^$9E%zFRBrq2bz{u6?Z=~@+ z0H80&pkM%5HJ2I<3ExEdTa)(vYn4izodl`9nLXI+4HVfVjO;;S$SlV43dUlY0}$f5 zL25B8A0oJb@SW%`QXaU5A0ZGWYh+p9`W=rI3?{NB%NU)I`Km{T2xLWB!OR7 zAyGl#2PAQ!hlrLJsHz*nRe7%_kvAOAse&HDaea@t-nvtFD?*xA4O1!y3JM49h_t*l z&%fx2C%`KygQe$3B5bO%yW*z>xj3KcW8cNq>R#I1)axB-a#D=?evoj-!ovFV@Q>B+3S6%N*6{$o%)&zI=K$#=dnIa8zFzg z=wlNfD4<4ql~b)oGqK-qd2C{Aw(IwTSBg1T!c7vBJ3Z>yaiB^x@xhY^4s!H%GnCvj zs^x`l)zeIiVvxg6-UB4wv-d_h0QAA6);x0Tw6{J#Z<1XouR1}Toa3S=s{{AZebwvW z5G4asfnRYVhnyH}La$X;K}d7ZEi0I2rMSFFN6z{UwH&C6qFi^pYX8j4)WcJckeBFa zh=AMk{ib>#A4<#ya(I@_tY6xn|S#s>PLNgoXFyXrNY9pkON(qs^uYC$pIM IBK%9^ztOlF9{>OV literal 3877 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 literal 34666 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 O7$>$_tf1NIX@FL{WnTig=-X|Cx*JO@gR| zE&E*NzhBQ8=5!mJF~((fB{856AFS{JTVV_X=8X4Ov;j7Pr))(JU<`s~D_Va*0R2Ai zYj^mx?l#v`C!BTnq|;$ctzKw3)p(VZ)#{1bD&zFXIPBDYrqMKW*mc^=vR-dhn65Tf zU4QwoTU$NjGlMpAFSo0X@18j0RNW3s(AJbfTI#rNKrc@?2b_A{?Hs681DF)8mmo}% zFp|gIMy1hasd&-e2p2E8ry*OwoWQ!Sk0<#Yr%!qce|jdNbHG&ktqv;~2Wc>)2YcCL(R3f%7ER~b zC!*;B+a669*^`+IpUz!Q@WkNhAwEprNuRa(=hR%=AAAKXGA0M!w8prW6S&&suhW8n6@<{ti|VN^03AT?(Ds{`XjAC3jJ@&zPDm9H zL$*WcGVKBPoM&DRaLg+-N+!5@Rqb%e7ue6!V5ybZTWZAoEeM#9-24u~v7L+`%JV>}99K5bo&^)hEF;9yF#Zf1p>i^3>DbA6RzeWErRgvy zG~lm-FnH;n`E4b)A-QK6S$ec?X;9SiY#pS&l4n_9fc{P`{k2$_$SZiH{Bqu#*5MaD zE0~<}ERFVO*;Hs+KC83dglz-oLA1~@BwYf=h2#(irp_6}mUiJwaU^1_b}aZm0ZFa8 zr`So$d?P@jzzC5Rv@}4LJ-K`|&$FXQAXmgz3V4wv@1(sT-m<^oT#Mq+91BCDn+^$% zMb>?|U>XFbi7X3@ACM*avG#1u{4R+X>7W#oze{@$+y3BzZO~>VmdB9yB!^CSDa->F z*fb-#HJ1GwJb;oFCee_`(gTi{*q1OEo}3T;Q)Cug{HuW{KjN>-w|Sf}4V<0GQCqWMTjyU~GLs>rp5OL`+CLiaj}x&oc;6qMM;}qJ;Z>l`)2t-rcDu3vYo8PA>2^7B@OF!=Gd$H<&Z^?cj-^N%ERk_{j-jcF_vcN z|HzC;_7x@bI%&A5QMDr4xri|4BJ%17Tt~k}7^}cyWpUNkj-yy);1Zpu*~B5qKCjFIy~IhN^&IM2RDjEgdUFC9@O9sTAs#0kQ#0k@z}x zm`I!#3G;`p1B3- zWH9m{5?+hw8DQ*wnE!V zBCnMYB1zKWG=ei6d_K#HL7-?8r4t5Ya(?6?_LV8EJG1*`N%{C&q|wA0uR`BP`KUSXfd)mfOb2p<71eRGpLQ5!v*Ze7P|e(~~Sv z)yG+&wlbM{6pOfaOJj_Ba*`s>-LV0b(4n4MfC97gCAAMQbdDKypwo^7l^VyBP?K;p zz3gxGB=1uqY3Rj#AgEbc$eddg`Q#VDseKv4TXq61X@FC>M%_j-D~VqMQll~O@<;d- zUKfc?JJq+-;qtsaRTfu3GkDq)Y0yIKr>JwsFcGxH#MCV-1Ev7Gf-08+^!c8xslH_* zM@7a;Dl>sb1_ytf4KhbIdxG_Bl3QpIqhLftiv;dlN=nT7bcZl-m;h!*Bm+!v1yy(^ z#HAifdY8pzk=(S|MM1hJmF~%r?pyQ*B=1k?M0)p>3Y6?nIAU<#hDAv|5*g~@$bpZE zel7cQ0O0g3Ip_+V#Eb0OBkdvry$}Is5|1QLYzDGk%(C|kqvVEBb$F0=5wHAa~s<#~f1$Wh{Y=oR=<5vXp@f(7LCnL2NpE?$k zg(RX}^I!IB^=_$Db$v%oj=LS~cAwk3XYKh?sZ#&ebK@A#kHjKPKKbH9B`P~z*z90! z{RqA9Xgc)~)|fIe-FR;{wT(aUx`cgks@-W-*D7wO%X64k+-}#c7Ef*P>BFstd#dBU zCMtEOxtiRwXZJI^_p$4|;5!{M=V{mR*E()DJ(oSTRzF(|UdhZA#umj^+n?KB!Kf+i{x}x9D%Q-R@kP;-KiB^Zx@ODXv-o literal 4806 zcmcIoU2Ggz6+ZXQ%+A=mPNq<3a6q~_QRn>0sJ?iiLpFC5URkbHI?>q+m0Hv$hr341q!aBZO7O;b&e2Mv z5w(xjYl)1@?ZP-E$+krD&D9n-W(BoYu~7S>88DgO&6NE}G?P?1Jbx<%3Q)_3roI26jH&SGsHwt#%-1^Np%ug|?$N1e(v zFg<}}4vcq#Myw05SyTu9cao_*oKBsVK5Xm83?cG^7-9DebCxX1u>fa!k9?|`ehq|F0&6118jS)do z-{TxemO!VU=?yRZNk|(tElsta=xYx-F-ud>CxDmmHWddJ>o-Y3XzMGnE)BSrNJ$P3 zp{F?$M6B$TV(`m@=nCbuyllb(iN<(Y0O~2kP~!ixs<1e~UpCxxd@AA2AeSnsvEP@sNGuG4}l!wmrtcdjb?C_8H89jVJoP z#Cq_~`vUFzg8gF>(zwW!sqsW1(`||!e+mBw91w}g_jpc*-?#gI-|l}3DY{nX)Pom8 zI|)?QT*>``%-Cjsg6}Y=93-70<;+l^oFIqnR5>NLLbrVT4Yjcz<}d(h2$r{dzb>qQ zW!Ri;&}S)I?~C;lu-H_xawr<|0df!BMUH>@sWy!3?HutGe7@TN_#_g%TSR646v}JtTsa|Iln)& z%l>BQl9oxv4o01_2SM(&(CdIhv}t2++>Ofs5GN#`DFk>jC8x#TCtS)kVn&a*#(NP-x9_ zB~EaZ3wZ;DF!(aMU9An0vaTr0zsX!dArPN_y4M29y8y(KQN+4yR?nBa0neuwkYaKU zTaJ4%bfFQawAuK^%d{88Ub$PFP*71Gk^NzXqOiMA6dsdE|MxkjmeXlH3~2{mAXBvNi5+JPY;a$IIw5v8%t3X5FKx)8-iD#G zYmc*dk2Ca@knFt2Ihh$k@gVPU&a~_aQ-QdKC71(Ga{9Amn8PUzqa~y-s)J+AVNq8( zF^_qAlI1+TucP;^h9mkfrfiJp|CrX(w{S@LK)j~Mk*pA#Pu@lcyRp#}B^;+pXoP|T zX^i4*3FjB7n8c6VQNsB^rKbjt!kKBvPv#6|ST*~FD%)zh6)-ZptweP{fess&q zu?Lg?{=TFxhBDii$~0r){H3TQ_itxb?vT;Q(tBv(se_7;H)5u9oRbK+NIDn40oG zV6U@&IlTc0KCSzFUcm|RElw=l0;E=HVu6{mx~}Z4Yx!SDn-2`4i)|FlPDn4r-f!_R zO-VbnuPMRpFyoRL#~wi}0><(62)0K{7$Y@WRyUNL((EZ`2hDa#+K@>ZRyJe}&G2)^ z3=_>L1EL4OhG@G_X^IAvT|^JT4H0cD_(;GAKvvT+z+l$Irb4<NnG=mxrSoF6SgEe1D;N7eAx!muL709jGka#=3y*}D zojq2+bgJ2j+RaMikt;u}P4QEeekZJYNVivj_uP@ylEHqtS&d$5wU;W5`ZuE5a|c%s zsKcwJiQUSWIT*-{p{GZd+pXGaHEOSj0v@Z;%1Tt5{Mwpus*Or>F?Z +static void DocSetBansName(const void* pArg, uint32_t nArg, const T& x) +{ + uint32_t nameLen = x.m_NameLen; + if (nameLen > NameService::Domain::s_MaxLen) + return; + + const uint8_t* p = (const uint8_t*) (&x + 1); + uint32_t n0 = p - (const uint8_t*) pArg; + if (n0 + nameLen > nArg) + return; + + char sz[NameService::Domain::s_MaxLen + 1]; + Env::Memcpy(sz, p, nameLen); + sz[nameLen] = 0; + Env::DocAddText("name", sz); +} + +static void OnMethod_Inner(const void* pArg, uint32_t nArg, uint32_t iMethod) +{ + switch (iMethod) + { + case 1: Env::DocAddText("method", "Destroy"); break; + + case NameService::Method::Create::s_iMethod: + Env::DocAddText("method", "Create"); + if (nArg >= sizeof(NameService::Method::Create)) + { + auto* p = (const NameService::Method::Create*) pArg; + Env::DocGroup gr("params"); + WriteBansSettings(p->m_Settings); + WriteUpgradeSettings(p->m_Upgradable); + } + break; + + case Upgradable3::Method::Control::s_iMethod: + // Control method handling intentionally minimal — host emits wrapper info. + Env::DocAddText("method", "Upgradable3 Control"); + break; + + case NameService::Method::SetOwner::s_iMethod: + if (nArg >= sizeof(NameService::Method::SetOwner)) + { + auto* p = (const NameService::Method::SetOwner*) pArg; + Env::DocAddText("method", "Set Owner"); + Env::DocGroup gr("params"); + DocSetBansName(pArg, nArg, *p); + DocAddPk("New owner", p->m_pkNewOwner); + } + break; + + case NameService::Method::Extend::s_iMethod: + if (nArg >= sizeof(NameService::Method::Extend)) + { + auto* p = (const NameService::Method::Extend*) pArg; + Env::DocAddText("method", "Extend period"); + Env::DocGroup gr("params"); + DocSetBansName(pArg, nArg, *p); + Env::DocAddNum32("Periods", p->m_Periods); + } + break; + + case NameService::Method::SetPrice::s_iMethod: + if (nArg >= sizeof(NameService::Method::SetPrice)) + { + auto* p = (const NameService::Method::SetPrice*) pArg; + Env::DocAddText("method", p->m_Price.m_Amount ? "Set Price" : "Remove Price"); + Env::DocGroup gr("params"); + DocSetBansName(pArg, nArg, *p); + if (p->m_Price.m_Amount) + DocAddAidAmount("Price", p->m_Price.m_Aid, p->m_Price.m_Amount); + } + break; + + case NameService::Method::Buy::s_iMethod: + if (nArg >= sizeof(NameService::Method::Buy)) + { + auto* p = (const NameService::Method::Buy*) pArg; + Env::DocAddText("method", "Buy"); + Env::DocGroup gr("params"); + DocSetBansName(pArg, nArg, *p); + DocAddPk("New owner", p->m_pkNewOwner); + } + break; + + case NameService::Method::Register::s_iMethod: + if (nArg >= sizeof(NameService::Method::Register)) + { + auto* p = (const NameService::Method::Register*) pArg; + Env::DocAddText("method", "Register"); + Env::DocGroup gr("params"); + DocSetBansName(pArg, nArg, *p); + DocAddPk("Owner", p->m_pkOwner); + Env::DocAddNum32("Periods", p->m_Periods); + } + break; + } +} + +static void OnState_Inner(const ContractID& cid) +{ + Env::Key_T k; + _POD_(k.m_Prefix.m_Cid) = cid; + k.m_KeyInContract = NameService::Tags::s_Settings; + + NameService::Settings s; + if (!Env::VarReader::Read_T(k, s)) + return; + + { + Env::DocGroup gr2("Settings"); + WriteBansSettings(s); + } + + { + Env::DocGroup gr2("Domains"); + DocSetType("table"); + Env::DocArray gr3("value"); + + { + Env::DocArray gr4(""); + DocAddTableHeader("Name"); + DocAddTableHeader("Owner"); + DocAddTableHeader("Expiration height"); + DocAddTableHeader("Status"); + DocAddTableHeader("Sell price"); + } + + Env::Key_T k0; + _POD_(k0.m_Prefix.m_Cid) = cid; + _POD_(k0.m_KeyInContract.m_sz).SetZero(); + +#pragma pack (push, 1) + struct KeyPlus { + Env::Key_T k; + char m_chTerm; + } k1; +#pragma pack (pop) + + _POD_(k1.k.m_Prefix.m_Cid) = cid; + Env::Memset(k1.k.m_KeyInContract.m_sz, 0xff, NameService::Domain::s_MaxLen); + + Height h = Env::get_Height(); + for (Env::VarReader r(k0, k1.k); ; ) + { + NameService::Domain d; + uint32_t nKey = sizeof(k1.k), nVal = sizeof(d); + if (!r.MoveNext(&k1.k, nKey, &d, nVal, 0)) + break; + + if (sizeof(d) != nVal) + continue; + + nKey -= (sizeof(k0) - NameService::Domain::s_MinLen); + if (nKey > NameService::Domain::s_MaxLen) + continue; + + k1.k.m_KeyInContract.m_sz[nKey] = 0; + + Env::DocArray gr4(""); + Env::DocAddText("", k1.k.m_KeyInContract.m_sz); + DocAddPk("", d.m_pkOwner); + DocAddHeight("", d.m_hExpire); + + const char* szStatus = + (d.m_hExpire > h) ? "" : + (d.m_hExpire + NameService::Domain::s_PeriodHold > h) ? "On Hold" : + "Expired"; + Env::DocAddText("", szStatus); + + if (d.m_Price.m_Amount) + DocAddAidAmount("", d.m_Price.m_Aid, d.m_Price.m_Amount); + else + Env::DocAddText("", ""); + } + } +} + +BEAM_EXPORT uint32_t Method_3(ShaderID* out_buf, uint32_t out_cap) +{ + return ParserModule_FillSids(out_buf, out_cap, NameService::s_pSID, _countof(NameService::s_pSID)); +} +BEAM_EXPORT void Method_0(const ShaderID&, const ContractID&, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); OnKind(); + OnMethod_Inner(pArg, nArg, iMethod); +} +BEAM_EXPORT void Method_1(const ShaderID&, const ContractID&) { Env::DocGroup gr(""); OnKind(); } +BEAM_EXPORT void Method_2(const ShaderID&, const ContractID& cid) +{ + Env::DocGroup gr(""); OnKind(); + { Env::DocGroup grSt("State"); OnState_Inner(cid); } +} diff --git a/bvm/Shaders/bans/parser.wasm b/bvm/Shaders/bans/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..cce3885b9e3b08fc0f5059a798d90651b49e7849 GIT binary patch literal 4632 zcmcgwZ)_Y#6@N2(f4z6{($F9!NX%Uzvg=&_IEevMS(zjzu|nLa34sr&_WE{W-+6EM z*xhq%3HjWlP)MO7r348PL7^WCRFM#TsNjo{AP7-G5P~nI2o-_yr4kYqLXl8;GqZQM z_F(uP^u#zyvG7VsZgolRj!&SvCS zQMA3P7;!MI#+1Y=&^0<}2yZEKMl`C;6#&^WPxw{tI41+Y)dV6(2K2~zu^a(S3>3auxV;Nn4GuV~F(E=!VaPtI}ABFGN8B=9&K0}sf7n1Z{&0N0YXel^Qkmx z5<=1j0h-B?HsNb)DKmR2lWB;CAFNOqoS6wDySg~j^lM%u0t0eqM6}>LGlyWXLmmLD zLmq^8cF0k9c;M|FxoJY$^eBVLA~2#FP8s2JYFCM(xu@2kL=2qAF=nmdAJ{3$dWkTQ zA7GTX>t$L5)8y3rbC%LJS>3HT`E6J%r{AmT?_5D$){{~L|L0|-`TCP`qpTt|{GL?^$Ms^_(0l zWK9$+PZhJVzP~20B=n$Xj0%*>l&`~S^bqCcI!j3^jV6$$9iOBbt#cR$;NOYVBA9RvE43fsNpHp;wte=?g)F&Ku~65;>olm2odL^=tH_4!^Nn17&nF!I|{PAUOC z$-gDV7z{y9`;vdJFCgp6D~a^BJ|p#VeE=ruqz9heEX9APFe^Q=-;zhD_IJP3tDB{) zr=@iUynu%_SEo5Wirtd+ten7n>jTC}ytsaY{b!fdq|Po4QkyfS0eLwPPU>a6FHYk9 zpr_(Z6(OVzj@jUhzHJmE+R_of?=73_aMENrV^n)Oi`B;ZuAvy)-?Axri6t*Gx>%<7 zb&-9gmlJqf;Dzu@ir<@fBquIVHSsHoanMtg-y(JEx{L>2!TimJR+k!NV?Qw>~GON-3?IzfXzrH^928#tA)&uPTZI zV^s1S8KamiiV2$(UIjca8?c_yy8`EiDDWegNDOz>5KWcS{E2!wBjqz_S3ge>S~`A* z^ry8EUzPWh*3$mQ%w}{L9w}wx<06@^{by-5nS5FzZZFH!=FiDiDJ*A?t-qE16iZ#$ z#j>*17-eb$D7?6480|a=bO7<9O6t~<@f1Es@fiDpbeB3Ifhru^~JM z;3PgC@4$yYX_`O4w>_7y`tKUopY}fR@pISj{4n^$vHio_&AaB6k2o)V@a4TPtbeod z+Uc8DUnI*rSLbfMv}^HaZ_*#V{*5CyuFal*<^As&Ed2cLyPx^RvDONl5MdPfD{xv! z+Qq77%5%gr*bTqsMR3CQD;MmR8v*xxuR~U&+L9gBe2*>Yx@K~@SqnCdoQv$J6~dXC z$LwY^z~Uwdfjf5qs{ricI-J<9Ad|P4_Dwqv;a%C+Y%s63pgGK`H5DV0zA7RU|Ke3gIZNE zKd`GV&PfHR)pc1@jw=I-1Fbg@GSi*OWP~{RV);tFu^Vlihb)Z^vz{dZ| z55j>tSym=M0{kYGQYZ>0E;tmyzDu$ezL9zt#FZ;a7OgZNr-8%8WJNADps6|4? zv=hrA>GE?TSVG^9k9S5{)%U_^&+tRzNwD;WKrtb?oh&e{j%F9bUn{&4p$p> zsJdVWTJs}&S<4G+^PX@Rmbi(Y>wEJ|HpAVT_TaUPH$$(--IY|>jAAID<*abY_m zm|TAJqV0xaVtiZ<%$$Ez&11SC*|j6BPwZv?cD)lrTS~;P*g|m6aP}e6SFmHL57~Wz z@7R$I`}3GuPOFN^MG8n(MHmXFGPgpuo$?!EF2LNWy0$l;86DksaNl8go(x8IAb*j# zi0RP^M3@^f=UVP!MgKrBGMMO8{AM(=qiVZu1vh&w5Y?z66Ir@&WT1hk0v-dHaU+9` ymdd5dJnm8S*2s1|ETRAtA5*$=u^GwV8b$^KaZv=qtBQ)u%5Wqnqg27)JpKiVqL+FA literal 0 HcmV?d00001 diff --git a/bvm/Shaders/blackhole/app.wasm b/bvm/Shaders/blackhole/app.wasm old mode 100644 new mode 100755 index 3962daa2294110c1d81747e4ccc37e9af90fd829..43ccc4347effa6d0fcec158f02b5ef945139e73d GIT binary patch literal 3773 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 q_^EZxDR!{CsGtHjRC*G-mmd@ zL~R7iQye(wlfCD!;$oV!j1?u@vAg|#GN0W{3yapr?Lk(xZ6c7XHhAp_V?I9K)(;a0 z7PG~X^o}A(YBrGU_;Oy)j@dsYyBt4GcZ+*(v5UAllLnkBmdoa!mlwJ?-W0@gCV^JGa#?*K+qW!%J>dU;wO#! eNew|eCHg?$H@u42V?-xW&^BP=WzxzCe5Nlgb6vIo delta 73 zcmZ3+e4TNEt|AL7V*w*0BP%l_0}~quV?Co|Lk9~tyD|$~Zfb6RQ6AS1K9J;PP0mToOJ_4Q&;vpMH$o8F diff --git a/bvm/Shaders/blackhole/parser.cpp b/bvm/Shaders/blackhole/parser.cpp new file mode 100644 index 0000000000..1fb43d10f3 --- /dev/null +++ b/bvm/Shaders/blackhole/parser.cpp @@ -0,0 +1,29 @@ +#include "../common.h" +#include "../Explorer/parser_module_abi.h" +#include "contract.h" + +static const ShaderID s_pSid[] = { BlackHole::s_SID }; + +static void OnKind() { Env::DocAddText("kind", "BlackHole"); } + +static void OnMethod_Inner(uint32_t iMethod) +{ + switch (iMethod) + { + case 0: Env::DocAddText("method", "Create"); break; + case 1: Env::DocAddText("method", "Destroy"); break; + + case BlackHole::Method::Deposit::s_iMethod: + Env::DocAddText("method", "Deposit"); + break; + } +} + +BEAM_EXPORT void Method_0(const ShaderID&, const ContractID&, uint32_t iMethod, const void*, uint32_t) +{ + Env::DocGroup gr(""); OnKind(); + OnMethod_Inner(iMethod); +} + +PARSER_MODULE_EXPORT_SIDS(s_pSid) +PARSER_MODULE_EXPORT_KIND_ONLY(OnKind) diff --git a/bvm/Shaders/blackhole/parser.wasm b/bvm/Shaders/blackhole/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..bfaf64b15df2cb8348bd53b73c7472d2572dce8e GIT binary patch literal 894 zcma)5zi-n(82vum`O&x`5tSH#!EL1q$vE@}6B1HQTQvxEK(HVoC64_ixV3%ed~V5t z17%@hLSkZIf`NenCN>rr`xhX@%0Ix!UD}2s1~}>Nd-we0v%mKayevilz`1f43+QTv zTmZUyQ50BoOR^|N(pYF4hEB<@xz2ny2sSy(Qvk)(4w>8ZKmaPDE{U~>WppUg6j$D& z*iVO`>m|b|At z7Qr}%D^NOyOHe+B%TTF(N23ky+tHH|G)HoP`$l2+#h7`d7;V+kT~A7 z7tMu#eA3Z@|0y#AgmK^Qu2UvB8^SuJEDHs!aqsbu`}ZGCeVaLVF#qvt5I-iDyfdiF=jP_?P=rHH1owv%nJ`T$)NH%6;M)PD|)h zmQmpJhIp#YV(M|)v;4?Q2Ib}D)>7*-JjaIc_<%&GFZ+^n%Br^6%cC9VFl~0@#KvK% zu+R8j6gje6AtzrrY?pY%l7U@|^GJldUX+vFh;!lfB60>1>v>UT&m=4n+)L9i894n^ asNmWSPJQB(_~eLTN|{~F!a?H5+wu#^JPKO? literal 0 HcmV?d00001 diff --git a/bvm/Shaders/dao-accumulator/app.wasm b/bvm/Shaders/dao-accumulator/app.wasm old mode 100644 new mode 100755 index b5c9e24e480b0ae0b10446137d983d7b5212e5af..24e8a026f6731354b7bf7fa6e1cf10ca6e117c69 GIT binary patch literal 29639 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 literal 29763 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 diff --git a/bvm/Shaders/dao-accumulator/contract.wasm b/bvm/Shaders/dao-accumulator/contract.wasm old mode 100644 new mode 100755 index d4dabc47b9e99469b522a52cce8cf4e683c45672..756a63292573a4b28f38c0c4483a8a945a0e5bc1 GIT binary patch literal 6925 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 +} + +static void OnMethod_Inner(uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + switch (iMethod) + { + case 1: Env::DocAddText("method", "Destroy"); break; + + case DaoAccumulator::Method::Create::s_iMethod: + Env::DocAddText("method", "Create"); + if (nArg >= sizeof(DaoAccumulator::Method::Create)) + { + auto* p = (const DaoAccumulator::Method::Create*) pArg; + Env::DocGroup gr("params"); + WriteUpgradeSettings(p->m_Upgradable); + DocAddAid("beamX", p->m_aidBeamX); + DocAddHeight("Per-phase end", p->m_hPrePhaseEnd); + } + break; + + case Upgradable3::Method::Control::s_iMethod: + // Control method handling intentionally minimal — host emits wrapper info. + Env::DocAddText("method", "Upgradable3 Control"); + break; + + case DaoAccumulator::Method::FarmStart::s_iMethod: + if (nArg >= sizeof(DaoAccumulator::Method::FarmStart)) + { + auto* p = (const DaoAccumulator::Method::FarmStart*) pArg; + Env::DocAddText("method", "Farm Start"); + Env::DocGroup gr("params"); + WriteUpgradeAdminsMask(p->m_ApproveMask); + DocAddAid("LP-Token", p->m_aidLpToken); + DocAddAmount("Total Reward", p->m_FarmBeamX); + Env::DocAddNum("Total Duration", p->m_hFarmDuration); + } + break; + + case DaoAccumulator::Method::UserLock::s_iMethod: + if (nArg >= sizeof(DaoAccumulator::Method::UserLock)) + { + auto* p = (const DaoAccumulator::Method::UserLock*) pArg; + Env::DocAddText("method", "Lock"); + Env::DocGroup gr("params"); + OnPoolType(p->m_PoolType); + DocAddPk("pk", p->m_pkUser); + DocAddHeight("hEnd", p->m_hEnd); + } + break; + + case DaoAccumulator::Method::UserWithdraw_FromBeamNph::s_iMethod: + OnUserWithdraw(DaoAccumulator::Method::UserLock::Type::Nph, pArg, nArg); + break; + + case DaoAccumulator::Method::UserWithdraw_FromBeamBeamX::s_iMethod: + OnUserWithdraw(DaoAccumulator::Method::UserLock::Type::BeamX, pArg, nArg); + break; + } +} + +static void OnState_Pool(DaoAccumulator::Pool& p, const char* szName) +{ + Env::DocGroup gr(szName); + p.Update(Env::get_Height()); + DocAddAmount("Reward remaining", p.m_AmountRemaining); + Env::DocAddNum("Farming duration remaining", p.m_hRemaining); +} + +static void OnState_Users(const ContractID& cid, DaoAccumulator::Pool& p, uint8_t type, const char* szName) +{ + Env::DocGroup gr2(szName); + DocSetType("table"); + Env::DocArray gr3("value"); + + { + Env::DocArray gr4(""); + DocAddTableHeader("LP-Tokens"); + DocAddTableHeader("Locked until"); + DocAddTableHeader("Reward"); + DocAddTableHeader("Key"); + } + + Env::Key_T k0, k1; + k0.m_KeyInContract.m_Tag = type; + k1.m_KeyInContract.m_Tag = type; + _POD_(k0.m_Prefix.m_Cid) = cid; + _POD_(k1.m_Prefix.m_Cid) = cid; + _POD_(k0.m_KeyInContract.m_pk).SetZero(); + _POD_(k1.m_KeyInContract.m_pk).SetObject(0xff); + + for (Env::VarReader r(k0, k1); ; ) + { + DaoAccumulator::User u; + if (!r.MoveNext_T(k0, u)) + break; + + Env::DocArray gr4(""); + DocAddAmount("", u.m_LpToken); + DocAddHeight("", u.m_hEnd); + + u.m_EarnedBeamX += p.Remove(u.m_PoolUser); + DocAddAmount("", u.m_EarnedBeamX); + + DocAddPk("", k0.m_KeyInContract.m_pk); + } +} + +static void OnState_Inner(const ContractID& cid) +{ + Env::Key_T k; + _POD_(k.m_Prefix.m_Cid) = cid; + k.m_KeyInContract = DaoAccumulator::Tags::s_State; + + DaoAccumulator::State s; + if (!Env::VarReader::Read_T(k, s)) + return; + + DocAddAid("BeamX", s.m_aidBeamX); + DocAddHeight("Pre-phaseend height ", s.m_hPreEnd); + + if (s.m_aidLpToken) + { + DocAddAid("LP-token", s.m_aidLpToken); + OnState_Pool(s.m_Pool, "Pool Beam/BeamX"); + } + + DaoAccumulator::Pool p_Nph; + k.m_KeyInContract = DaoAccumulator::Tags::s_PoolBeamNph; + + if (Env::VarReader::Read_T(k, p_Nph)) + OnState_Pool(p_Nph, "Pool Beam/Nph"); + else + _POD_(p_Nph).SetZero(); + + OnState_Users(cid, s.m_Pool, DaoAccumulator::Tags::s_User, "Beam/BeamX users"); + OnState_Users(cid, p_Nph, DaoAccumulator::Tags::s_UserBeamNph, "Beam/Nph users"); +} + +BEAM_EXPORT uint32_t Method_3(ShaderID* out_buf, uint32_t out_cap) +{ + return ParserModule_FillSids(out_buf, out_cap, DaoAccumulator::s_pSID, _countof(DaoAccumulator::s_pSID)); +} +BEAM_EXPORT void Method_0(const ShaderID&, const ContractID&, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); OnKind(); + OnMethod_Inner(iMethod, pArg, nArg); +} +BEAM_EXPORT void Method_1(const ShaderID&, const ContractID&) { Env::DocGroup gr(""); OnKind(); } +BEAM_EXPORT void Method_2(const ShaderID&, const ContractID& cid) +{ + Env::DocGroup gr(""); OnKind(); + { Env::DocGroup grSt("State"); OnState_Inner(cid); } +} diff --git a/bvm/Shaders/dao-accumulator/parser.wasm b/bvm/Shaders/dao-accumulator/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..564f6fde0b8b489cf210621672650a6ea53483ab GIT binary patch literal 8718 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 literal 0 HcmV?d00001 diff --git a/bvm/Shaders/dao-core-masternet/app-admin.wasm b/bvm/Shaders/dao-core-masternet/app-admin.wasm old mode 100644 new mode 100755 index 7ae56acbc217eea0282d409a0791e1dee388702b..66a30defdcab14ebb13d9839c0af314f3f5578ba GIT binary patch literal 19421 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 literal 17899 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 SR}YRCDyx&UUD1tA_5TO)m}wmV literal 22723 zcmeHP4U}9}eZTK(c6MeqdBAETN#)HWtUHuI$j2@Wuvu=H2(d_x|ty{_p?u-pdo2@|Y%s&_+(WR+|;q3URGIi>EP5ze1b2HinY= zlVEN3T9W{HMq~v_`s@t%L{Z?MMz#2vA#C{N4&qvi+Y9|W#&RQDn2c{M4tc}Fn@h!s zaUlrO0mz2YVmT{e8o^?+)m7OWD?(?$woIu!$jxLgg~uzEGP@)sx-nbIO=h=_2%`qA zY$DO_$W{g~$>w(KtO%1DE!mtcWJ{S!_R?&rkR25k0V9`X$A-pti3q*4^S~DuCdNb? zqviL@ij&#b6LC?3DOz4XF}8M%B)1CbStr`5jhfNGXmPuwk47nHD{>U7-JGrPe0kW& zm6g)a*tm%KeNoGOxt7oafB}J?n^YknfgwB#V36oASgyQU*4US1$~!ldvY7UjJ2Pw6 z_lP)+(oWzvmU5M>Brrkm7-d^#bV7lm1lm-}X2J2ZS7|~Qx}MNuF+J8{=z7eEwHroE zU$RuUwWYC`ffxMYfj`sI#x+f|4D^abAtv6w+s$~JV?@TXW5v=gT|_U-R(2ML2Um;b ze(_w<8~f?Zs=H0$&F!6=6ZRbbgm+V@{Ps}!J=L;(6SsVC72McHlJHW zn*-H0s@J0pkjJZ#1;_f=MYQ>Ot2W-ATWJ>Wq+dHci#r%1`LobWKh&yCBWCZDJl2B^ zV?ERgkK)faTeb1N$CyL2@Sbdd{D>jXGoH{)CI0Yl{7y~NXHS=N-=~kb+Da}vns-3t zJ&_gyMbV@0)9~E)4zR9A??h4S(QSud&uIA`eFYbvqvA5amiFigJRW-&H;v;tt{H_HF{k(O{pRm&3>BA@4p}t4Ca2Q6=oVsjVYC&HghgdEcio z>^(kOMu>qh08!p8O#5vTy8sQ|i`@Dif;c*wd1$jdsp*)zEC=~tqN*f! zPB<1IDMPsJ1Lxi1v=4OOGJsnA9e7#n-UGlg1vv8B-FS=2x93jVy@x8Jd#UvcOQ~uZ zm0xP(PTeT~+92q8d-v?wGa#I{<-LY*OwY+DO~(QqNy~|NTHcNDl(%$%kC^Op!e`-U zb=?39y=Q9{l-R>!0#<1qm~#@+m}LG)zCh0Mm=0JKwsOB9B#vp{25N=JTIg6dfOumK zmn=2%;MKbc3Q|C#<`_hKAdVP(k7 zjN|RF=F7*oO(O#NFhW*A^R0q+pGLYPyzhcS1JAv9$HGD7A$G!h0pJKLxd!|_P$n#Q zk8aZZB}sFdV=l5Joj3y3VzG}p7~Qe&lub3VGx=oHX(zpC=Z5m!&Ltw$kt{rU%e*i{*SW8Bsh`z5cjlX z%pbkIM}Hh7JMASbA{!guTsyJ&ONMS%4fc^}pgX>KAW?E*4WxNcCWIvk%PuVm#Pa}_ zMtDyMpX<7Jh#^mfAcq<9BOe0NP4vX-d_RikO|(2uprqDke-sSUz5VEQMtWA{ryw{9yl_YeW3D@5N;Xo5k~ZFouhF2Yi0o(^(<-$s6&->5ALK*KR0 z*&t}Kp)8^2Yz8Nl_fuvA!MvaG7|UxjcX#3Td-N) zk*IG=D%F_B4ptruc{=@*<|heWlVBzAIK(Cca)xpORuT^i9i)Xw;uT^{W=GmH)Y@tw za6)Xx+z*LO*T+i>4C-P~w{cLD%+v{tX=2D1EnT10{jlT!!V+DXOw27U&I75i8Uj)t z*m!`?XQRkfEP{XG3lBwq-UIY2!)JB{n7drMgIs~OXmp6mjv?0&qck53oLN@EPqgAu zByoL-%99=`PK>sIfy40 zQnxc8?`Jfsn|*@nW<%Yc)pTvv^3}}=k^o4luJ_w-Cz*9&C*X)(^C|@WDA|ZxU|**t zJnEWnrewe|`*eN`ID7jL@x#Upyo|r4yAh8Xe$kq7BYm8PMbHjSoV~8@STj?QPuUvA z*dV9@7*HZ{gL+U?2N1_Zamv;EC}-o|eU!*ixFHiZ`#z$W(uF9+qZ+)wZ$9FW7+Ta1 z#V}JtR_OhDKbb?*HDS$BHa&aNg%@zFO_{i?VdjA!cRNV zL*e0HZ;haN9h`v0w`;l&u<0n`2FaLLjC@mV>+m*lbNwip#I)g6bYD3BN`` zd9_PI0x@L*MkJmnfML8ujX_2&AEr-1d=f#v0e9|LFpAxJ!iB$?1WiaV=pC|wci^#z zP{eTrG`SJ+mw+TF08&4{o#40(aNYhUaYCjQa<$?|bO>zKKh$IpbNU4ul78Kz!XYfhK>kXsJtK2%f*!8IOY_Y@nzE- zi6O|kmpJ1XKGdKj-*@NUugKDXqz}IMpD%ywBo%z^Ms`3BPNtN%@>|tf9|*FRUy?}( zI7}M@RS)blww`C-0)L*SLA`dld7%>v(2BkBCy7=Hm6$G`M-3I2n4y+rMnoCx>HXj_S0Mt)+bts=sft(u z?ohi@WC|!Pw0ebyYNQ}AD6$FL8ls^SjVw5MJP_mAU&*p~~%li(h-65edu)vygBU7Vpx zFkAzV-W=UV@PR`&V<&4GENBp^ zr?2C8a)k(49itC&f(N`;9}5nW;i`UonspgEzn*xzUSBpv7?y!8D`@jcBlj0suL~&q zdcBh?K^OSnP$_#-<;up&6+zGLyvr8GaVY(T@5BiAVj~o$HXM(9=l`O^B%XsySPI?# zGBNI$yrj)8kM@I`dC5eLmsFmVoLJRM2Cg&gPXpJfTxrO4KFn*&KCV-FNuq(hB<)5+ zHKo_|9pZ1wb^evFfPMrN|0x;vW`;%@L{533?A@%>Bwv1tWq5j8q?Eydg=WP_A1YAB6a-T#uxkUQ`nxpp& z`yv!kevZoIu~sWb^#TFl!GE;-Gf%#fD_q3TY+YbQ$TThJ(!86ng)9c{`{GiGOJ*A0 z9)hY9wOgqSta_&!?k*p&LILiP07>tIL}TD#=edgftG+_HV>tw-cO)?OKQs(|#zJZ# zGYMLtPE29$o)=!UkVkkY%hLjcO4ubvTuu9Ph@KIQT6sj!-UHZ^#r~54mvxmJT@EPi z%s6c$Xn~;H#I6hrq~)D_DbO9*b5YXN`yFe^DMG9NgI)8!XvnnN@@BC?j*#3tu#ZNd z;5tHnt!7ZSeHt-*xRDbXnV$iyhP3wS*?WNvu^Vk5Qj+AD^R6-NwnG+!)dM{0A{mma zr_0r&)@Qk~X-c!4c6K{pHU+}iu(e0ng2UuH+Il@PP0E;8Z&AF#MNoynKm*R(QM-a_ zrw9f|6$fm}P4I6ATlV<@=N6|!C0KiqNI7vo+d{d$T1M+B@-~Soh~B4=>R}s!0x8O> zNa14efM>y7#D7IDR-ZBb%!(x5R5=&eK@wz2iT7VvoKA&YSeQD;9+9wIKnjuqa?wU| z5#@bb$OXczI=P5k<;Io+n#9SC(>{V0vE^=?FBgz7$i)E3h2@APr)Z-7Pp3sAX=tli zXcq|{#tyHuYtahSNJEsQ0bx*BP%V;%`J@FyH~?|8;*eJ}g~-5~qWAzWd_dXhn^mMf zkndjjBIXjbAN)!g=S@iy>OIJcrZ~tDb-hHiz?8qBk)-mBb?>EW*7ZU|*7Z^- z>v}=+R?4hPUqRu(6yyh{ZY6RpY?zu(WI$Yj?cthyD=^=OG-W^i42TChz@{87e4#fPTO^$m0jjYJW|2!45JS-_EDC zg5|SF( ziXI=%J)tp$7z2>!L|z`v!4JxFIm9P%4Sd@mlkILWoP|Af$=DtRhFSeg6l#*}xTj&Dr4C1`)P4yC**b$lpWOoOUyd9MnyvGYym z2RJ7AxjKsErK{tkNKNwdbtu1y6Ek5SA4)YzzQ|R#R&tVjp{s6^F!c$K?{%Rfk+=d_Z%VTRLT4T0jzFN;f) zQ54#c#o)$L6cH#QKfk?nYw{JbY%nyUrl3sb=>0?zhPT+W+8>}-LgSyy#urLvpCS|F z-#|eutowVDxXOT_*(1ntod8FX%q}$O=|J4%)cO7s9rJz~6xXUuB#xX2QR2a8GX;6G z3>?CKE+TtJ&|Pa(%aR)cN4c{h%8rE0q< z4x@lGO6{o4G$OLOIh#(jtYk!PX~g_wsBJ2QcdrwlLO(g+lp7$T{;PKn2psz(JekEU zo&~X(l(SHJMSE{JL-A(Nn$jyoK?yt%$J$>7I_MErl3x$VSK45rTK^a(ez3|jq}eTb zhK=+Ec}6=@i{V+Per!BbcpG^p5n)n`;Td76;Td++!aVc01-~Mhbc`(gazt;RHA6?C zh71%bI3$MR0F=%!WZKGygb_*ykaN-@AuIsxOSID=A<|JgFpPOPB$Nk(F0T1Zx-ln? z995nK;*gNf2I-KHPYwBykPZjwkT8ZP4hbXj0El)3kcyavWE7-eOez17c_%tgBAu9V z{p5byT_PoV2}v|%{~?Kva&8JHF7YKgG373~*M+!|5-gFjuVgn$vP-!vGd;o*8YONc zuZ3h+H(|d<+?JcLrsrUv1gDfPjtS_Tk}1deDfkoGb8W9ZnT(;HS|(iVC(xN-u*Zsg zU=jzb45U5Qc6vuLAP)`=uoLfe&RKHXcn+9F6#Ss=j<$KXV-Im>$=toPU4$DykR4t? zzJFmj9jJAd%(zPftIAy&pg9wj%B~9V;h1FTFe>D8>b4Lu8y5B zS_te`fyh0)Iptbdj0i6Vw#sQSmeMTI1lC$wrARYNE~Hh$A*eFsbYs9bzBuF~4${iN zj_;kOO9I#c!Y`ENbO^Q_hI@BFjf7-;^tCbkzX8eP}H@wWJX&DbHY0 zh%HH`#fW*KBg%Y5;tdS6!wkgX{?QnSRb7yQq!NQeUlVzW4qz<)9#{#GnKId0I%bsO_IPKG7KOTxA0-N+slg25P) zN18?cV6bP3N`H$Zj(Mjo9M4AXb>VU;q{Y1{a8U-Ud_&5{Gy@Yy^;HvB(`zr<`NoV) z92l!QDo(J+_bF(B1(wT35Cg@FlJSOThgbp|W+tb(9v6Qw$F|V)tfNeiB!UrNK+`t{yKTx`0rNtw{vyB!K-`NP{$}nptraq z>p89 zYOYjfQoFE83iVP`qs@z1x|kxz4^0lbOGpCU#g&Ti%tZWmE6U#Zw`fIgZh0L^rspJg z|NHlMA0-=7O@Tufb=l?9{UOSin_W3Nv5UFvnxF@aJTk*$xx(N`c9$5(hX+PS zi$jBzVkI+LuD&z&p!SAbW#@1ybA!l?6(4ivV5Y-a45P+4q$U2$mS^3v4>5H=zva)rv;HG>tAEtQHT zQT@C0kxO^{L&oz9SA zhfsXTfC+>-J3P3ZhYr1z1z5DIoXrkXK~x#V)QikyCO0Zd*`X}HZ80n+v*k*zuw$@X z$&@O=Teg6X)KD^2l}p*NOs;^|VyD1&92}pw;KQ)PbU2mbNVZTG#35=oJdvs7iUmO* zizriJ=V~!g#>!Lc@}Q)eU#=M}g6WK8kch(y$(hO3VA=<%YnkDG*Vlmw=SVI)nZmGx z^>b+OdV)yq#1;5)3dM?39?uTtuFGNi5HTXl<40Xxt}vMy%?&%UQcM&^3dI`=4q*`_ zt7}#bXNs$aiY17wS|1QMId(P)@FXY&=CZ&yHMV2IcUl|&?hp4q{V!iw+4GUgC*FN^ z<&WNY=c@Mq*#3jFPWk!O`|ju@X;um_IGi2L>=FdYjE|S_We`l7m$58>d3;3VJd%Df zG*K#nQG;qMQNRa8YF~EBPm_=sRY+PZ#iEnVlty=nt6AAH+efo&9A5(+UjwTGYQJTW zURE63`Vc(}W9!E?Ja78RfBmD5XZeol2Q54=+J5EsIG)R1v*oL=#PcoXKb~BL=htsK z^NBa(dGmKO*MFYi`aM6+0l`%x=bUsH2!44mmAV}Wo_Or;%|DC@@!|6xI`B-V5EJQ7 zTs6`qMEasT)_l4j9sA#E{{o1C??ZW-O~cdHN+neOraU7NgaE zJVpa#C)=!-8WsgJ#!tYGw=ms1DbrFoN_u%-{$GQd^~ggME1h9YbN@9Vv=XH7{LF4Pj|}gYtf8` z-yqet`^xOl_~3XE>=}eB$@s&Zew#-0Im``6#1&aM#nQz$UU(h6TedHqCcxlT7y8^n zaiUPp?I^(Jm3J0PmA9|HFGucb)~zeG^5)|wXJ}`p1Zp;BiW^`h zTT;SJ143$hbfwNXr%tF;K+w2Mm<7pO*B!@CHTr{SDHfY13d0bIZS=_^E;r{RbqR=H zpl4U=HR%nR(V>Y^EXP(Aw0PuXyMyWaVDhNx^wn^83TvvnFj<5zx@=;!l0&PZ9C;Ts z*;1%n2pI)$vz3jx$t$wu-0+3#CeCsI>~7k6-9#Ul)U+xP_O4WFZHVK(qgNr;f?PlI z+-999x>~TyAAIeY7peuf*nET~u92ZN3wTsi!J@Wk*_AqLYqNR#5ogo62P!*SEbMUj zhi#sc-&OBDX0`+v>$Pr^491Q}{c5{*rOsX(@S(N}lF0FJcR)ojuhcm$M0b6?=&o-i zx@f%!(Ovx}_&G%$+rFj?u)suszp;iCaci;Ml{)vKV_ud8u{FqQz)>|^b4jglCDAm> zX??q{)S6WxDZS3mdzvzbOz7GzjifU>$peicD&0g08mv&&eASQX8?SXc>qn-*h$H)^ z!#4_1FuxX6MD+Twqu@EpoUQ3F)S>6C^`yzfu4#uBgD<8E;|24ev3rBh(w%qZ)s@^R z91Xso2WOv76Mr`3hQm}qG8=*tz}PLwaOo^3pn}k!fA=v9YeOt_Wo{T`z@i421HG;h z&xJY$^KIB5cHINjG5OJhhE z-_AJVJUUaP1`rL&AjTY7#ebfr1`ZB@NkbX3cOF(%# zjp*j`!caCe+qJD`8;WIKyNDr}sf|OdS>zD?ix`3>rg4aK7deEth#}TCXVmIN4l&R| z>W(7sCnyCQj&Ed=_XS68A@3pi+t^~{`oKCQd!*wFj=VU@zxen@{te7|QwtrhpED;D z3(mAfG7;kO=Hr_wr7PfkdXd#F!X@vLw+E0u=&+2n2`>g9{u#aylW3MO-yfbc##dEU z?5_)&A<5 zP@~9_=FF)J`^qZk)Yeo4!~T%O5=G|L-lXFXic zk4XMX5X9Eg+wfz?URJ3K1Nm4St+5QoirU(i{CeL92YMKS%GVQ^x{zSqnqUa|Y_KL2 zu{=q`Y;eF30$$NzUM7v!M2&&pC2cHVc-2L;qrWC#?LNLX1ekAoTWrabRK9vQU(F$U z&%JXtmQ(ohy`6xI?teU~DNk~MHBL>(!x1nvgQ<&&fT5iqJpAaoRGi(zVZ4cK$x#yLyNkYD|$dxjG-3{Pe5HkF9FQ*ISDrufSD&? z$Pt$M6KORChAJ`6`y+*H&G%iQqe!~OIobkXx>K`BXfI;?kLi( z(`=fEhwf}?(rq-CXy(!|*K8K7=F;qV?Z%rX-Nm5^*#K;?klQs`Q<`-J{(^s{sWCE2 zi|!$`c9V<MUO zlZr*{k0(LiSb&Q8EQ7Nx7#SvIU^IqDNE^cu9MC*WGFO+TLOB?f=yHiUnh9OLw8$}o zW`L5K;S(<}a*(}j@G2XuC20yGawa5Wx#BqhgV!8A`Z)qy9L_U?n1Mw(Pr8mGLk{3i z2K~8C2&k(~Av44)y--btnCx``76Vy#(qlnDcjbx;um-1^(4h%AVpS9Ub-=X?#VSq> z4uO?gzV6}cwQ=iVzOM51FxDNKJ;436J&-G2X_|{P!i?eSGGd2prHOgcT<{3xAxI1* z&?yYz10)DHK6E-Ts>^|-OOg@@@i!x&-fRk(DHZD?kH%s%76sElCVAjs#=to0ko?MA z@mxZcDb?mlq*aU-l zh7{JE_!BVpU%v!}CsP6!rMf#6R)>o@G*=}uf;&}rpd=JMvt%R*1?KFDy##jb4~ZHW zTLZeo5W^Ybk!8RLzZ5}K3TH~3f-W@!Ci+@)R(7;-Hmvsunb!6|2WPwJamh3Zv{|A_ zh?)|Z13tzhgY04X4i8T=pO~QwEkIXd@e)`aTRQt*eBz-u$0VLuDp@52torwrC`8kU zR;f$oGN&a{@X0VSnN?jw_S0ohMJ~$~RgL^xRBz#C72Rai43Qys%i&xx1yjY)G`Ui@ zHP8zg%b{E`4eM}e6;;XBkSive)5tDnPCZEIw9DM0nu`v;1^J)j@tBKpCrAet720V5 z$zV~^BqJrD-f9M)hNwx_Y+-s54{`%|QXvQC9-Uzhsy1TOV=fX^EHZPEG7=!=PLRk7 zw8%GGaOCEede#zQD96wu3V&6SL}YHI1s*Jl$RC+38L5=}HR==`8pXh?z@cSwXd5}S z9S*IKL)(sVXsJ|pq-sjQ3$<(ZN>pJ-D%r?wkVDI4MvzbvdokhIpNQar7s|w|Lar^x ze3xf*InK46&47uywvAky7>c;IlU$p8g$s_br|6J75E6O3Yy52SpFZeANdyYDYJw*6 za*|4`gLGFjSB6tV;h`dgN|nJqrBY)#;y_C4o@N?qJm>Qvy22chHS5kI?OJ-3#`C+} zOdZCxP1G;oZvq+sL|u`#R7;kR7|>1lr+H#aG)KY)Q&MRvvKcHZ zYOba{Hps1s?qw1hNa&auYJ)DA!NQD`23?Gd)8f_#H0X?SCNqR_Np3?jkoYi6O#)V< zKVD+OS4CRYSgIk1lFav$x<0rxy+$Z^j6#_CtoRDft zAO|c-tfv}qKOjnStJEU2nmLANBxJClS238^1|y+3QMZTO3U@N|m90ZlI&|K}noTJD zshwI4$^hK6q>d(yx41|v9lXJHSkBR`+Y3b%c(!hLRHb` z&Z zv_ls-?3nJTbZGEHxr5G9abBpv$^hf4J;u9iUc2dCz!A_bKp>w2LN@Xr>ou0Ruh_^} z?Bpx?3!eN&-z-$E#R@HZ)DC)DgaLE-L3>pW#5Kpt>WBXzI}2R2(t#=pMY_ zwUob+=`_`#p|F^>R6^5^IgVX4r#kJSIZk=u5FMvsRmf@UprhncO+=I}(d-?1Vq3c| zq9nGWKeXYAf=NP4bdu}P5?l1dcx{1C>L*NXX^9k#O}e8H%sb4eM0Le`#1M}tf{kb! zVP!{HacD4NEmJItq)Uq`fKZA}DmXike>M?%k#tM>P=hGsTu4_qSQu#m^-j_-{1FX8 z3OW~hCZl^$;`$EiLlkN;ti~qVj9}4ffvmoRnvoc!)px*fQ8+8{w{k9uTJtCi(4%t$ z@~9{aJWEO~BI*`#1dU6ic@$AqmzPj_lywE#C#|>Q&`VZeRHO(5nUQ=!AgAq;IqBmF zz_=CUXyT*;c_igE>oT$?U|@*;2abR)m>eP<9*a*g@zFN}^yJ_Np=735o4bqFV7HjoJSW#0 zjCew=QN})*)=0Bmv_>hSTdfhs?zKjEx@yftbbPH@HKiM^5x%I_)DvmV6R$PL$+ZSA zKcUvBu$@e6#CI31(HFdKwMH1b*BasJsx=eQ@wH}^-fpx;_@Y|#oJebk{Ftwyqd8fG z@?vv>2&LFMnbwH!E?RSl$I%*L>|Sexr>oXXM90^f75&|4jqpXa=7`hUixPbnNB0-| z$IA*FNY$kd`d+xyELLdvY)j0Z235v^Jm=(j4yO-ZWt@@5&Do(jT69;m%Glbe)KX`N z?~d1^Xwp|qR2iO#lZId; z`*GBc)JzJ2xSH8T8q`d_leEI6@mSJWl30mF-9XjS{ck(|tK0D|ZpR&xEf$L+dJT99 zV$l&Fi|8`C#3JC7XcDNQ7nBGORD z(lZT)q7~-PQgpa0HozLgKSh4Y$sq6N?aNqa6(=#h_#tW*}hcO}Vi<+ea z?OXKv8N2H}Z%%B^8nMU!$9c;dhJ3j4;j|AXuNG==Pi9OSyF2}NYumL?KXf|Q|NQ$k zfqmc1%)Y!VOW5{E^T7|dev~h)`XreN;!Dli;>KHcj~(*V1EaI<`sUkN3?SZ^z!=pTiL3Ho{Wj>ziwN1=ctcYEkA4VSEKe{@?6Ha-AB*&J?lB+^O+-Tp`>es zb4pUdTmIhMz^PoA6u|Cp&+5M$B`-GiY#@HQ2PZ$ z5I_EU#47{OOZ#Q<4Ih=yx}wj!|GDx{^WSOwMH>6|j&)Oa7q4I&kMslBPv@;Wx8H`+ zVcy}@jhA@({9?}>Tv)L^@a{t^?Zq<|?>$#2$p)B|yL;=X+=QR@AHHYMoJZUG4O=li z^{v$h)7sa}e_Q&zWz#>{Dn$jD`q;?DljR?(UcO+hbByb{3%1?8kKKCU*1Fq1EqeMh z?ZRK#k=G%q^!asxdvBOD@QJ|AOV@3f^U717jd|(sTke=x_wKquHUCxc$c=1E4uRzq z4)&)^Z5e!Z`?cS!c%tE~WsjHN(0}|0-B%)&0f?#XHg-I;}$# zM&Cl-``oI}#y)%~_{n?M>|2rahusIRzWnCh+me_5b!?9zBaey~ju5m=a-@Yl&K&d6 zZI3!Df7yEBkIf5bZ(X$crcLKw`Oe}AD{kEL-KMvNb3ROg6(+V#e>43L54^Qy*vhHT z-Sqk=Z#eERzgT&pa^)4L2R9_9t>peD2y>-Z*9?Dt+0ysN%qr;Pa{pZZN+&Tzx%P97QQZQ>DwP*_gyjn;)6+rk8S>PhHQ& zk7sTRzV_6i_b>VR#xon!TG-adoGG9Gdie4=O?zBN2To&qCp*C#>-3vmTAV+9%=kGo z#!eeKWW?l=MSfrPOs%x0(jOc#-I|WL2!pZ4q?scomyXBy{Ap84$IrCTsI%wLDDByj z9rO%V=hPC3gn?4`#`F1wXYHGX=c3nr zmv5tWapM;iKu}tFc8|S4@Z+sZ-dYnGSZI;$fqUk{J6qK@R$={VXw|tR@%^`O3nBub`Vz4<~3WcAH7y7nwxs z4wDqQz9e_PxunEjTC&-#`%3n>t4a=c+$|-ibwSBRXmK~m9lMs~(TyrxWWwDiJTr=Y zHDhW*{`~yuVXSCiv@V>UnZR!yCGty0(TheyqxX!4^@!d$>KSaPsVLVb)mMcpN<#j! zin@xLV1E8Z6N2G_occoG^@ocq8m9T{D$21iNE=#Tm~lMl^g-Pt!k!3cy(UCC9_I^H zR|Mx=|)Yq)Er6;*^U3RhIs z<>#0C!#+MJ@rSTlS1=3=rsqwoLK`a^z$^|2>nvJ_vu%DZ_pPW zIat3_AisANN|toN@B<vC^BfVE?c#io^4@VN!pW)_uDA{6J)mc6uMkXb-Dy*9~`PF z_l14zY-cS-^=1B0o#4T+%#Vw@<=OKZg~ahS)&6-Q{}ozUl`lBoHgxFVA%lmrH9}I@ z7otnHm*EO-eaK(u$a2rCud2*8ufb*|#Z9tnYQtH5%5Z}>yCPU#ff5tWMw$;*)dc5f zxvHt|H2A9O{aH!X^HqS0(D0*^%j z5fl*vqr@%33<4tRfa8L`Ah?Xe)2HB*MQ{}G=K^l?o$9_z5(wyxlWRf^6`eok^J zUVo|GQ(Wu~WEJEE7^7=-c+Ttqljzhk%3CmFP8pNw!a5>=JcfmuwYHm9&OxX7Cm@G?z|8CjT<8ye%FF~hxiGiL>uMGP2P;?FI<$v?YrMn1Dr zi^Y?hJ0Wi-vxy71$J7k>cF}jF(X&l!oA_Dn4*WFy=%{Ma97&QiMPjnWCRItEJ@=_j zYhR0{z*|sQR3EG{=hO z#~O6be0*n2d75Iw)Py%32b<5sJ7!NMn_~66wQ#Ch$kXz+(V#?Sn%f0u+!1@e^^Qk>ZXu;$CRPJv3rsTuM^9>wrH= zNhsHqG^IPnDO{c$>LU+wFA`y?)HhbwLbt?qg61SoWJSsR1;3d2x`nQ}E(fozmAWmH zFXk35oJNWwvLRU5!6i}BDNi0o{}|*HOaM`0a4*In zirXNH$RUa&QFbF~EWr)ZS2NDs|7FtaNQk-%tcp~nRBA!m)JTy8Hj*l5*6xg%7)mzW z$>|J}#z<ybs!l2uSMP02>9%9U`z(WnI3>0v;Asfj%LG@c{+m}bLs%oc+L zS)7?nIFyp)Y+cT*uKE6gmL0`BEfX}zu?2Fhd8AU^>XCf94a2P5;`1m0&k<5NLXBgb zJr1o27L=qdA3f|SOGu|6j>Xdwb&N<~$zuP#9W3o>^qMs5J?EUsV)n1%F!)mS?quAWFj z8zo4S28sknCL2!~NRp?FMM+~oBX&mCEZu5Uv*9YNk$mO?@`5a?FeKi4Al|ZZkDL+{ z+!eY6%F!v)74ysnae9584YkQx=DvA0u95;`_FRJoN?a{ZV>T{(!0PT?re!q|=t-Hs zoIQI=uGFOrxwp9Hi!5_l8YAgu$EG*qLn9Nh-f}rn=GZvMRFR~?K2#{=p2WaJ z?}VbrP%y0$oRvkASZgda5uC;9nV^BQDsk3AoV9|pAZ8=ZD%rX%4y_3qYRa0A9=14L z4RTf!ob?cARk+cjTQTgN8vZah56GpG)M&(BwE-~!lY&`9@=~`~pl1X2T8O<3InM3G zUR}*1$^kgAfU9+2zHU#WJx=xK^Z)#DTWYtVT#fu9<3x@)YVE2!Dg-!oK^^22h>8^= zUt|Gk<5G(3st^e?uWYzNn&}3EqfEXCcjJ8`#b^WBoMjzM0V;j`9dCLuD%Pn zQpugcWgF-A@Hu*y6JuQACc1`fgMr}S#5kxJLY27#EbfYwJNGM+Ex1ted|e4v2$BJo zsDuu~x$1G3q71Mfh(oe%P$?wR8V8+Hk$rCCmN?z+kxO+Ow^M>0#0ooh70@g2Vi?i` z^l?-JMGz63$bljshs+K0NC9rgv4~`eHirNN#f5S}&B^Zjh2CP?h(TzThjR_397qL< z3M5b~#k628RgT9sEzmlqS(+-hHZB>-8+tS2(uL`Uhq#SK6g@R!qeOOGMx)xGrwxt5 znb}Fj{1mQ0soZOfC6X(N@TmppNOO=&VT*RoxOVA4ohGUo4n!k)MI$pBZAMSEK~HS8 zXt)?`_7ls#fz4WS3}m1OX5IcpmQ_@(0fRscDfAl)j4W0)+B!*smn10!j#j7JDnUhK z7g?b@NT(!@z2G9Q)Rlu^pcHhlPIqGK7Vc-uklnC}E#@N8rvfEYUG2uQ$+ZNF*ciZw zVU=64xeVD|%$?;JXWS~+LxyO4_xYJ@9GO6+H)BP`jKpr0#LJD|mFP{}wov{Icpii~ zFv(_Kt}`wvaYU?#j7#R+8^#P8XVU)Sn7Nz5j52*Cn6;LF9cHH8rkELq5XF^XMphbN z2Bt=07A&_13{-w4gu5-Wy-KY#pOc#E2opNu!HR+4g_c+_8)$}=w8VzOf@auBOR%LO zU2%|>82X_*NlP5q?>piQ!GM+s2_Y>J;v%$!G=#LoVQ7iP&=QGi5zhPx^lS*92LCN} z+*U`Fc2z=TgUpXM7#&TFCh3h}v@Jn17#$sCw5wc?uGK*|DuQT(`zCj7#9gyLTndKT z2yKlRs)faEJ)!Lq;--2yw~(&ss-bLR=8#$76QO1HNG-Dg7E37=y9-Z94Ydo;VWrSt z(MZ~5r)xaOk^W$F3pjC2%2=dZMGT0-20Uo3vDWEP3kaR)>RMW>Jyi+d4vx%Ng%uu! zyF9v5j|pKH1?*rJur1;)9z*D170ZAkx(sZv)fM+mL5Rlc78(*>vWzj9i#f_fR3${k z4uD*QO;E;Q6&Ztxa`L7U&MM&y9EsJYNIy(aqX>jZTbdVX%f&=mG&UA#(b!O=MUx@Y znN?|!ZbsYRDq4UTwtS+kfoA_zR_S?BLIELeY|C2fGPWU<2y7Lwk}M#(R&@=@u!v+} z38G}gP?YEbwKkO8axo=mhAOEcA;j8T0MlUHv=H4WfK5N7McUlG~5(Gvep#92y>SK@ZyF6AQ=t;=xz=` zS0sSgrd*DJsDMiXNbBw80Hi550njBk51?tdDS%|HDS#2?E(74j4FfHp4)gauWb)#cPg%rs1XllC`D)Mwq({fEPCm0LgF&Ks+>r zO86tiV!UdV#Vc2N5T-8C(yi3d%ff}m8i$>#Wr4W`gBa3^RF#0mO{`2dV|~WMNFCl~ zM(k59wK|qu+S20fCr~sttEN_|VTq&rVTo%nYH=fp!|cp~CK6)B56++&D^M;sHZfSD zY$V=T*+ENKLu5vnDYA`Xv_^!77d%*agT|YNN4&g9Y_8xGNxmD!78=qhFshL&3(RVm zu#z6Dh|1M4DykIPWN)BV*ZH69{(ENk5s}@43idDbzeyDAUqB$#tu3-{v2$ryx3Z{P zypIsXmVJ}%>((6Ah~DB6z!+%OtxWsM;0&77ZP*GJ zPA~mXx7e)XX&ifKL>f`GELgR{;83;3iwxSPAq3teybSCJFA^IWzI1egWzQbQnO1^Ezb<*}{Dvo`! z?bCE=#fjETl3%aj^ULn9&+75w6N9dM3gO}v6_deTaSu1L-iM??%ee1+|4yN@`X3=zUF`DoLKmD%KWvl%f1*k znbkzM!Q8s+kJ&wM%+{XQo_u`A@;3Xg*(!Zg(rV*f-+wu`)zP?KwT0}+Px0vH+8y`D zAL4!Ap4<578zUa^)SurmYi(5jsQeaZ#>mUAb03iAe1Q<;&(8IGvt!@*pXT55Y3}6P z+aCJw<$s>}LD^4A*89(|8&^MM8LK(d9^EeVUDv1mhU{Jmy$i~wxZ3_?P3o4B_nhz0 zQ_HPGCeAN3IaRso7q&uk zqnmrjfcc}bT3d z`<8VZroH*%=YwDWVe3O9iVv;pTKGTxpShQ9O`&cn8Qr|G<0`w|RlDfxWxGndEZLcR zPlw_Ca^6jH*E~P+tKE`Yj>FshtFv!@>$_*)+1H`tr;i`)G;~8u#;7l*wTRmPRf>1K zyYo~@a&MuR{!6!|-JEsH`rqHydu#Mkr+Z1#Ti5OR@$)40KFfhI|0wELA$9)=-Q-90 zGp~J+;u`)@*8wx?)sL2LJ)JnP{Wj-29}jsx{;8|#WNFa-#NL-ze4h36asP=A?>@XN z<`4Bp@4D^2`t7Y3{ynQjj{#@pk^Ll|L`0g~qVwQSA9&WD|I@aS=PTw;-8OH_%1wRl z_+b7G%kDk!?WXso?w`aW3nQv0yxZvyPrSFa*Ya^MuYCK&JGRGjZ`NMTUw->F{teOb z%LU&g=~iX`>fWy`S@_Z5$^F|poImEi@bup{BoA*{^L}!d&-}3?SoghGA%v=~(Q`lS z+wI!qXXd0l*iSiqVAKk!reJK@s4+bq6Nh@+Nk{q;ARU)Hx%@(#6U%NtRgpSxSLvjT zbBF5J4?5N^X7yFw&g|1(XH;2C8u;z*ucr4r-v9NeYqZ`kCEuBN{F$SFk2&c$KG9ph zW98hprLFBcpxfr#XWo1)CS%8zFPCp}zmWdsJBK#CR@Up-?zL;i9d4C5^&x5N=60Cd zX9GJOIO}NF|C`krr_Vo^yt?9#k7O zSfyS6M%g2eeVLN^<(6!AXT=kD<{sPl)Lyer51;S6-T&5$$3L3#r!6cqtnD6!Xn_yn{ zy9p;*o>7zfjm{p9^I_x1WDlQYnsHB^MrZMR$39O-e?iI|axwSIA3l_EEM8TyO~Y}( z^a<0QIL3Cq;jf?!n_7HJX)=zl%|YD4~jK*e3Fgz)m&^)W(+z-ss5Y- zue2(Pv+(CqlK4_eHb0V5g5O7}4L^<2BEO2VSj`WjtP$Tr*_;udLD|hOpd4ftA3r(6 z-#xi>&un}tg^#OnOdOI^IJmILo1Q))fEGTZ&|e(rloTbtaEcZmIE6lH>KXc`saK28 z*G(;Zg)9usDJsbG&ooV?r{6Ru7bX)+{Ka`Q{oY(YyU;&V{7Gtc!zBle$0t^$-l0V~ zGXi;q{_yld#&0V27L6?|4$ic-zqBwfmyar$9mpG7AZK>oo!) zkKo_c&3Fcf8fZ!c_efnX=^13YRHa3D{@ri${4a=^b+XSXD$FgJ;VmkbTsWQK#rM3q V$Nr diff --git a/bvm/Shaders/dao-core-testnet/app-admin.wasm b/bvm/Shaders/dao-core-testnet/app-admin.wasm old mode 100644 new mode 100755 index fac846d916caa7cdd3445653a54ebf53301705c6..191364a73f816f0b56c33c30e4c2b2f4be95ce3d GIT binary patch literal 19384 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 literal 17869 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 diff --git a/bvm/Shaders/dao-core-testnet/app.wasm b/bvm/Shaders/dao-core-testnet/app.wasm old mode 100644 new mode 100755 index 160856b60aa162f31fac0a2a18d9ed7ff644f77b..c13333f69037af72ac88bd6b52871a3a12bd5f5a GIT binary patch literal 24311 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 DD|~Bl diff --git a/bvm/Shaders/dao-core-testnet/contract.wasm b/bvm/Shaders/dao-core-testnet/contract.wasm old mode 100644 new mode 100755 index 26818c8b3599a7b547f6ec2de8a7345c115e11fa..ccba0a9ad1b11cb8083296f651fb9062a05e18a6 GIT binary patch delta 6153 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 delta 5983 zcmeHLTWnlM8J?MQ-yS1MB-voKZqGu9N)psoAwtLsu}GA%X`CoE zR*}|wmLzT5Di3L=2q?E8LH%Sz=>tMsk^)luK&6Toq^d$ZAc1&lctSi-zJF$~c9NPm z9=cBUob%88|NNKl`)AHxnSK65md!qWmNUlqboRyU$Fm|$dGmymrYU>z$nSRrQ3f9m zAG*38KhHV$9L|Iv@{}jnzT;+tPx}7ZQ)kaz_?pm%_-^sL2X&J_yr&|0ja3~fc~Yq- z{6bkItjwH8q>wCWEwx&#o|NN@E!=F89I{uJTKX0r9yLRI8LPE^`=?#as#7$hKgQ@i zVw6|(e(|OBThL0T;%7-)iG3mzu$yP`*GZ7Yl3_i*O82;BQ!KzGfD>jQaT69_GV9XJ zxV{bd&=Tg~FA!uJH4z;C-)lyazpyik+gVWHQ|$15T=!E{@VgTPTrfg~OR=6vtnwTg zPUL6$Jd=FFnN-NZgi~%Pr|L}VMeuAjHUJ-1cpd`O#Bul(L;eeo!P%T=#>QK~3SiY>pW2V%Q z&*+DP;_ew#3iD8>#i}y{8y}W<{X#G{dbI42#rxUr1C%mS2coLZQGFwrPBGfEc{E|j zrYTgm#*7}H5Jv&s*7bk=+dG!Hfu`$b;V$p`UC3C~N7>%MXHV`e#XJFZoii;kUpnY2(;^4W7*xV8fiLv!mkrKQ#l6Jey`tD43q^F=u{yOt zXi0ysU=5lvYzE<2BG(R*=Amg|9*kH!I@VRK)D@Pi2q_t=47yOetAi})tVB$kqwL@G zUo+J#Fx7#Zp2*77l*TidN(fRea_JQ|GHjHCADBx}dzXmn5xCp|+#obZx&yFL(IRFJ zfXgRv^+Rwg@E#GmlzV^>fnZTP>8=2oD$;+h(-hB`d?168?-jX4le_j) zh$m#61{l<9@(M=B>Uh%Axf3PS>{zKRXcZwdDEm%iDEqdPOq#?CKnM1t zlJb)fJe9r-N?@wHfDl9JmsFI91r^Fjh9#9DE=Mv0ipn5i2ay28hpRh(0W89en7>e$ zAo{_C&&vqc3&cxF4U!S&01`k^#NRNjIE8oUGls2+lpY{HzYh^P=mOpX{DQfCVhqo; zKPdRQuulxzM@9t4Y-S&G@VBQDTOr6mLf_iSS)tpTIRxt=q-HhD(vN1wQg2>5b~Ukp zaS)xJa|&rBmppPQXN6=RLS}`b6}kg6v8$81QEtyOTaZn|Hz^Is0SM8??azE6+|+C8 zgN6GJp_H`Kuc)wz`r3oVqRJ2txx}gBigZ>Qk`5NA6;PDLA)q%eoEEWoM20jk(!VZj zp3QX63ynT2OETNQENi}@x@z#PHF>GV9!K$r17+WATUgjml|k2vi}mT0qqh%zD))ws zfND0Z4;RKi7ZdsK5DBGsJ&_FGHIlZKwUJo0bw)x~x{*8{KjHt<7g6f!l~|?;D|>Lk zCC2!e1!e@qm=NFrGa_OPwk~2%h8Sa6qO!!83=UP9lBES0V~9eGF%&Y4A*K*xGPr^< zzGVy&7}H{NsQ)n$K7pIZ5jI!d&Y(sZs9;33*R72hD<&iy@MdGf=oE)P3HB@dI-6lub zNn0_FHD*E^{Dp?<=`3MZhd-nQXN+1aZYR~Hq?+A?*65j_qQNSP1``ch&ZSJdlxbv= z+NFc`P)zIb_bA(_KDx=U^zYuJ{M$7tBV662jBv0?8If&LwX}-X#gh2GdXiGFW!UtM zaG+`35H6j}Ik+;naq82S?EdZA7T!82!)~{0;Wb8ede5SADIFAYsNdf>zIjcjG3rZN z4&T2M+304Mj(INY}8*MaakFP5@;-_eHIQNChzbu13zwzRPF4wW%@w>gsqVnl5 zZ`=e2&A|a(4qoOuK2o}Aytl*mRF*KQ)8tN)(z-(n?6LuMITvx|2IC^2(xLGC)Zwxp zRp$S%GCwetdB;JUr=Qv!{cdU8Gn~cD!8QEileEIukBnc9 zqF3_n-0ay?{3ZR*${+YA^sXJFqn|&2a(4by<*Rc~f93Stsgv@lb91N7m)^PKi2lvQ pIWh8#zA>>yA9olePH{N4s?=lW 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 literal 17897 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 P3Y9fU+OFuvruzQ_a&Kex literal 22724 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 delta 5983 zcmeHLTWnlM8J?MQ-yS1MB-voKZqGu9N)psoAwtLsu}GA%X`CoE zR*}|wmLzT5Di3L=2q?E8LH%Sz=>tMsk^)luK&6Toq^d$ZAc1&lctSi-zJF$~c9NPm z9=cBUob%88|NNKl`)AHxnSK65md!qWmNUlqboRyU$Fm|$dGmymrYU>z$nSRrQ3f9m zAG*38KhHV$9L|Iv@{}jnzT;+tPx}7ZQ)kaz_?pm%_-^sL2X&J_yr&|0ja3~fc~Yq- z{6bkItjwH8q>wCWEwx&#o|NN@E!=F89I{uJTKX0r9yLRI8LPE^`=?#as#7$hKgQ@i zVw6|(e(|OBThL0T;%7-)iG3mzu$yP`*GZ7Yl3_i*O82;BQ!KzGfD>jQaT69_GV9XJ zxV{bd&=Tg~FA!uJH4z;C-)lyazpyik+gVWHQ|$15T=!E{@VgTPTrfg~OR=6vtnwTg zPUL6$Jd=FFnN-NZgi~%Pr|L}VMeuAjHUJ-1cpd`O#Bul(L;eeo!P%T=#>QK~3SiY>pW2V%Q z&*+DP;_ew#3iD8>#i}y{8y}W<{X#G{dbI42#rxUr1C%mS2coLZQGFwrPBGfEc{E|j zrYTgm#*7}H5Jv&s*7bk=+dG!Hfu`$b;V$p`UC3C~N7>%MXHV`e#XJFZoii;kUpnY2(;^4W7*xV8fiLv!mkrKQ#l6Jey`tD43q^F=u{yOt zXi0ysU=5lvYzE<2BG(R*=Amg|9*kH!I@VRK)D@Pi2q_t=47yOetAi})tVB$kqwL@G zUo+J#Fx7#Zp2*77l*TidN(fRea_JQ|GHjHCADBx}dzXmn5xCp|+#obZx&yFL(IRFJ zfXgRv^+Rwg@E#GmlzV^>fnZTP>8=2oD$;+h(-hB`d?168?-jX4le_j) zh$m#61{l<9@(M=B>Uh%Axf3PS>{zKRXcZwdDEm%iDEqdPOq#?CKnM1t zlJb)fJe9r-N?@wHfDl9JmsFI91r^Fjh9#9DE=Mv0ipn5i2ay28hpRh(0W89en7>e$ zAo{_C&&vqc3&cxF4U!S&01`k^#NRNjIE8oUGls2+lpY{HzYh^P=mOpX{DQfCVhqo; zKPdRQuulxzM@9t4Y-S&G@VBQDTOr6mLf_iSS)tpTIRxt=q-HhD(vN1wQg2>5b~Ukp zaS)xJa|&rBmppPQXN6=RLS}`b6}kg6v8$81QEtyOTaZn|Hz^Is0SM8??azE6+|+C8 zgN6GJp_H`Kuc)wz`r3oVqRJ2txx}gBigZ>Qk`5NA6;PDLA)q%eoEEWoM20jk(!VZj zp3QX63ynT2OETNQENi}@x@z#PHF>GV9!K$r17+WATUgjml|k2vi}mT0qqh%zD))ws zfND0Z4;RKi7ZdsK5DBGsJ&_FGHIlZKwUJo0bw)x~x{*8{KjHt<7g6f!l~|?;D|>Lk zCC2!e1!e@qm=NFrGa_OPwk~2%h8Sa6qO!!83=UP9lBES0V~9eGF%&Y4A*K*xGPr^< zzGVy&7}H{NsQ)n$K7pIZ5jI!d&Y(sZs9;33*R72hD<&iy@MdGf=oE)P3HB@dI-6lub zNn0_FHD*E^{Dp?<=`3MZhd-nQXN+1aZYR~Hq?+A?*65j_qQNSP1``ch&ZSJdlxbv= z+NFc`P)zIb_bA(_KDx=U^zYuJ{M$7tBV662jBv0?8If&LwX}-X#gh2GdXiGFW!UtM zaG+`35H6j}Ik+;naq82S?EdZA7T!82!)~{0;Wb8ede5SADIFAYsNdf>zIjcjG3rZN z4&T2M+304Mj(INY}8*MaakFP5@;-_eHIQNChzbu13zwzRPF4wW%@w>gsqVnl5 zZ`=e2&A|a(4qoOuK2o}Aytl*mRF*KQ)8tN)(z-(n?6LuMITvx|2IC^2(xLGC)Zwxp zRp$S%GCwetdB;JUr=Qv!{cdU8Gn~cD!8QEileEIukBnc9 zqF3_n-0ay?{3ZR*${+YA^sXJFqn|&2a(4by<*Rc~f93Stsgv@lb91N7m)^PKi2lvQ pIWh8#zA>>yA9= sizeof(DaoCore2::Method::AdminWithdraw)) + { + auto* p = (const DaoCore2::Method::AdminWithdraw*) pArg; + Env::DocGroup gr("params"); + WriteUpgradeAdminsMask(p->m_ApproveMask); + } + break; + } +} + +BEAM_EXPORT void Method_0(const ShaderID&, const ContractID&, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); OnKind(); + OnMethod_Inner(iMethod, pArg, nArg); +} + +PARSER_MODULE_EXPORT_SIDS(s_pSid) +PARSER_MODULE_EXPORT_KIND_ONLY(OnKind) diff --git a/bvm/Shaders/dao-core/parser.wasm b/bvm/Shaders/dao-core/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..773b0535c07c873d2260d0ffca2f045a9b81c1b9 GIT binary patch literal 2142 zcma);&u<$=6vyA}de@HEiQN`TNebOW5d^GFo1{`jPn{;vmXg4sRXHFz6Ys=zv%i>K zJNQto3#F>~AufpD5<-zs4ybVGp+_Ky3V}qBxKIhiKLCOgLX|3J*N!{02nk!-eSV*r zH{Z9jZ=QjKE&>2Fp)aEtmX(-a0G8D_j#0d<@mu2IZWJpQ^D6b)#)4nRwta&6tpFhL z6nmaC^o0me;uz+RdB+cFZ;+Ds^hN5{gAS-d49pnm^kVd*F16gb*-Vh$C`Hw^9B2sT zG!!6&G!=oO7f_6Fx0^HaCw1MWuFpCOlxwvxBK5Ue;5WU9G8GDoG&=9wwL_5KG3Q`t z$DD!UjyVfPacfAs&KHRBuieXCsC4-U@VAMLKTSQCQqN{$k88@YyI)fo(Q~Q>NYM>CZ=$IhKV_hW|)-3SO!X2?9W0m zjR&$&%;P~3#!n9F=Rn_IxssOA5qV$4Q6Jhn#*tmlKNGlbooO7R9c`2DP znwS^H5wA;r15?5Ag$ZRC36z!6 z(RrJZb-+Qu{5EAF1cVVcgn33uL}7vW*1XRsJV6+r&@j&iHn`~l3TsWzh7&Y0pW$O2 z$FK7VHe^2Q>Z_MZ2ij*gZykT-gYDe@iCwmP^oLJ24$rjTnA~T5e0uA2;}+Alj{g4I zk9WTR?%K7RuWuY&xbp5(@4t2N;Uho)^~G}w@BI1n@!Q`Vxqb7_(qoT4Tl$P_e)*yQ z-rpNzqhC)=!Y?T25tl;A;L1bFrq`1;wuwq0HYX(XB}HyYYQG!h`s33UqlrC8A52Ku zpluu~OrB%Sh@K4^jMy}Nq~Rh7*QQ!t*lc*zHhIr^WYAmY2CZer7&MvuZuGAvHB>~9 zpJu*IA_518_}191I^P^r;%1$OA+@cQ4jMV>yL5%ob+hgeuc6P*PR~pqhBr|;BCJ89 z+A80}7NcRIYOJ)JHLKSYt7YMb;-RuZ6W5L`i?GmKj~8jCyryMV)|#)k5+hEdFocAH5cS AbN~PV literal 0 HcmV?d00001 diff --git a/bvm/Shaders/dao-core2/app.wasm b/bvm/Shaders/dao-core2/app.wasm old mode 100644 new mode 100755 index 2e1d703d33641de07a2380ef9b1e6055b9155370..0b6113c3b147eb0db62377588a1e2236124e39fa GIT binary patch literal 27020 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 RwBmhb#6}X=EcpQb{cr9Y6rTV9 diff --git a/bvm/Shaders/dao-core2/contract.wasm b/bvm/Shaders/dao-core2/contract.wasm old mode 100644 new mode 100755 index 194b0637e71f8109de72c4ce3efc10047b4a4562..5740c8828070b4424cfc3e52c715a299280150f9 GIT binary patch literal 3981 zcmb7HTWnlM8UAPHoIPi+-dt71Q8asqjE!qIag(@p70JhO(?oGZAWl?OqRx7K;&{E@ z-R>T{F|yarg{0imQt&zD8tLQRdhy&R)vT1vRo66gN!AYe5jnOEb^0e5n-FjxEeZG!Czi!*iFzrfwxXbysCG3rlZQ>*UzPsp&{bnx5qd!eUME*uGBT2}l7XC-pQ}m82$1#1! zE&9?Y{>xrr0iN`oQ)$Xx;{_8N3N5qO4OVGTN0fWyc=mG))M|j}xrca~QbDmvd$jW1 zB6u$svo|81>`fkh(jxnkfe4?D&>JpP$}xJ~jF`U;18rYqKhHENnd~t5B0@*(yqhMu z&VGT3pKe4FPQ$LBERB$6K7cW2{bf{wX zscDTsO|O-XP-e!p}-**2mT4WLXs){7a1c&MZ%KVHm9h7VA@ z=~6MEXl;v6qoBdGWsXUkC$s}}5|}kF zVW?TyJ}@+eJBYu%?!o8m_vzk_8oS}8SgaGNk&t8Ynss>qLXFi@<7m5yUh{0m%jq;> zBXKRyBN-F7y|lJ(dzq7Iq0>5pbE}gKv$n$A+d6gobUUUnmGy}w4H+Zm#ZC~w-6XH2Y&=uVKlaJg4!rR-Ao*lgzy`3!Pv$=fT!ftbwnJL$j7e4iwL93hcOQvq0XVWC0d8# zu2K?5!fwEwd@taj?(|gTWE22+7pE*|!@IbHR=gN{*MWC=+h%Xw-c{3{+pBH9&n)a7 z<<0H&EO^&v?^?VAsIW6T2+x+SpF||#5{r$u+0RzTktm-E>N|dpuY;!J=NS9BD-Jr& ze)g=VQHC^e=8_lJ)*ZxWlxSje^Do!F_uJhJf7DB?n{CIn`V<_BvfnTJxte4bH651w zwKyzO>paywbNh@tZ~sMX)FI4V`Y**y~y~bh1@& zF^_lVpkBkjPIW-MMwx(7YPy$iRkkm&HcF4;A&~r?l-7o9G@oMkI!`fV#YcE}@Vf(t zigSsFoyG2#2j9XtK6rpwibJAWPY%#&tM%%T2sY~lb_FjLi(eg9=hXqR{j|69>VOv1 zl&<{EZY|NiLIIDmxT}b_pF=*sX1EHtIU8AkFn#q`Fa7KfaU_#yFGiKi^~2`EW_f&% zM77hb%{{~HTtsXgL!o19SS^Omy}>G@qhcb>iC{JF4dLHwKQ)rS7lO=#`aMC}=Vu7t z-nY-Z#bbHtaFvV1mB0S$Hxgt0mGw7mj7MkB&L%NF^6`^D+>P=1`e#<~BBq~Q`NaFr zVZ8dw{0rY_xP0xy1qhg4d~Dl&2>8d_0|PHZ!23V{_A`G<5Pj>3x9$*)JJnPbvc8bO)dWhbYRyn^EP$pfdl*3xS5Dve{E!a2ZZfZ49!fEzS zve`B%(=l0H&61ty^hvQTEt1pej@+${QQT?vM2TiQlr&>?HPzh&r5T9+C(~(tdRjfn zNY->P+e`z~Zdx91_bi8Yo|?>8j#X;G$k-T~ucd|Z{Mgvp5dGWO*r(AUtpvw;%L|oq z|NkI7R}X4uDs>Id)Wg1kT`jeTo$cbG#wwl=llOgFQ>jVSct049%A+v-whe ra7Wn$xmtxIhAvh^?gz7L*IYP`FwR>Vs~5VZJ;RTn_&W<3E+z literal 3870 zcmb7HS&SS<8UCxPuQ}G+K4MvRgsPjB*+DVbj@Ro1oD2^Y%;SlhEAkdTE$2omCjhj2W=_g7EP zVe>-oQB{BaSN;E2e^pVnu_%a0Je8la+x&_4lxWiw5gPPKw5DVmgmjjsRLUdUE#e8$ zl7AAzDqdP~PgGapQ`I_=8NE=e&U8mkG&6HzZk7a3Sx2i2O_JQrAC0TaXQG9L+B7Lc zn2nofj>dDd=bB_Op?Gq6rrL~8oU6{nb+Vb1GeSq|ah&QKVwpqLg@w3&Xl^Fuad~_M z&NwXL9E%sH7njNH4wf&ZgTj&XOEZm=OK@PGyllD=H`D2ynSLRi^jyJTPFS{BM#oly zq~jq>(Sz5lf_vC?7URWQ{emR#Slm2Un>n+WhOI-*TAh6BFgF{si6?1O*4;;&v+fu@ zmcPH%{kAQv_J`N;QS`u@55af0l__m55$?M5dz^9P6}QtH?_r z`{~5Ln#%aEavKp$c!___5Jg1$>1_`rS*BauvU_N5p|vC7zs77uSr`zDM9PsWG0TFj zR7m@uW07aN-lYpG3KIwUw7BI(6j&W@HU&%H1+BA2O`{|N85IMiIIf82D^OM5)>*? zt`lZaQr_x7oYO?YnNE_}TboxvKKw%1ix%5wD(vXzG7k(TkQ@V(m0%%>iit5A1^(w# zQJ(II?w3B+)=pT3DD<$wY3YwyYLwMJ@RAgb1*`_YZ(}pGb1iHF{AHM>E@mMi%5(tD zfg}=jc#^pR_YE;bvkeYpnThm~Y&GmBVzWDxh?WXgLp82;Lk?K&MJoeqh-8%1w$ScQ znQ>rqpo|t(`47I~%b~+#9m;I%wnDF>uW3h1G-0l_8ag~yJj!c~wbS9%dF^64kD1jl zhyOQ1paVd#*Fsy{TAtbw+L>PC(P+<((+Z2M*Ji!8b}~E0s;ljOJFd1cZ5cbve7P??6&3?s2<{3Non9Bw!Jf*~IGUtrK_>TD` za>80D8u7o#%-ebCca4JAMKUUBzl750mxgjpBqc@T%9tssbun&=3kM>U$4&l>t$qX> zY^NzXjg-Ja%&v{A)6n{VgqUFtJ0)X>^E(+RCheju#e#BsO|YUX@pFQ3l%a3MM+MEva){tAOEr^hbY<<*eJw~n$W28E1`>u z8lntqS360hn$bE=2;!(|$mMo`8aUWU-aI&R*i5Fo`(~^Aoz*p!R^NP_2QppGmv(H(Q_$IHcCvH^ZGg z$MN4BWF|ZMJ9APV=!%=q;b%gezsH@4)+W~4|0~PK(IJ_O9 zl||h)QI9z47R=ZiHWO|>gC9{RzUqZ4gq*BM-6aQP_k>t53Sv0+ahfSuNh*z+UAz^h69@OgYjivBF2#VId!aYI$%V!AR93GJnK ztFQc!>GJwt=b&J6{^J|(Lcu@ZDV5%Ug8RSv=Cgm!6Mf^r?K|&pAv$0F&gA?~qVmBv z_kM2zf)k(d{|-fOLH0+Go41H|x>u95S9CaT=Pj=r! z`?frPxLP|@tH*oGWxVDV=ay#6K3m*@)}MYYjbJ wTWU0SmLAK@j?vECa=kWlembr= sizeof(DaoCore2::Method::AdminWithdraw)) + { + auto* p = (const DaoCore2::Method::AdminWithdraw*) pArg; + Env::DocGroup gr("params"); + WriteUpgradeAdminsMask(p->m_ApproveMask); + } + break; + } +} + +BEAM_EXPORT void Method_0(const ShaderID&, const ContractID&, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); OnKind(); + OnMethod_Inner(iMethod, pArg, nArg); +} + +PARSER_MODULE_EXPORT_SIDS(DaoCore2::s_pSID) +PARSER_MODULE_EXPORT_KIND_ONLY(OnKind) diff --git a/bvm/Shaders/dao-core2/parser.wasm b/bvm/Shaders/dao-core2/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..6d1d1ace9157fb06de97f0388410b9d7f73c47d8 GIT binary patch literal 2073 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≦KwCBCgmrk{Di({E(y+l_q;6(ciio;I*+f7ucRS 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 Rwr$L-F0g26(Sv=%{{qwZ%5?w$ literal 17153 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 sizeof(DaoVault::Method::Create)) + { + auto* p = (const DaoVault::Method::Create*) pArg; + Env::DocGroup gr("params"); + WriteUpgradeSettings(p->m_Upgradable); + } + break; + + case Upgradable3::Method::Control::s_iMethod: + // Control method handling intentionally minimal — host emits wrapper info. + Env::DocAddText("method", "Upgradable3 Control"); + break; + + case DaoVault::Method::Deposit::s_iMethod: + Env::DocAddText("method", "Deposit"); + break; + + case DaoVault::Method::Withdraw::s_iMethod: + if (nArg >= sizeof(DaoVault::Method::Withdraw)) + { + auto* p = (const DaoVault::Method::Withdraw*) pArg; + Env::DocAddText("method", "Withdraw"); + Env::DocGroup gr("params"); + WriteUpgradeAdminsMask(p->m_ApproveMask); + } + break; + } +} + +BEAM_EXPORT uint32_t Method_3(ShaderID* out_buf, uint32_t out_cap) +{ + return ParserModule_FillSids(out_buf, out_cap, DaoVault::s_pSID, _countof(DaoVault::s_pSID)); +} +BEAM_EXPORT void Method_0(const ShaderID&, const ContractID&, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); OnKind(); + OnMethod_Inner(iMethod, pArg, nArg); +} +BEAM_EXPORT void Method_1(const ShaderID&, const ContractID&) { Env::DocGroup gr(""); OnKind(); } +BEAM_EXPORT void Method_2(const ShaderID&, const ContractID&) { Env::DocGroup gr(""); OnKind(); } diff --git a/bvm/Shaders/dao-vault/parser.wasm b/bvm/Shaders/dao-vault/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..fbf20f7275cbd294cbb42cdc2a8a08b71beaaf61 GIT binary patch literal 2697 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 LMqvxF)cF4amCC>i literal 31311 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%0Dyz84@X?*+h4 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 diff --git a/bvm/Shaders/dao-vote/parser.cpp b/bvm/Shaders/dao-vote/parser.cpp new file mode 100644 index 0000000000..540bab4fb2 --- /dev/null +++ b/bvm/Shaders/dao-vote/parser.cpp @@ -0,0 +1,110 @@ +// Parser module for DaoVote (versioned, behind Upgradable3). +#include "../common.h" +#include "../Explorer/parser_module_abi.h" +#include "contract.h" + +static void OnKind() { Env::DocAddText("kind", "DaoVote"); } + +static void WriteDaoVoteCfg(const DaoVote::Cfg& cfg) +{ + DocAddAid("Voting asset", cfg.m_Aid); + Env::DocAddNum("Epoch duration", cfg.m_hEpochDuration); + DocAddPk("Admin", cfg.m_pkAdmin); +} + +static void OnMethod_Inner(uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + switch (iMethod) + { + case 1: Env::DocAddText("method", "Destroy"); break; + + case DaoVote::Method::Create::s_iMethod: + Env::DocAddText("method", "Create"); + if (nArg >= sizeof(DaoVote::Method::Create)) + { + auto* p = (const DaoVote::Method::Create*) pArg; + Env::DocGroup gr("params"); + WriteUpgradeSettings(p->m_Upgradable); + WriteDaoVoteCfg(p->m_Cfg); + } + break; + + case Upgradable3::Method::Control::s_iMethod: + // Control method handling intentionally minimal — host emits wrapper info. + Env::DocAddText("method", "Upgradable3 Control"); + break; + + case DaoVote::Method::AddProposal::s_iMethod: + if (nArg >= sizeof(DaoVote::Method::AddProposal)) + { + auto* p = (const DaoVote::Method::AddProposal*) pArg; + Env::DocAddText("method", "Add proposal"); + Env::DocGroup gr("params"); + DocAddPk("moderator", p->m_pkModerator); + } + break; + + case DaoVote::Method::MoveFunds::s_iMethod: + if (nArg >= sizeof(DaoVote::Method::MoveFunds)) + { + auto* p = (const DaoVote::Method::MoveFunds*) pArg; + Env::DocAddText("method", p->m_Lock ? "Funds Lock" : "Funds Unlock"); + } + break; + + case DaoVote::Method::Vote::s_iMethod: + Env::DocAddText("method", "Vote"); + break; + + case DaoVote::Method::AddDividend::s_iMethod: + Env::DocAddText("method", "Add dividend"); + break; + + case DaoVote::Method::GetResults::s_iMethod: + Env::DocAddText("method", "Get results"); + break; + + case DaoVote::Method::SetModerator::s_iMethod: + if (nArg >= sizeof(DaoVote::Method::SetModerator)) + { + auto* p = (const DaoVote::Method::SetModerator*) pArg; + Env::DocAddText("method", "Set moderator"); + Env::DocGroup gr("params"); + DocAddPk("moderator", p->m_pk); + Env::DocAddNum32("Enable", p->m_Enable); + } + break; + } +} + +static void OnState_Inner(const ContractID& cid) +{ + Env::Key_T k; + _POD_(k.m_Prefix.m_Cid) = cid; + k.m_KeyInContract = DaoVote::Tags::s_State; + + DaoVote::State s; + if (!Env::VarReader::Read_T(k, s)) + return; + + { + Env::DocGroup gr("Settings"); + WriteDaoVoteCfg(s.m_Cfg); + } +} + +BEAM_EXPORT uint32_t Method_3(ShaderID* out_buf, uint32_t out_cap) +{ + return ParserModule_FillSids(out_buf, out_cap, DaoVote::s_pSID, _countof(DaoVote::s_pSID)); +} +BEAM_EXPORT void Method_0(const ShaderID&, const ContractID&, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); OnKind(); + OnMethod_Inner(iMethod, pArg, nArg); +} +BEAM_EXPORT void Method_1(const ShaderID&, const ContractID&) { Env::DocGroup gr(""); OnKind(); } +BEAM_EXPORT void Method_2(const ShaderID&, const ContractID& cid) +{ + Env::DocGroup gr(""); OnKind(); + { Env::DocGroup grSt("State"); OnState_Inner(cid); } +} diff --git a/bvm/Shaders/dao-vote/parser.wasm b/bvm/Shaders/dao-vote/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..c4ba83687d79fe51582a520c80bee79be4363bf0 GIT binary patch literal 2831 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 awDvm9RBftMMZW6hyNSv=Hg&LzhxH$Ric50< literal 1930 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 literal 40128 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 diff --git a/bvm/Shaders/faucet/app.wasm b/bvm/Shaders/faucet/app.wasm old mode 100644 new mode 100755 index 02e568fde080b876e2fe09a2bcd929f55b77abd2..1356b7e82fd5ea8ce5194db1474e9287fc18781a GIT binary patch literal 6542 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 W1FNo`oDxOQ{|Gxl2%?;83 diff --git a/bvm/Shaders/faucet/contract.wasm b/bvm/Shaders/faucet/contract.wasm old mode 100644 new mode 100755 index f1b72b4a67964cb805af7a48a09485e169b7af37..1d0a458a7962a805767072dcb867de34517fe7f8 GIT binary patch delta 301 zcmZXPJx;?g7(nADO(LQ;2&5vm?8ZS<9Dq*c0PK-tzF1NH6WL!{I<-fr6p%Op%q*OW zofQEK660H*-g}Kdlf%=+I3xjyQ?etA{XWW)n>f~>t=o=*ysA8Mv8p=T8Uz=exOHRl?OK>@m@O(GDwHj&%n?fjV zWIUgjSLJo^NOI&(0#*%h>>c=&W_7Pt?6->Me}LHz=}d5?SZnTE2LhR0gHzT>dZc@W y?V76|Xs&zYwE`xUt-12_v@}1lUDq1Pnhw7YY3`r_2SxzHZ3mvFzLkc-1AYP0m|`^m delta 92 zcmey)zMO5sR7Dn6#sWr0MpkA<1|~KR#(GA_h7J~Pc0E?M+|=CsqDrQX2elcwSrk~K vco`I!9R=Jbe`j3Amcx>ln43Cz3sX81gW6<6W=USw= sizeof(Faucet::Params)) + { + auto* p = (const Faucet::Params*) pArg; + Env::DocGroup gr("params"); + Env::DocAddNum("Backlog period", p->m_BacklogPeriod); + DocAddAmount("Max withdraw", p->m_MaxWithdraw); + } + break; + + case 1: Env::DocAddText("method", "Destroy"); break; + + case Faucet::Deposit::s_iMethod: Env::DocAddText("method", "deposit"); break; + case Faucet::Withdraw::s_iMethod: Env::DocAddText("method", "withdraw"); break; + } +} + +BEAM_EXPORT void Method_0(const ShaderID&, const ContractID&, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); OnKind(); + OnMethod_Inner(iMethod, pArg, nArg); +} + +PARSER_MODULE_EXPORT_SIDS(s_pSid) +PARSER_MODULE_EXPORT_KIND_ONLY(OnKind) diff --git a/bvm/Shaders/faucet/parser.wasm b/bvm/Shaders/faucet/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..f81ee119d1b2742ca1a2a98e8fcf5f657d4dee69 GIT binary patch literal 1127 zcma)6zi-n(6n@XYlEy8GKw^N!VF01XrN6|&K(Cbk7|Mjim|W~@YHIte^SNo3CO`*3 z3=AL!SdiG*7!Vr^3o{!70)d$M2axdDZ3#j`*wWp1-+k|${qDO1nnnl!c&^gHA#}81 z(dvFc0B8Sch;HDu-|mspQ?HHu7KBbeF1y!ber?8`+2WZ?@85OKHEpm5E^HyQ< zxM0d+`$@}PtVALN*gB8OcD*z1_@*P;Vgr@+CYA+Xxi z$mb#o^?b@f;xzWvBBvC**+d6a2aZODH_vEOVA}-kv+(a?9W3~tGW#AP6#F{DWtK|8 z2e3hRoqiySh;+^-#mT$8~yO)%PZ%>`%AB%8w{SJ5z~mlq@Cwa znV9aYBe6LF;}*v;cWVa|g|YQNJ#8G=`N)SeM>d>4a^Yfd+aWaP~0oryXE<5)yD=dPh{()N5jy~ixmjwNtf?15%Rd#szq5SgQD84dX!1p4Vl{ud6$N1 n>qN|BDQJ=eanIdMq&kYNx?r13u-Id++LyFdO@m(S<~PDGfKpc2 literal 0 HcmV?d00001 diff --git a/bvm/Shaders/faucet2/app.wasm b/bvm/Shaders/faucet2/app.wasm old mode 100644 new mode 100755 index cb85aca997298252da40d5b6019bc24fe93928ad..081e3a60a569e3394d40c11003e3020916bb88b9 GIT binary patch literal 6978 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 literal 6323 zcmcgwYit}>6+ZJ=XYI9<0ScI;(AkAVUPvn^K~C64A=gdfRBhTQji>}a?D6izUVC?D zGdt_VD2+F@NzzA}04Wp!C8~-9h#$=_D)C5ZB}DtH6;P@CN{f(6g&?9rszlWAoqO*- z?UoQ8wzPBS-1ENQJ@?KbuUa;U$hd!C!dRdQa{)g@6V?I``tYm&Xrf1rj0G?qXU^jo zCL~eP7Vyhrc#v^?!sZ!c!MtRxwftZ%wJXevLSZZlYZW4<^eM_g|7c7G69z!IqZC$s z#bh!qxyz4=bN>EWviNoNm>>9&7yEblQQ()zW};RtqR5+9st3N{Mb+_r;hcXDYfmtj zHaA)dCzUQOc2BK5@>%MUEK*Fmp!GC7Qo5x_DN(KZadmumP%G0a7F(k!O?$~Uub_U* zW))x0KEGV74pT2r_iLdxYdoJXSEx_=GUdnPd;Q|nbWABG^h)QX)qZ}L+?9FF4M)fP zSmsiS_uLmptV`PBNHMD-l@v|}C^8v}AGQ&e($?aK>%CTQ(jcdmE?J88PD%pJX-4aEs9tsCEk#F-dd*T z?e~?sDy7;y6pIgW6sP#tkx?k?+K01}t~_7v;rZ6A=6||HS?;sudFDEJe)@hq;<}>{ z|J7`?XD0QUX_^bh@lUGU)Q#DU@hLTa_fgK}SMWlvA!x*`@FPdAYq;cmN7H{vGiehO zZ{kVjPHQK|uY>s*p2-pOsA~+dAl|OhjLVwdp&3EWNtWL|fQcdV7$n99FgIi#6-haA zjjT1Du|~I@bgj{$lcVfXz5d)aT3iBQP!leHei3g;^>*c!#U-9ho@VZM*6`FIkFTzh zLPHq8YcX}(>7}Kmt=4qMR*}$jP2oDHAg(urbi)DIkO{d5`YDw%5hH@iz*-mH&U*-@}#)N3YsR;;7&nj8x`h=1Curl9hl4J*~8a)0E1s+ z7Z?quc)1ztMbk($Vy&NOL(w(lMWaa2=z{YIOH0JKGieLS zd+ZMae}PMrxX8XMuQ~MR%d%vw8jGUc%#m9ROB6d8o%jJU$ZLacTcrRa+? zBftmNPfn+ub3CzIuhT1P{#H7y2)ZJDm3h*Z@;GY^XKdHPzkP6B2EPwTU%trOA!}_* z+Y0K|R%@6MpSAX8?5)UrO}(913LwYht;;lW?DBWnAQy*BS#ZWOzea*Aa@%c(5DoqTZLp{gg(a{ zBjj;rrQP+CSFCUBe)h+X(u8_1bxp_}Y>M?G<{&7}h*{z!Xt$-X%gOpPd}}NIU>Owa zx#D9~5)MYPehrbAvBY4EOeJG%xvQ%VM?9VrDB*`O8k~!w5ffrqd2CCY4+^{cps+g* z3cK^5z-#lM0Aur@fEImFK&d<^WJQ7*`+sc4?x<}4P{18BNpBi?+mYca0P6$EkOvay zdc_0Dq)P)9u9Ntp(1+4F)ErWC?WTGEi3_};fi)NSa?bO{Y}SnL%Zq`$WML12 z_gT&BEa$z{#j7-`tLWoOtGN?Ih^jlOCb~3=vRBbXh-7X32J^2~Gj&6#a)kS?G2^Hy zb{u8Ts_f^3IcwF8Q93YyvZiX?i}Et2{I*gs${VGlZ~>xH40S{eE2u6wnn6bC6q|S` z|Nkb7Cpk;(Qoo5Ls2J1@xfz(cJ1Sw<`6e?9cMm(q>M+*FF*~z*#EkKf{_yE4Sx_z1 zKhMBhL;Q%(Q*5Db%j#CEEsKZcsr&6N@6=8FhP*?)L(1i49jYOz;&#hJ&#R<%RbMMO}7p#7)LbQeCTICE36Q#_-=(-w1fI8{R9pBr_5xjU(|l zGIuSQaDaBk95Hca!{uTtV8se^bPTT`A5~OdF$7=2L$4vH1IwJi0|^uTJi|%AQzhfg zt^{bD{&vMZqdsApS%DJlnd@0~^>w2KaU^}W3l-{Hr>Xeg!R#3@xfuroZDhu5#^frhZgix>U@LBbIn^?>RiHriDc?@f}*hG zSIH}sivi^$AMGld^zyT%aB4rgSz&>6U*||Mo-Rb*k-LlKVoahO)`FM{el?E5dCC_H zbVnG(k(ZC}+(mOm{|M#zJuK1W?!cQY`BWQE)bHFpB|S9(BsH2d&Qs_Op(f;fZB#zja)X~8yS@FpaZ~&8-&PY#m^TH z75xGsW5qBaAs=0H#bC}W6$`GKq*^c=AR?Ew&>@xf+ce-bW~xL#PS}B0_Kl|#8PeTO z*;+N)TCZkj*VSq^T6(tFsiXU)ALwhfN`;PVS9qkwd zT#iMTvwk}J@tf}r#(9&D^B!;8q(cC4_7fXBW)(7*tJ$#8W$s%ZG$zBa4e-6vyA}TrQhjE;~d}v5-kXFl^=|K_Z+Mt~M4DI}1UM*}Zq`US?;P+1Vsl zNKO>7uu#_zVCx64uoLTmz4o?#1?NrzLNd*J|HtpW`Om!R(#i6>uUiY00BQT=m_*ZQ ztF!pnZ|9g7X5v9G7*tj!`-8H`v_(VT|Gd-sywFz7AMbL%JC4|xL$uAN?!XmJB3FWl zu@|SB^kL7Hp%0H-_yOaH%&10@duxvU4iT`Ir?6SF9xtwuGd~D7mP%6$>jX_j zR$Q83RpC&?6SDfC$T2o}$P*=X+TPjeZTD`%M-o_RQnZ5+N?RMO{IC<(YG3@@QW*Rv zL{ZxCVj`6i*;75t3?^0-2WV8G({MSjmCX*Msxb`m+R9j=NL3L_RfQMy`~hW|=~RqL aJKJ~|7#yKNouIIj606X!vQ!H^vVQ?8Xq<`w delta 309 zcmYjLyH3ME5Zt}>D>%S4AVjrB0-VB#R1t`RQ)nn@>4IZ{tk{lhQKUdP5<)2`i0&sS z_yIlv!5`28%;&K(_WAk!>1HsrK8Bn7n7I%it5Q4`-&U8(i`b+d1 zvyH|ql@ALgGDHB&I63``^Fq7s9IbqiCHkA5LfC7K%VKyNCuN0gv&KnPCBx`yf_6L_ L= sizeof(Faucet2::Method::AdminCtl)) + { + auto* p = (const Faucet2::Method::AdminCtl*) pArg; + Env::DocGroup gr("params"); + Env::DocAddNum32("Enable", p->m_Enable); + } + break; + + case Faucet2::Method::AdminWithdraw::s_iMethod: + Env::DocAddText("method", "Admin-Withdraw"); + break; + } +} + +static void OnState_Inner(const ContractID& cid) +{ + Env::Key_T k; + _POD_(k.m_Prefix.m_Cid) = cid; + k.m_KeyInContract = Faucet2::State::s_Key; + + Faucet2::State s; + if (!Env::VarReader::Read_T(k, s)) + return; + + Env::DocAddNum("Enabled", (uint32_t) s.m_Enabled); + DocAddHeight1("Last withdraw", s.m_Epoch.m_Height); + DocAddAmount("Epoch withdraw remaining", s.m_Epoch.m_Amount); + + { + Env::DocGroup gr("Settings"); + + Env::DocAddNum("Epoch duration", s.m_Params.m_Limit.m_Height); + DocAddAmount("Epoch Withdraw limit", s.m_Params.m_Limit.m_Amount); + DocAddPk("Admin", s.m_Params.m_pkAdmin); + } +} + +BEAM_EXPORT uint32_t Method_3(ShaderID* out_buf, uint32_t out_cap) +{ + return ParserModule_FillSids(out_buf, out_cap, s_pSid, _countof(s_pSid)); +} + +BEAM_EXPORT void Method_0(const ShaderID& /*sid*/, const ContractID& /*cid*/, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); + OnKind(); + OnMethod_Inner(iMethod, pArg, nArg); +} + +BEAM_EXPORT void Method_1(const ShaderID& /*sid*/, const ContractID& /*cid*/) +{ + Env::DocGroup gr(""); + OnKind(); +} + +BEAM_EXPORT void Method_2(const ShaderID& /*sid*/, const ContractID& cid) +{ + Env::DocGroup gr(""); + OnKind(); + { + Env::DocGroup grSt("State"); + OnState_Inner(cid); + } +} diff --git a/bvm/Shaders/faucet2/parser.wasm b/bvm/Shaders/faucet2/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..004cc0033b722abe6a681655a62d287dc00386d3 GIT binary patch literal 2030 zcma)7OKclO82)G0>)2j9UV(%VT-E_aiHt+@P!6UFnI>*pL3*GS95^^@@5EkbU+m5% zwFGri!s`MTIDx0~IhZae4$ zh=aE7w~1wKgnk?V5|Tn9xkN8Bz+)yCVs~*Nk(9W}n&U?_aZ`?4EiXZ4EYKOpZ-FWV z`RC0rYBs#sg{(N2X7 z&AQa}!#;*`vl%h7z0(YQ+ha6TAh$_b*SDIBP#ChOKpV32P#m%gP%8YARnH?dz^eu{ zN?;)QAh1!vJk#MmRFJ||1|o*O&p+^pV0#s0fFNLCGU!d=5@;Gh+6`XnfZRLae)@s1 zCcg@v+?A56Qu4LnD=JKLTM;90R2^wRzDm)%NqGS36_R3R9)7lC05!r+`os^>|+JFX^GS0Co>g)c zg?uEsN(b<*upxJ(BpLj*WF%+M%lc~~QqqO+)w%EcqoPRSd*h_9`&a&oBtQ}ofCEZAtmEIU^3Gq75(*57wJY4GHi^mq?as2V+aq@J?TelGJs5p zpZT=n9th){VgHjT0Kp~R|p%1!ULRr zNz)E60{MUa8{Izq@Rg@-#ee3?=7fBohZV3h7^p^I1b}62v$;sMBmJD;8jPu z<)v)uB;a;pgtWQiAe%3Y@bw567mr}^)DbGqmyYmp@+xZizGF1J-Flt7KSxcAhKUBB8m6`uEHQK%xvFU$%OwUd{ zfKGsXzJOq2F7z#vneb#j;2fWK7@;C(+cb)(RcrOpA^t&r{+ZO8OF*@cC<`MD){ z7nPYAb|`CZ^Nq$KjdE436+1h%Z0z{LBhS`O(p4XM|rHF1%mYEI0n#@~Yf E0N>kl*Z=?k literal 0 HcmV?d00001 diff --git a/bvm/Shaders/fuddle/contract.wasm b/bvm/Shaders/fuddle/contract.wasm old mode 100644 new mode 100755 index 12b6d0e14dd666378a7d42c003be065e879d653f..e7a1c0c511a467b7feab1502e6b0f858a5faaf1d GIT binary patch literal 2853 zcmai0&2Jk;6n`_b>ukJsvZS;U<+3)UO5{2%Y3f7~hYoGi0VUa}opo6SIZt9hBQD+PUZj!6ns??f}qU;kxQJ z`-i}2F|+L*sQ0`9a9Yi7je4!&wXnGlLZ4m>y;gQ=T=jwo3_7s2;Jdvb6D6%f6~$T$ zvenw|w811ngevwsuxwKAoNeC!Mar3+ePcETq#0980I` z@M1dMfaAqK=jCG1yl{ZF5si8xh}vpUE@|+ zIG>SJN!VJ;=g-x$Rc5iMjmpShR8e9!zmV5lHE)$67Son0rarA0bjfhdkI62M@90>` zRSEP>5JP>_5u`wh36MXt$!k4={ptin4TX@#Cccl5FF%W5170W0@aSX$kuRMLCFcsc z1mx4zaK#^174!1!Yo1^&bJzA zaK5C`{{ES$k|e|o(&4Z;oW&&lFbWo1q`b^Wv6aG4$%jVY242U)@aq zrKB~+LqChocRHVRL%M-xey6~2ob`1_(yf5n)~p|A98Qlii$8LKjrg8OUpwCgUBFte z@;3l$HmPjdsc;P@mPpchv}F_3nz3O_K5B)T;o`)wxd|vpJ*`IQ3EfFu913{-KN>2g zJ%(DU3i*JVa_S9kRj_>t$)l)dt zD%V7Rv-ik4_b;3oDKJM?z6>yqCl&@mkI;bMEcB1bC)gnf2F#alvL=j)Zoi#+Oj&^G zmsL>uqIjLl$d~+}DyXY7`562P7pT?cnE4G@(-v~suF;iFzUs3gF&Z3n4jZwu+_nEH z5{{*bMIxxwL>X*!c!?}8iw!6KgGj=hDz01)IkNm$@ddE2!9!v6ysm<|ax?5j1Fspa z+$E~>2R{MRe1#=cg{Le|22s)kqI`2} z)M^E4bMvNm7>=Ur;elG(R?U9QH+EWHfG*Zhp0#v6Ku5% zNY&=MqsZF}RJ|R9dtNZC9qZ|&==VFlcKvogBEnajAE?`Epn6SJj}H54ShEPSy81Bs E8-hQfX#fBK delta 1228 zcmZ`(%}Z2K6hG&_`##1uQ%@)xP4T{GIx`Y#fs+iOJ|hz{grI`JVo(X5I)>FEH#2I9 zix%0XZM$d}MC-zKQxNnIL>pIbY7?~V+&dpWjd+VQ@67r5o!{@A_quKG#PiLBJNc+I z|KLVxX=g3ic{|~A6YnFUX&^Am!7_%GZSL9&E!OhF^2+LCCOdH!_vIR9E;*5a(D&9W zl?rqS3?UCWGOPfDWCo)U$v9Ei8-ll?gIsb9MQ7-D1zZO1uH3^+!V!iF!&TYJPF}-) zfjI!5vvD>q*yR)m5Zv2TIZ1T&%ad9G6`)i5l%Xz9l|OW@q@bQE@34+;=56U@=BoId z0Rg8LWX#(s@V4Yv)-e|F3kJ2Bfa@u&*9<{Db>vB%%v8MYEews4l3W!olSUVQko`u_ ztu(!-)iiN(jIa<1%oC|K%oLz8N1@k*?GbD$Yh;-dfM8L;^2`xTz)T7W#Djvz#U>8*O^)8qj#!*;nH|R(kRPxR!(~biGlSJWx+V(toPFnqC6DZ8a{{+l7X1 z8wRrSR1f)y>tC=KU`lcQ!^Sw$Zb zfP~M2@3UH$DKb@Pw29(dxDSzF4W?^Rs_)1@RMU25*+>8(YN|(?RMTMci`k7;xo`To zD3eyYHG5>&vvSz#Nvh4(J4fp;BkLlK@W$$%QGCUAzY#%8-lWqk07Vf3$f^E@J{>_u zonYKHr@~|zAQ3(>xiLyY)26EQ+<+|No{K$}(>xz7HVv1blV{Dd30UY}jju^uO!>z?JBH_V_J4#_>p=IdNQJN*1w79{Z#!2fOu{Q&N!>MP zAffMBZEG9x1~L0 P&Mg&7_pEb61N8g_A{PQs diff --git a/bvm/Shaders/gallery/app-admin.wasm b/bvm/Shaders/gallery/app-admin.wasm old mode 100644 new mode 100755 index 4b65a8311401293cc704d007d82afb564b90f6d7..8ce180cad8767732c0afb2dd117defac7912b2fa GIT binary patch literal 18351 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 diff --git a/bvm/Shaders/gallery/contract.wasm b/bvm/Shaders/gallery/contract.wasm old mode 100644 new mode 100755 index aee67bf463fd3320e04de5b5b4d885aa6791902f..f3bf6bf056f70a4f4e49ba0e60c768f43ea4c251 GIT binary patch literal 4393 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 a=q@IxhnFU=Y>L9-O0Bs(RGE4f|NjAQr?t@l diff --git a/bvm/Shaders/gallery/parser.cpp b/bvm/Shaders/gallery/parser.cpp new file mode 100644 index 0000000000..3cd0dd1c71 --- /dev/null +++ b/bvm/Shaders/gallery/parser.cpp @@ -0,0 +1,142 @@ +// Parser module for Gallery (versions 0, 1, 2 — same method shape). +#include "../common.h" +#include "../Explorer/parser_module_abi.h" +#include "contract.h" + +static void OnKind(const ShaderID& sid) +{ + for (uint32_t i = 0; i < _countof(Gallery::s_pSID); i++) + { + if (_POD_(sid) == Gallery::s_pSID[i]) + { + char szBuf[16] = "Gallery v"; + Utils::String::Decimal::Print(szBuf + 9, i); + Env::DocAddText("kind", szBuf); + return; + } + } + Env::DocAddText("kind", "Gallery"); +} + +static void WriteGalleryAdrID(Gallery::Masterpiece::ID id) { Env::DocAddNum("art_id", Utils::FromBE(id)); } +static void WriteGalleryPrice(const Gallery::AmountWithAsset& x) { DocAddAidAmount("Price", x.m_Aid, x.m_Amount); } + +static void OnMethod_Inner(uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + switch (iMethod) + { + case 0: Env::DocAddText("method", "Create"); break; + case 1: Env::DocAddText("method", "Destroy"); break; + + case Gallery::Method::AddExhibit::s_iMethod: + if (nArg >= sizeof(Gallery::Method::AddExhibit)) + { + auto* p = (const Gallery::Method::AddExhibit*) pArg; + Env::DocAddText("method", "AddExhibit"); + Env::DocGroup gr("params"); + DocAddPk("pkUser", p->m_pkArtist); + Env::DocAddNum("size", p->m_Size); + } + break; + + case Gallery::Method::ManageArtist::s_iMethod: + if (nArg >= sizeof(Gallery::Method::ManageArtist)) + { + auto* p = (const Gallery::Method::ManageArtist*) pArg; + Env::DocAddText("method", "ManageArtist"); + Env::DocGroup gr("params"); + DocAddPk("pkUser", p->m_pkArtist); + DocAddTextLen("name", p + 1, p->m_LabelLen); + } + break; + + case Gallery::Method::SetPrice::s_iMethod: + if (nArg >= sizeof(Gallery::Method::SetPrice)) + { + auto* p = (const Gallery::Method::SetPrice*) pArg; + Env::DocAddText("method", "SetPrice"); + Env::DocGroup gr("params"); + WriteGalleryAdrID(p->m_ID); + WriteGalleryPrice(p->m_Price); + } + break; + + case Gallery::Method::Buy::s_iMethod: + if (nArg >= sizeof(Gallery::Method::Buy)) + { + auto* p = (const Gallery::Method::Buy*) pArg; + Env::DocAddText("method", "Buy"); + Env::DocGroup gr("params"); + WriteGalleryAdrID(p->m_ID); + DocAddPk("pkUser", p->m_pkUser); + Env::DocAddNum32("hasAid", p->m_HasAid); + DocAddAmount("payMax", p->m_PayMax); + } + break; + + case Gallery::Method::Transfer::s_iMethod: + if (nArg >= sizeof(Gallery::Method::Transfer)) + { + auto* p = (const Gallery::Method::Transfer*) pArg; + Env::DocAddText("method", "Transfer"); + Env::DocGroup gr("params"); + WriteGalleryAdrID(p->m_ID); + DocAddPk("newPkUser", p->m_pkNewOwner); + } + break; + + case Gallery::Method::Withdraw::s_iMethod: + if (nArg >= sizeof(Gallery::Method::Withdraw)) + { + auto* p = (const Gallery::Method::Withdraw*) pArg; + Env::DocAddText("method", "Withdraw"); + Env::DocGroup gr("params"); + DocAddPk("key", p->m_Key.m_pkUser); + DocAddAidAmount("Value", p->m_Key.m_Aid, p->m_Value); + } + break; + + case Gallery::Method::AddVoteRewards::s_iMethod: + if (nArg >= sizeof(Gallery::Method::AddVoteRewards)) + { + auto* p = (const Gallery::Method::AddVoteRewards*) pArg; + Env::DocAddText("method", "AddVoteRewards"); + Env::DocGroup gr("params"); + DocAddAmount("amount", p->m_Amount); + } + break; + + case Gallery::Method::Vote::s_iMethod: + if (nArg >= sizeof(Gallery::Method::Vote)) + { + auto* p = (const Gallery::Method::Vote*) pArg; + Env::DocAddText("method", "Vote"); + Env::DocGroup gr("params"); + WriteGalleryAdrID(p->m_ID.m_MasterpieceID); + Env::DocAddNum("impression", p->m_Impression.m_Value); + } + break; + + case Gallery::Method::AdminDelete::s_iMethod: + if (nArg >= sizeof(Gallery::Method::AdminDelete)) + { + auto* p = (const Gallery::Method::AdminDelete*) pArg; + Env::DocAddText("method", "AdminDelete"); + Env::DocGroup gr("params"); + WriteGalleryAdrID(p->m_ID); + } + break; + } +} + +BEAM_EXPORT uint32_t Method_3(ShaderID* out_buf, uint32_t out_cap) +{ + return ParserModule_FillSids(out_buf, out_cap, Gallery::s_pSID, _countof(Gallery::s_pSID)); +} +BEAM_EXPORT void Method_0(const ShaderID& sid, const ContractID&, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); OnKind(sid); + OnMethod_Inner(iMethod, pArg, nArg); +} +BEAM_EXPORT void Method_1(const ShaderID& sid, const ContractID&) { Env::DocGroup gr(""); OnKind(sid); } +BEAM_EXPORT void Method_2(const ShaderID& sid, const ContractID&) { Env::DocGroup gr(""); OnKind(sid); } diff --git a/bvm/Shaders/gallery/parser.wasm b/bvm/Shaders/gallery/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..737b3e9a73a6dc9c809c06499e8242b32620cbd0 GIT binary patch literal 3246 zcmds4TZkJ~82-;pCYxj?o1h|Ukxo{(bQ`nnW=q9B*q(N4n};n$YXuQ@CzI3cB$-QR zCc7Iin{BOay?|D&7qIG!Rti?Ih%a7>7leW$SkWgbRwzP+f>!z<)N|%cveVryloot2 z%bs)o|3Byd{#(xZ1Da3arb~5dQz@#B#L&GkE$QWt5V`Ibi2v-q{ zDBapLhl~7J2tzq*R)ZATgI!l^ap0~d&Wnk0Dc+M1gqVaJgped65aJ2cMtF8MCiiTK z$4z3|ZcBj7*qG;QdVS2X4a+C42#HbRPuP{QVMukBt3d87halZq7NIw_FDq?Ds4c8l zVN)7Z6bx8Y5f)2Jasq|hI}14^QaRU&NBqt-%7l~g(<`Ega^M`gU1?aBc+b+J(u zdNXoLp;?v`ML~&pGN#CC4ELAPGJcbt#&7JVBUgxz1naBKs5@@voe_9CF!xb8JNpAyXmbfk1WO{`ErAz=*iNriv7^j|LW0Hk6k1L8lIA z)7DAYd*9Q}76=Zylg+2%2RilQNN9ZHH+Rj6bU%awU zzqr{0!6g#8gE23{qmeHqFG3W(U+}^c3*#&BvgNjApJqt%kM!MYhp#}k-Y0NdqU!#` zM?kpj5eTU6BS0zk2nf+fKnNcJ?h$?9vYlA|Pu-G#7Z7`mWAbU?rpNwvzgU*L=kTew zUe(bB{ewemPnP*0}=)9W7J_{5oYQ^)Q7Ge;hgE_`Ob_{+IhzD}2pfBTK} z?(@%FJh`j11Rq(t{^;kY?BJNIv1&d5=X}O!J)y`@G{Eynp-9Q*iM?VCQWf7FPEE*dV#md`Amc;*p8pSS*OKUp!qXgqWcAV zlDN#?e9CM#d?P4}e8z10TDd_ARhm$(;pK0%Y|D2w$1$vGVW;D>ZabfG39T$*>7>9a N#mgsHNDA~9!@us#*1Z4# literal 0 HcmV?d00001 diff --git a/bvm/Shaders/make_all.sh b/bvm/Shaders/make_all.sh new file mode 100755 index 0000000000..9e9e025767 --- /dev/null +++ b/bvm/Shaders/make_all.sh @@ -0,0 +1,113 @@ +#!/bin/sh +# Build every shader. Optional --export [out_dir] also collects per-contract +# parser modules into a single folder ready for an explorer's +# --contract_rich_parser_folder. Default out_dir: Explorer/modules/ +# +# Usage: +# make_all.sh # build only +# make_all.sh --export # build, export to Explorer/modules/ +# make_all.sh --export # build, export to +set -e +cd "$(dirname "$0")" + +EXPORT_FLAGS="" +if [ "$1" = "--export" ]; then + OUT_DIR="${2:-Explorer/modules}" + EXPORT_FLAGS="--export $OUT_DIR" + mkdir -p "$OUT_DIR" + find "$OUT_DIR" -name '*.wasm' -delete +fi + +build() { + ./make_shader.sh $EXPORT_FLAGS "$1" +} + +build amm/app +build amm/contract +build amm/parser +build asset_man/app +build asset_man/contract +build bans/app +build bans/contract +build bans/parser +build blackhole/app +build blackhole/contract +build blackhole/parser +build aphorize/contract +build dao-accumulator/app +build dao-accumulator/contract +build dao-accumulator/parser +build dao-core/app +build dao-core/app-admin +build dao-core/contract +build dao-core/parser +build dao-core-masternet/app +build dao-core-masternet/app-admin +build dao-core-masternet/contract +build dao-core-testnet/app +build dao-core-testnet/app-admin +build dao-core-testnet/contract +build dao-core2/app +build dao-core2/contract +build dao-core2/parser +build dao-vote/app +build dao-vote/contract +build dao-vote/parser +build dao-vault/app +build dao-vault/contract +build dao-vault/parser +build dummy/app +build dummy/contract +build faucet/app +build faucet/contract +build faucet/parser +build faucet2/app +build faucet2/contract +build faucet2/parser +build fuddle/contract +build gallery/app +build gallery/app-admin +build gallery/contract +build gallery/parser +build minter/app +build minter/contract +build minter/parser +build mirrorcoin/app +build mirrorcoin/contract +build nephrite/app +build nephrite/contract +build nephrite/parser +build oracle/contract +build oracle2/app +build oracle2/contract +build oracle2/parser +build perpetual/app +build perpetual/contract +build pipe/contract +build playground/app +build playground/contract +build profit_pool/app +build profit_pool/contract +build roulette/app +build roulette/contract +build sidechain/contract +build sidechain_pos/parser +build pbft/parser +build StableCoin/contract +build upgradable/contract +build upgradable2/contract +build upgradable2/Test/test_app +build upgradable2/Test/test_v0 +build upgradable2/Test/test_v1 +build upgradable3/Test/test_app +build upgradable3/Test/test_v0 +build upgradable3/Test/test_v1 +build upgradable3/Test/test_v0_migrate +build vault/app +build vault/contract +build vault/parser +build vault_anon/app +build vault_anon/contract +build vault_anon/parser +build voting/app +build voting/contract diff --git a/bvm/Shaders/make_shader.sh b/bvm/Shaders/make_shader.sh new file mode 100755 index 0000000000..972aacfc1b --- /dev/null +++ b/bvm/Shaders/make_shader.sh @@ -0,0 +1,32 @@ +#!/bin/sh +# Build a wasm shader. Optional --export additionally copies +# parser modules (basename "parser") into for bundling into +# an explorer --contract_rich_parser_folder. No-op for non-parser targets. +# +# Usage: +# make_shader.sh # build only +# make_shader.sh --export # build, then export if parser + +CLANG="${CLANG:-/opt/homebrew/opt/llvm/bin/clang}" + +EXPORT_DIR="" +if [ "$1" = "--export" ]; then + EXPORT_DIR="$2" + shift 2 +fi + +NAME="$1" + +"$CLANG" -O3 --target=wasm32 -std=c++17 -fno-rtti \ + -Wl,--export-dynamic,--no-entry,--allow-undefined \ + -nostdlib "$NAME.cpp" --output "$NAME.wasm" + +if [ -n "$EXPORT_DIR" ]; then + case "$NAME" in + */parser) + mkdir -p "$EXPORT_DIR" + BASENAME=$(dirname "$NAME") + cp "$NAME.wasm" "$EXPORT_DIR/$BASENAME.parser.wasm" + ;; + esac +fi diff --git a/bvm/Shaders/minter/app.wasm b/bvm/Shaders/minter/app.wasm old mode 100644 new mode 100755 index 67399805cbc95c41abd0c741924c81d61865a981..d5e0b79579b86312521793cb917476f91adc6684 GIT binary patch literal 7742 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 I(nWdy0$YNR&j0`b diff --git a/bvm/Shaders/minter/parser.cpp b/bvm/Shaders/minter/parser.cpp new file mode 100644 index 0000000000..a40b5850ff --- /dev/null +++ b/bvm/Shaders/minter/parser.cpp @@ -0,0 +1,157 @@ +#include "../common.h" +#include "../Explorer/parser_module_abi.h" +#include "contract.h" + +static const ShaderID s_pSid[] = { Minter::s_SID }; + +static void OnKind() { Env::DocAddText("kind", "Minter"); } + +static void WriteMinterSettings(const Minter::Settings& stg) +{ + DocAddCid("Dao-Vault", stg.m_cidDaoVault); + DocAddAmount("Issuance fee", stg.m_IssueFee); +} + +static void OnMethod_Inner(uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + switch (iMethod) + { + case Minter::Method::Init::s_iMethod: + Env::DocAddText("method", "Create"); + if (nArg >= sizeof(Minter::Method::Init)) + { + auto* p = (const Minter::Method::Init*) pArg; + Env::DocGroup gr("params"); + WriteMinterSettings(p->m_Settings); + } + break; + + case 1: Env::DocAddText("method", "Destroy"); break; + + case Minter::Method::View::s_iMethod: + if (nArg >= sizeof(Minter::Method::View)) + { + auto* p = (const Minter::Method::View*) pArg; + Env::DocAddText("method", "View"); + Env::DocGroup gr("params"); + DocAddAid("aid", p->m_Aid); + } + break; + + case Minter::Method::CreateToken::s_iMethod: + if (nArg >= sizeof(Minter::Method::CreateToken)) + { + auto* p = (const Minter::Method::CreateToken*) pArg; + Env::DocAddText("method", "Create token"); + Env::DocGroup gr("params"); + DocAddAmountBig("Limit", p->m_Limit.m_Lo, p->m_Limit.m_Hi); + if (Minter::PubKeyFlag::s_Cid == p->m_pkOwner.m_Y) + DocAddCid("Owner", p->m_pkOwner.m_X); + else + DocAddPk("Owner", p->m_pkOwner); + } + break; + + case Minter::Method::Withdraw::s_iMethod: + if (nArg >= sizeof(Minter::Method::Withdraw)) + { + auto* p = (const Minter::Method::Withdraw*) pArg; + Env::DocAddText("method", "Withdraw"); + Env::DocGroup gr("params"); + DocAddAmount("amount", p->m_Value); + DocAddAid("aid", p->m_Aid); + } + break; + } +} + +static void OnState_Inner(const ContractID& cid) +{ + Env::Key_T k; + _POD_(k.m_Prefix.m_Cid) = cid; + k.m_KeyInContract = Minter::Tags::s_Settings; + + Minter::Settings s; + if (!Env::VarReader::Read_T(k, s)) + return; + + { + Env::DocGroup gr2("Settings"); + WriteMinterSettings(s); + } + + { + Env::DocGroup gr2("Tokens"); + DocSetType("table"); + Env::DocArray gr3("value"); + + { + Env::DocArray gr4(""); + DocAddTableHeader("Aid"); + DocAddTableHeader("Metadata"); + DocAddTableHeader("Owner"); + DocAddTableHeader("Minted"); + DocAddTableHeader("Limit"); + } + + Env::Key_T k0, k1; + _POD_(k0.m_Prefix.m_Cid) = cid; + _POD_(k1.m_Prefix.m_Cid) = cid; + k0.m_KeyInContract.m_Aid = 0; + k1.m_KeyInContract.m_Aid = (AssetID) -1; + + for (Env::VarReader r(k0, k1); ; ) + { + Minter::Token mt; + if (!r.MoveNext_T(k0, mt)) + break; + + Env::DocArray gr4(""); + + DocAddAid("", k0.m_KeyInContract.m_Aid); + + char szMetadata[1024 * 16 + 1]; + AssetInfo ai; + auto nMetadata = Env::get_AssetInfo(k0.m_KeyInContract.m_Aid, ai, szMetadata, sizeof(szMetadata) - 1); + szMetadata[nMetadata] = 0; + + Env::DocAddText("", szMetadata); + + if (Minter::PubKeyFlag::s_Cid & mt.m_pkOwner.m_Y) + DocAddCid("", mt.m_pkOwner.m_X); + else + DocAddMonoblob("", mt.m_pkOwner); + + DocAddAmountBig("", mt.m_Minted.m_Lo, mt.m_Minted.m_Hi); + DocAddAmountBig("", mt.m_Limit.m_Lo, mt.m_Limit.m_Hi); + } + } +} + +BEAM_EXPORT uint32_t Method_3(ShaderID* out_buf, uint32_t out_cap) +{ + return ParserModule_FillSids(out_buf, out_cap, s_pSid, _countof(s_pSid)); +} + +BEAM_EXPORT void Method_0(const ShaderID& /*sid*/, const ContractID& /*cid*/, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); + OnKind(); + OnMethod_Inner(iMethod, pArg, nArg); +} + +BEAM_EXPORT void Method_1(const ShaderID& /*sid*/, const ContractID& /*cid*/) +{ + Env::DocGroup gr(""); + OnKind(); +} + +BEAM_EXPORT void Method_2(const ShaderID& /*sid*/, const ContractID& cid) +{ + Env::DocGroup gr(""); + OnKind(); + { + Env::DocGroup grSt("State"); + OnState_Inner(cid); + } +} diff --git a/bvm/Shaders/minter/parser.wasm b/bvm/Shaders/minter/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..7892f6a98835c4b9d180b2e59c9e3515e36fd66e GIT binary patch literal 6952 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 literal 7869 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 Rcrstkx#JzzuKoi4{|6p4mz4kj diff --git a/bvm/Shaders/mirrorcoin/contract.wasm b/bvm/Shaders/mirrorcoin/contract.wasm old mode 100644 new mode 100755 index aa283e8acc250b79c1d8531e64821831469f0605..e1722f66a67fae31615bdab583435d069b973026 GIT binary patch delta 767 zcmah{O=}ZD7@l``^I?)rR)q>Rr5iyoY&SJUQmG*BK@f7txuS&4X0q&dznGnE%_#vv z)OwrZrHB3nj~=~v5b43I{RLk83!K>$5)^bV@6PkiJRdLbdF`bB=^<^Xn@6D{0a@cO5+z;yqP#FM@g zqTIq#RrPhz;P_$$?H)2YUsp_~y@Uma%yHGX&PA~I;=TxS3b%FCMlJ1FAi|=F&fqHL zDSM=Bz$M#Pnyvr3WFM97qQpt93-(=ke0Ryh$J|B(3$zcpOFk^2n}e)Z*t~TKN@Rx^ z)m0~sD6t*dIkMA`y(oN}m2SXaD}c7IB_tka4kjto_^*T06pzi(6zb375RV8x(w)GL z+~Uqor`vgePM|?;;$k|SV4G$Hr)8r$%7O!Pv1UeNL2BHL@&HNVMXotXs90H}LGT0<968ve(*&nR LIrZGg#INXY5);fp delta 587 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 LMT~4Fn&{t=$f@f!oh>?KDef8H-Re}T+=G@ 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 O;^v0@-L1W|OaB)F&Y`vd literal 32089 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 +struct NephriteEpochStorage +{ + const ContractID& m_Cid; + NephriteEpochStorage(const ContractID& cid) :m_Cid(cid) {} + + template + void Load(uint32_t iEpoch, HomogenousPool::Epoch& e) + { + Env::Key_T k; + _POD_(k.m_Prefix.m_Cid) = m_Cid; + k.m_KeyInContract.m_Tag = nTag; + k.m_KeyInContract.m_iEpoch = iEpoch; + Env::Halt_if(!Env::VarReader::Read_T(k, e)); + } + + template + void Save(uint32_t, const HomogenousPool::Epoch&) {} + void Del(uint32_t) {} +}; + +static void OnKind() { Env::DocAddText("kind", "Nephrite"); } + +static void WriteNephriteSettings(const Nephrite::Settings& stg) +{ + DocAddCid("oracle", stg.m_cidOracle1); + DocAddCid("oracle-backup", stg.m_cidOracle2); + DocAddCid("Dao-Vault", stg.m_cidDaoVault); + DocAddAmount("Liquidation Reserve", stg.m_TroveLiquidationReserve); + DocAddHeight("Min Redemption Height", stg.m_hMinRedemptionHeight); + DocAddAid("Gov Token", stg.m_AidGov); +} + +static bool get_Oracle2Median(MultiPrecision::Float& ret, const ContractID& cid) +{ + Env::Key_T key; + _POD_(key.m_Prefix.m_Cid) = cid; + key.m_KeyInContract = Oracle2::Tags::s_Median; + + Oracle2::Median med; + if (!Env::VarReader::Read_T(key, med)) + return false; + + if (med.m_hEnd < Env::get_Height()) + return false; + + ret = med.m_Res; + return true; +} + +static void AddTroveNumber(const ContractID& cid, const Nephrite::Method::BaseTxTrove* pArg) +{ + uint32_t iTrove; + + if (pArg && pArg->m_iPrev0) + { + Env::Key_T tk; + _POD_(tk.m_Prefix.m_Cid) = cid; + tk.m_KeyInContract.m_iTrove = pArg->m_iPrev0; + + Nephrite::Trove t; + if (!Env::VarReader::Read_T(tk, t)) + return; + + iTrove = t.m_iNext; + } + else + { + Env::Key_T k; + _POD_(k.m_Prefix.m_Cid) = cid; + k.m_KeyInContract = Nephrite::Tags::s_State; + + Nephrite::Global g; + if (!Env::VarReader::Read_T(k, g)) + return; + + iTrove = pArg ? g.m_Troves.m_iHead : (g.m_Troves.m_iLastCreated + 1); + } + + Env::DocAddNum("Number", iTrove); +} + +static void OnMethod_Inner(const ContractID& cid, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + switch (iMethod) + { + case 1: Env::DocAddText("method", "Destroy"); break; + + case Nephrite::Method::Create::s_iMethod: + Env::DocAddText("method", "Create"); + if (nArg >= sizeof(Nephrite::Method::Create)) + { + auto* p = (const Nephrite::Method::Create*) pArg; + Env::DocGroup gr("params"); + WriteNephriteSettings(p->m_Settings); + WriteUpgradeSettings(p->m_Upgradable); + } + break; + + case Upgradable3::Method::Control::s_iMethod: + // Control method handling intentionally minimal — host emits wrapper info. + Env::DocAddText("method", "Upgradable3 Control"); + break; + + case Nephrite::Method::TroveOpen::s_iMethod: + if (nArg >= sizeof(Nephrite::Method::TroveOpen)) + { + auto* p = (const Nephrite::Method::TroveOpen*) pArg; + Env::DocAddText("method", "Trove Open"); + Env::DocGroup gr("params"); + AddTroveNumber(cid, nullptr); + DocAddAmount("Col", p->m_Amounts.Col); + DocAddAmount("Tok", p->m_Amounts.Tok); + } + break; + + case Nephrite::Method::TroveClose::s_iMethod: + if (nArg >= sizeof(Nephrite::Method::TroveClose)) + { + auto* p = (const Nephrite::Method::TroveClose*) pArg; + Env::DocAddText("method", "Trove Close"); + Env::DocGroup gr("params"); + AddTroveNumber(cid, p); + } + break; + + case Nephrite::Method::TroveModify::s_iMethod: + if (nArg >= sizeof(Nephrite::Method::TroveModify)) + { + auto* p = (const Nephrite::Method::TroveModify*) pArg; + Env::DocAddText("method", "Trove Modify"); + Env::DocGroup gr("params"); + AddTroveNumber(cid, p); + DocAddAmount("Col", p->m_Amounts.Col); + DocAddAmount("Tok", p->m_Amounts.Tok); + } + break; + + case Nephrite::Method::FundsAccess::s_iMethod: + Env::DocAddText("method", "Funds Access"); + break; + + case Nephrite::Method::UpdStabPool::s_iMethod: + if (nArg >= sizeof(Nephrite::Method::UpdStabPool)) + { + auto* p = (const Nephrite::Method::UpdStabPool*) pArg; + Env::DocAddText("method", "Stability Pool update"); + Env::DocGroup gr("params"); + DocAddAmount("New Amount", p->m_NewAmount); + } + break; + + case Nephrite::Method::Liquidate::s_iMethod: + if (nArg >= sizeof(Nephrite::Method::Liquidate)) + { + auto* p = (const Nephrite::Method::Liquidate*) pArg; + Env::DocAddText("method", "Liquidate troves"); + Env::DocGroup gr("params"); + Env::DocAddNum("Count", p->m_Count); + } + break; + + case Nephrite::Method::Redeem::s_iMethod: + if (nArg >= sizeof(Nephrite::Method::Redeem)) + { + auto* p = (const Nephrite::Method::Redeem*) pArg; + Env::DocAddText("method", "Redeem"); + Env::DocGroup gr("params"); + DocAddAmount("Amount", p->m_Amount); + } + break; + + case Nephrite::Method::AddStabPoolReward::s_iMethod: + if (nArg >= sizeof(Nephrite::Method::AddStabPoolReward)) + { + auto* p = (const Nephrite::Method::AddStabPoolReward*) pArg; + Env::DocAddText("method", "Add Stability Pool Reward"); + Env::DocGroup gr("params"); + DocAddAmount("Amount", p->m_Amount); + } + break; + } +} + +static void OnState_Inner(const ContractID& cid) +{ + Env::Key_T k; + _POD_(k.m_Prefix.m_Cid) = cid; + k.m_KeyInContract = Nephrite::Tags::s_State; + + Nephrite::Global g; + if (!Env::VarReader::Read_T(k, g)) + return; + + { + Env::DocGroup gr2("Settings"); + WriteNephriteSettings(g.m_Settings); + } + + DocAddAid("Token", g.m_Aid); + Env::DocAddNum("Troves created", g.m_Troves.m_iLastCreated); + + { + Env::DocGroup gr2("Totals"); + DocAddAmount("Col", g.m_Troves.m_Totals.Col); + DocAddAmount("Tok", g.m_Troves.m_Totals.Tok); + } + + Nephrite::Global::Price price; + const char* szPriceSource; + bool bHavePrice = true; + + if (get_Oracle2Median(price.m_Value, g.m_Settings.m_cidOracle1) && price.IsSane(price.m_Value)) + szPriceSource = "Main Oracle"; + else if (get_Oracle2Median(price.m_Value, g.m_Settings.m_cidOracle2) && price.IsSane(price.m_Value)) + szPriceSource = "Backup Oracle"; + else + { + szPriceSource = "Unavailable"; + bHavePrice = false; + } + + Env::DocAddText("Price feed", szPriceSource); + if (bHavePrice) + { + DocAddFloat("Price", price.m_Value); + if (g.m_Troves.m_iHead) + { + DocAddPerc("TCR", price.ToCR(g.m_Troves.m_Totals.get_Rcr())); + Env::DocAddText("Recovery mode", g.IsRecovery(price) ? "Yes" : "No"); + } + } + + g.m_BaseRate.Decay(); + DocAddPerc("Fee boost", g.m_BaseRate.m_k); + + { + Env::DocGroup gr2("Troves"); + DocSetType("table"); + Env::DocArray gr3("value"); + + { + Env::DocArray gr4(""); + DocAddTableHeader("Number"); + DocAddTableHeader("Key"); + DocAddTableHeader("Col"); + DocAddTableHeader("Tok"); + DocAddTableHeader("ICR"); + } + + Utils::Vector vec; + vec.Prepare(g.m_Troves.m_iLastCreated); + + { + Env::Key_T tk0, tk1; + _POD_(tk0.m_Prefix.m_Cid) = cid; + _POD_(tk1.m_Prefix.m_Cid) = cid; + tk0.m_KeyInContract.m_iTrove = 0; + tk1.m_KeyInContract.m_iTrove = (Nephrite::Trove::ID) -1; + + for (Env::VarReader r(tk0, tk1); ; ) + { + Nephrite::Trove t; + if (!r.MoveNext_T(tk0, t)) + break; + vec.Prepare(tk0.m_KeyInContract.m_iTrove); + _POD_(vec.m_p[tk0.m_KeyInContract.m_iTrove - 1]) = t; + } + } + + for (auto iTrove = g.m_Troves.m_iHead; iTrove; ) + { + Nephrite::Trove& t = vec.m_p[iTrove - 1]; + NephriteEpochStorage storR(cid); + auto vals = g.m_RedistPool.get_UpdatedAmounts(t, storR); + + Env::DocArray gr4(""); + Env::DocAddNum("", iTrove); + DocAddPk("", t.m_pkOwner); + DocAddAmount("", vals.Col); + DocAddAmount("", vals.Tok); + + if (bHavePrice) + DocAddPerc("", price.ToCR(t.m_Amounts.get_Rcr())); + else + Env::DocAddText("", ""); + + iTrove = t.m_iNext; + } + } + + g.m_StabPool.AddReward(Env::get_Height()); + + { + Env::DocGroup gr2("Stability pool"); + DocAddAmount("Tok", g.m_StabPool.get_TotalSell()); + DocAddAmount("Col", g.m_StabPool.m_Active.m_pDim[0].m_Buy + g.m_StabPool.m_Draining.m_pDim[0].m_Buy); + DocAddAmount("BeamX", g.m_StabPool.m_Active.m_pDim[1].m_Buy + g.m_StabPool.m_Draining.m_pDim[1].m_Buy); + } + + DocAddAmount("BeamX reward remaining", g.m_StabPool.m_Reward.m_Remaining); +} + +BEAM_EXPORT uint32_t Method_3(ShaderID* out_buf, uint32_t out_cap) +{ + return ParserModule_FillSids(out_buf, out_cap, Nephrite::s_pSID, _countof(Nephrite::s_pSID)); +} +BEAM_EXPORT void Method_0(const ShaderID&, const ContractID& cid, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); OnKind(); + OnMethod_Inner(cid, iMethod, pArg, nArg); +} +BEAM_EXPORT void Method_1(const ShaderID&, const ContractID&) { Env::DocGroup gr(""); OnKind(); } +BEAM_EXPORT void Method_2(const ShaderID&, const ContractID& cid) +{ + Env::DocGroup gr(""); OnKind(); + { Env::DocGroup grSt("State"); OnState_Inner(cid); } +} diff --git a/bvm/Shaders/nephrite/parser.wasm b/bvm/Shaders/nephrite/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..90aaac24071b4816bbc10820f5c446dbd9e58476 GIT binary patch literal 21291 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 a^Tu}kXxxscN8_!mt!6hDn4N8f8T@}^-!Lu! literal 0 HcmV?d00001 diff --git a/bvm/Shaders/oracle/contract.wasm b/bvm/Shaders/oracle/contract.wasm old mode 100644 new mode 100755 index d806478aa133c77ea44df0a7b40ba5d63e150602..eb512c2d0ea509054c76de9419e0fc5fc4fb05d0 GIT binary patch delta 1053 zcmZWoO>f&q5S`s6C0P_DN(v08xePZ!U{|J_FGPTmgVsQhf`QNJZD`(EdpQn9LwImeC)J76= z1)(E)$Wfr9!ZeXi1h@-Gh_eM7UD#N8K^KCRSLs4!oICe<4IP9{fG0k9 z9JuDEw!$d}cHu6WyNP0C?j@?GAb4w&e)tS4uy^qK5`+7E zoA;1y!h?rCP>@GWh#Q2c?L;|bM54C7vhd)IO|{F5W4`|5wql7CL_!T)l1sIpzNr0B za%ifrf*T`5AJ z_e779YZ54q^4vt$v1*9`t9_qae&X=aP0*v)mVmAR>#9m3-FdPMt_d1xot9+{t4Pli z*|-)4SPz@%hb>zKTb77QHHkvD5v<`)sgR3pOKAzi7B($!6N5)SCkgewFGxa@@?C5u zv_@d_QU&1JDm=mZg1POvq#_8Gfl?nWH=3yWK5fymjh1br`LzvlZ7_ksYS12%2#?w& z<6~pVutuC^#f&VYvx;&QJ0XzFvE5`rEW(heE`*#m;}VdrI<-Wbs%--5=zcDdK_Ic^*&4i+-uUUT(4PP7VCDcvreQuRqSm z`k>IyagfH@uyp6n&h4Fh@EdEGxEN})f2dU)6p=C^r`tD+M(4- delta 854 zcmZ9KOKTKC5XY;#r)RR6>D}3#-Dr%5>LCOJF(j8Hf0pYNTpoBQ9EFv?3sHAqqYb$whb->NM-NTlpwLjHa9a%!$=xynK1>7TO}=pa zA1qL|oIvw{vTC4@4W%h)yp&FuyK3dZ1@RSKnM+zsI!?jUl(_PA>c&TT)?xgRjdQ2ND4;;R<|4cf7>nx~AU58fyY=s=sPI}+reLDoW_I9=4DQTQ z10c@@({(h&#?^CgI%&hGz@SrXZIG~~oO6Qdd7Fo(rhY9;oNzQ%6h}_H#?aMxJCLmm zhL=X9&DdFacM|MqS)P`1N1T;&JK-{$ulmSyEO}60>eKj1bhLN4U$4X?NlW!bJa6=~ NgT15Y@%q{-);~TIiqHT6 diff --git a/bvm/Shaders/oracle2/app.wasm b/bvm/Shaders/oracle2/app.wasm old mode 100644 new mode 100755 index 5aca2951683ac3381061dbf6147c0d3817cd61e0..7b6f31a4616cbbd5312dff25d81386727d01af2e GIT binary patch literal 22587 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 diff --git a/bvm/Shaders/oracle2/contract.wasm b/bvm/Shaders/oracle2/contract.wasm old mode 100644 new mode 100755 index 6088cc91c2e6ec07d1c598503bfc392d7054bb45..82ce8f7901a1d9a952b663c6b684d88ffc01d2c7 GIT binary patch literal 4944 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 cIv%&uqocHc@n key; + _POD_(key.m_Prefix.m_Cid) = cid; + key.m_KeyInContract = Oracle2::Tags::s_Median; + + Oracle2::Median med; + if (!Env::VarReader::Read_T(key, med)) + return false; + if (med.m_hEnd < Env::get_Height()) + return false; + + ret = med.m_Res; + return true; +} + +static void OnMethod_Inner(const ContractID& cid, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + switch (iMethod) + { + case 1: Env::DocAddText("method", "Destroy"); break; + + case Oracle2::Method::Create::s_iMethod: + Env::DocAddText("method", "Create"); + if (nArg >= sizeof(Oracle2::Method::Create)) + { + auto* p = (const Oracle2::Method::Create*) pArg; + Env::DocGroup gr("params"); + WriteOracle2Settings(p->m_Settings); + WriteUpgradeSettings(p->m_Upgradable); + } + break; + + case Oracle2::Method::Get::s_iMethod: + if (nArg >= sizeof(Oracle2::Method::Get)) + { + Env::DocAddText("method", "Get"); + Env::DocGroup gr("params"); + MultiPrecision::Float val; + if (get_Oracle2Median(val, cid)) + DocAddFloat("Result", val); + else + Env::DocAddText("Result", "NaN"); + } + break; + + case Oracle2::Method::FeedData::s_iMethod: + if (nArg >= sizeof(Oracle2::Method::FeedData)) + { + auto* p = (const Oracle2::Method::FeedData*) pArg; + Env::DocAddText("method", "FeedData"); + Env::DocGroup gr("params"); + Env::DocAddNum("iProvider", p->m_iProvider); + DocAddFloat("Value", p->m_Value); + } + break; + + case Oracle2::Method::SetSettings::s_iMethod: + if (nArg >= sizeof(Oracle2::Method::SetSettings)) + { + auto* p = (const Oracle2::Method::SetSettings*) pArg; + Env::DocAddText("method", "SetSettings"); + Env::DocGroup gr("params"); + WriteOracle2Settings(p->m_Settings); + WriteUpgradeAdminsMask(p->m_ApproveMask); + } + break; + + case Oracle2::Method::ProviderAdd::s_iMethod: + if (nArg >= sizeof(Oracle2::Method::ProviderAdd)) + { + auto* p = (const Oracle2::Method::ProviderAdd*) pArg; + Env::DocAddText("method", "ProviderAdd"); + Env::DocGroup gr("params"); + DocAddPk("pk", p->m_pk); + WriteUpgradeAdminsMask(p->m_ApproveMask); + } + break; + + case Oracle2::Method::ProviderDel::s_iMethod: + if (nArg >= sizeof(Oracle2::Method::ProviderDel)) + { + auto* p = (const Oracle2::Method::ProviderDel*) pArg; + Env::DocAddText("method", "ProviderDel"); + Env::DocGroup gr("params"); + Env::DocAddNum("iProvider", p->m_iProvider); + WriteUpgradeAdminsMask(p->m_ApproveMask); + } + break; + } +} + +static void OnState_Inner(const ContractID& cid) +{ + Oracle2::StateMax g; + uint32_t nProvs = 0; + + Env::Key_T key; + _POD_(key.m_Prefix.m_Cid) = cid; + key.m_KeyInContract = Oracle2::Tags::s_StateFull; + + { + Env::VarReader r(key, key); + uint32_t nKey = 0, nVal = sizeof(g); + if (!r.MoveNext(nullptr, nKey, &g, nVal, 0)) + return; + nProvs = (nVal - sizeof(Oracle2::State0)) / sizeof(Oracle2::State0::Entry); + if (nProvs > g.s_ProvsMax) + return; + } + + { + Env::DocGroup gr1("Settings"); + WriteOracle2Settings(g.m_Settings); + } + + Height h = Env::get_Height(); + + { + Env::DocGroup gr1("Feeds"); + DocSetType("table"); + Env::DocArray gr2("value"); + { + Env::DocArray gr3(""); + DocAddTableHeader("Index"); + DocAddTableHeader("Key"); + DocAddTableHeader("Last Value"); + DocAddTableHeader("Last Height"); + DocAddTableHeader("Comment"); + } + + Height h1 = (h > g.m_Settings.m_hValidity) ? (h - g.m_Settings.m_hValidity) : 0; + + for (uint32_t i = 0; i < nProvs; i++) + { + const auto& x = g.m_pE[i]; + if (_POD_(x.m_Pk).IsZero()) + continue; + + Env::DocArray gr3(""); + Env::DocAddNum("", i); + DocAddPk("", x.m_Pk); + DocAddFloat("", x.m_Val); + DocAddHeight1("", x.m_hUpdated); + Env::DocAddText("", (x.m_hUpdated > h1) ? "" : "outdated"); + } + } + + { + key.m_KeyInContract = Oracle2::Tags::s_Median; + Oracle2::Median med; + if (Env::VarReader::Read_T(key, med)) + { + bool bValid = (med.m_hEnd >= h); + if (bValid) + DocAddFloat("Median", med.m_Res); + else + Env::DocAddText("Median", ""); + } + } +} + +BEAM_EXPORT uint32_t Method_3(ShaderID* out_buf, uint32_t out_cap) +{ + return ParserModule_FillSids(out_buf, out_cap, Oracle2::s_pSID, _countof(Oracle2::s_pSID)); +} +BEAM_EXPORT void Method_0(const ShaderID&, const ContractID& cid, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); OnKind(); + OnMethod_Inner(cid, iMethod, pArg, nArg); +} +BEAM_EXPORT void Method_1(const ShaderID&, const ContractID&) { Env::DocGroup gr(""); OnKind(); } +BEAM_EXPORT void Method_2(const ShaderID&, const ContractID& cid) +{ + Env::DocGroup gr(""); OnKind(); + { Env::DocGroup grSt("State"); OnState_Inner(cid); } +} diff --git a/bvm/Shaders/oracle2/parser.wasm b/bvm/Shaders/oracle2/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..6a0fa086105afcf80e1b580e150c5b1e0daee599 GIT binary patch literal 11394 zcmd5?YiwM{b)LD;eNnu!6kE|M_Ux@9kfEu{Qb5ZaLH4Yk3{6RuZN@MHNGtM6+U0VW z+FdGAOL5mSBeSkuBz2s=;zU4O2xu)hO%b5K8Wm^*6)6%oK?@fsoCFrC6ph=WKZ>G1 ztbS+a-rc)P%8;A>uphklo-^mndCi$KXNMIVbDS~8j|`kNTdfvvo#ZWc(rBqaOY9`W ze|$;d*hvc`Xoy2k^@f4?w$&%dmXG_L{(MNiJZCcLE9IDqA z<{2kQN<*FwE;N}D8**e}ZtT;{?1k*wsmBa}XkVq)2s9&0F**}8PaFa3|bzzRV^gW=yCu`?}BQ$$L5hp_Pmi2n^qK0%P*Dy6XDOqal zU`gUZAB~_1jn{k06i*s1Hw?$&X`akjHlOF5+a_m*lYpIMyKSZ2!;Ui-%+=}_4K{e< zM59@po;@*ND^;68-DHW$pn0}7b7B`8j9zyzFM551-5o;b*B^e%s_AeRYZJkkHJFxDkFOBkkQJBhTsswi%>iHD-dxDoLE z=Q}`Q$v;nw4>Q7g z{7IWMRw9Jvv(p+Vf6(yauiVVoK{U96cYdvau^ftsYW5%XP z8m}Cebq~Oh6-p^JID!w>6P~KhcuOrDlKNn;e)Ae_EUK;)9ixD43dgeSqJNY!LF|mVqguy1P_;Q zJh$AG%7TCog1w%n|ZUop{))opZ@n&NHmoL*_e?* zD%?a%6yoDGgFJvoqAZ#B>uMZ6hm1td6wG@`DQieC^dkgdhlD9N9XywQ2k9R8 zxm3hvFMzu3J<2dufj!C?B~QWOecvpw<47e;@-gOR5PD1+coQ6vki#4~i^l4IO+_X7 zVGtM+3V4E2zgec$OM-j9M^e&YVID)iDzKbMJfVe0jD#_4CVZPv2yux$AsnGegiTq^ z6!sw4 z2mcJd;Jd<(UK2|Nu_6c{R(yMD(Rbkqa}dBcE6KsaEsCAY&=E!<=9v#p{V z1Qy9^MRX=n;m>7^i3mY&VrAe#{wL3iC}qBBa67i9Exo2CtORR06jv&?5OUr+lN-!T z6I__1%$6K+mXs&#EHs1 zwAqwV#QY8|IAI~-P-Vg>B-9YN3qz2cOz(H2AsID<24~=7T zD?laWmvdP4I@2S+EfXiw73n612=lW>STTeVr%1#QW*p(g5aFh%S&10Jj#J!VF^m(( zwBrK1J(#$};dZH~X~#uQ_Rz#-PW52oLZ^E$aj7#sm>#hQdQd%buj@s{1t081#U=N8 zQE}1N_oCvm-`9(Z3%{Wk)g%4JUR;m(AM3-#<-flV7gykcK3rUbO?|ky3Lo#o#dX-+ zhwD)y+lTDYVoN_VuEr<&k#Rj9j3Zmf6yf@LD1?VK$+oD}(G}FH!%|q8yp}YLmbug^ zPu?2rR0us4*eZJY-`!e}cEmiJ!egxG*kVW{&pxNXD0K+isdhNgj2Tx4@qA<5n6X7= zA=DQ5zB*XO-?woDGUS#{;Y0NS_UipY+v5@~;p$TQJ*CBEN~Ry8l>WE&^8cX#f4iSb zM;~%H+%itZ9`*}zz$MgEwy>tMvGO-Kp-~2`K2O~4T1)CfAL^t<9h-4iX;S$Hovjo%;Y?-2!;w1RP+|5M z)mbRLPy_fToj7`q91sXgQm;KFeAF-CFtRbs9u^kW)dsz9p~e8-hS*lx{FQdX2oK!K z5G$b}mgx!I@i(%>a@P{yr@+&wus>j=r2>YwP%){>O1*%?qo`ILgl`R&w<2s&1bi!D z+ARa87de_UDK)6{5G$sH5fxH$M3?$FoG_nCx-mvUXQEue1`KUgd4)or$}77}brO|V zoK7=1>VyQQ+yR2s(CrF}k#YxBQnTJ~l6>f1DRKaO7xU>^z@Cy69iVdwH8o1TbAZ^$ zPl;TTG)Hwx#|g8H>MKDNXR?r5x^zwMsB3wF<_8CuiGojWYLyo#bo#wO)`tR-Gsu0u6?2A)3P(%k(7+s>LZK!dUMMP(oq0O0CAmP-9~Dvb z^hQO3=sTnc5sHcg^y)@M7`d3P6Z@Sg7b%EOhBtLoBPYv8{jUGC3}_Nykq**)G%P02_vy5;8vN6>!D@8+$Bt!&9gklu zYbarGT2u=;Jj&_xp;`eh7P<1HtNrNeFvRXw7EWxH;=PUCj$!~dh50OLXeXkzfUuy! z{p%VLg>zlpgO2hbZJJ#V!d5*qbK6VnWeC+)ddto#ualP&BB!S|j&DX>xZMM_5}rUG~jjO0lNv|9TDA zhdGvtU`R6xIxKx#ADICdp_D39IRjJL^3JRO`cEd#xDs;X^Xe;36}sB;8?QJMzLiDr z{miXW(?s5OCwxYLJ9o@;@)pz3ciDvRW@U21H?w3w8h{0hjU_9wJcWhE3i`pMJY`nQ zY3TSckb$rR=yk4s=Rly)%&96^q$;!BT~YJvYIR4sZ=uO~t7BCtwgV zMyKy(7pRk?TV8fy`MY2Hhp456G1T#jU})XwRvF-$1AbwfmV-dUO*^h zBLl5;fkcnC4jy5X2MT5621IFw_Oh@->=`hAym|Lt6*)?7L&{(pB z)xPH22;mm8lR@^B=qcfU)m@`8p?U1cLJ4$z_t2_LJBSuGWjO0t` zm3DO^y{TKO6y{Jkn&6TTi;{XIGSp*QJru=qNwy$g;u@*~VUlvH-X(}^}B{4Bbpw@pq>V9bUP!%|gSi=|Wye=p@t6-&MyEgCCaFOJ|jm*UY1 z)q=Sl)gHDW4%&InlJ6{%i&vqUYJmllbmJE0~hR8KWr0@_cig-I(PROOB)Mj`BlDuw-oYVy12qLVt* zi;aQ~I(5`bD&+`35f7I+N;UdQ2z*0&?O&*y4AG0eMJhUxiWaD$A}1Ab$P9bmT=%}w zo<54j2o3Se9TdZ_99{k39|WdO*Bz9l*F054nRNQPW$`6jEmVokq<|gl`W0FqH{ZPa z$u>fY%iIL!1_-+h0gM86nJH`>zHyDVnd=I6+nu6~2cT%9(eQWKly7GX$tm>iu}o|< z!D**)vBlsGl_`z}I6IT!3n|R*&`h`35}0DFQTUlluf&<=r+1oIi$`BdGP0)fz%}pd zDoN=dWx_A?xv36xCF((HXd_gy&D>yh{Er<lh0^+A7q~3<7yhhZ6P-R34m6Xr^C6`(NFTkluM^4boR`IMj*NY5$S;#n`Dy zG`k$_Z!*zkn~2GmiA}MtcMAN(LEN9 z&UXLH&F_8w{jY!ZkFNa6f4!HzbZl{3>WAg^JKy}ZXOo{D->`A_@Ui0qxAK41G+%%2 z%kob@^_~4eqgk(AWD~(fwm+!gvd(yQCb+=%)#m1cYLgug8Vi*sJF71UJy~otMR-~0 z5U%P>ma3vSKVQdPpn8MJ&Ktpx0a}_-@R_+%wZZ0#_2OKEJry+ZU$ay_(_jaKV5Y%J z(NH!S%#?~%7JWk?Hb2XnXW98;Wg%c{`YHALRI}I&*uHu|kLJaB{3)KQ1Ps{HOsRQM z91H5D+6MR zI9&;LGWIuVt6H23kU617BdBlx0^R?5HT@6^FKY4l9W5hvJSmVJ{n)kB?p%pd z_pzK*_bQefGN4;niS7lgWbfUpRH}RJDjmOZmFaL+m#qfEdsgehD^{KRP`f(Up?0j# zf399?23q+b^3XV4rK%PyLouV|^AT1|*Q$-?w&DAh`Kem1A`Vo~=kpNhcu<7n4_w%D zx>#uhd-Hh$oOpVV!Xwh~x=?MD&QyaLF@3gJ-}|r#4V};H5ZF6(*RkQGt4OvDZ;+FS zRYX%TU22qS)qMV7rB-a_^ZNmqD^?EH>T~(LY|zX@YYrXW_&i?|(Z}Oh9e2#+LbEnR z;(zL4(NPERhs8a!I6B{ioQ=qi`uVY~aZgCKcqWUD*`fF(!=2k}k37)1$F}M3`1x9C z=HBOjsyP#Rc+b5Etpuy@UE6qlHqv9a{i4?R_}d>=r|A+BSLt+V`lGJe=H2&V^L;g} z!3&7ueZ|W3LInwIXgGUhP0B*C5x@(j^O5G=kg3$FX9WF;#cBsOyye45a^S-J@nB|Q z8j^gXu%;w^vCz@s>H0;C-`SN5>t*=C$#`UoLaF&ovs7v1^D{xSs9uoF0d4HrwQ~X4 zWV-UJ-TVOtdwbcr_wiM?L2;jyx!dbCxycepke zoT>+35Yv@n^^CJ~=k`aof0})T4>pT+%Fd^;-z?OFMq(s=YN0Yas&Ai;48}f2YxB*K z`=^VQ$|yFS5|UAKl=erm_DE`uGL+iQMh52=)SfkZ21y=?a%4jluC8N0#ojo2dcH{) bSw{xz!ReqLRHuVc+U6P~2})n1h=~6M*`EE% literal 0 HcmV?d00001 diff --git a/bvm/Shaders/pbft/parser.cpp b/bvm/Shaders/pbft/parser.cpp new file mode 100644 index 0000000000..266e64e6a2 --- /dev/null +++ b/bvm/Shaders/pbft/parser.cpp @@ -0,0 +1,390 @@ +// Parser module for PBFT_DPOS and PBFT_STAT. +#include "../common.h" +#include "../Sort.h" +#include "../Explorer/parser_module_abi.h" +#include "pbft_dpos.h" +#include "pbft_stat.h" + +static const ShaderID s_pSid[] = { PBFT_DPOS::s_SID, PBFT_STAT::s_SID }; + +static const char* KindFor(const ShaderID& sid) +{ + if (_POD_(sid) == PBFT_DPOS::s_SID) return "PBFT_DPOS"; + if (_POD_(sid) == PBFT_STAT::s_SID) return "PBFT_STAT"; + return "PBFT_?"; +} + +static void On_PBFT_Settings(const PBFT_DPOS::Settings& stg) +{ + DocAddAid("Stake-Aid", stg.m_aidStake); + Env::DocAddNum("Unbond lock", stg.m_hUnbondLock); + DocAddAmount("Min stake", stg.m_MinValidatorStake); +} + +static void On_PBFT_ValidatorAddr(const PBFT_DPOS::Address& addr) { DocAddMonoblob("Address", addr); } +static void On_PBFT_DelegatorAddr(const PubKey& addr) { DocAddMonoblob("Delegator", addr); } + +static void On_PBFT_Status(const char* szName, I_PBFT::State::Validator::Status status) +{ + const char* szStatus = nullptr; + switch (status) + { + case I_PBFT::State::Validator::Status::Active: szStatus = "Active"; break; + case I_PBFT::State::Validator::Status::Jailed: szStatus = "Jailed"; break; + case I_PBFT::State::Validator::Status::Suspended: szStatus = "Suspended"; break; + case I_PBFT::State::Validator::Status::Tombed: szStatus = "Tombed"; break; + case I_PBFT::State::Validator::Status::Slash: szStatus = "Slash"; break; + default: + Env::DocAddNum(szName, static_cast(status)); + return; + } + Env::DocAddText(szName, szStatus); +} + +static void On_PBFT_Commission(uint16_t commission_cpc, bool bIsTbl = false) +{ + DocAddFixedPoint(bIsTbl ? "" : "Commission", commission_cpc, 100, 2); +} + +// ---------- PBFT_DPOS ---------- + +static void OnMethod_DPOS(uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + switch (iMethod) + { + case PBFT_DPOS::Method::Create::s_iMethod: + Env::DocAddText("method", "Create"); + if (nArg >= sizeof(PBFT_DPOS::Method::Create)) + { + auto* p = (const PBFT_DPOS::Method::Create*) pArg; + Env::DocGroup gr("params"); + On_PBFT_Settings(p->m_Settings); + } + break; + case 1: Env::DocAddText("method", "Destroy"); break; + + case PBFT_DPOS::Method::ValidatorStatusUpdate::s_iMethod: + Env::DocAddText("method", "ValidatorStatusUpdate"); + if (nArg >= sizeof(PBFT_DPOS::Method::ValidatorStatusUpdate)) + { + auto* p = (const PBFT_DPOS::Method::ValidatorStatusUpdate*) pArg; + Env::DocGroup gr("params"); + On_PBFT_ValidatorAddr(p->m_Address); + On_PBFT_Status("Status", p->m_Status); + } + break; + + case PBFT_DPOS::Method::AddReward::s_iMethod: + Env::DocAddText("method", "AddReward"); + break; + + case PBFT_DPOS::Method::DelegatorUpdate::s_iMethod: + Env::DocAddText("method", "DelegatorUpdate"); + if (nArg >= sizeof(PBFT_DPOS::Method::DelegatorUpdate)) + { + auto* p = (const PBFT_DPOS::Method::DelegatorUpdate*) pArg; + Env::DocGroup gr("params"); + DocAddMonoblob("Delegator", p->m_Delegator); + if (p->m_RewardClaim || p->m_StakeBond) + { + DocAddMonoblob("Validator", p->m_Validator); + DocAddAmountSigned("Bond_change", p->m_StakeBond); + } + } + break; + + case PBFT_DPOS::Method::ValidatorRegister::s_iMethod: + Env::DocAddText("method", "ValidatorRegister"); + if (nArg >= sizeof(PBFT_DPOS::Method::ValidatorRegister)) + { + auto* p = (const PBFT_DPOS::Method::ValidatorRegister*) pArg; + Env::DocGroup gr("params"); + On_PBFT_ValidatorAddr(p->m_Validator); + On_PBFT_DelegatorAddr(p->m_Delegator); + DocAddAmountSigned("Stake", p->m_Stake, true); + On_PBFT_Commission(p->m_Commission_cpc); + } + break; + + case PBFT_DPOS::Method::ValidatorUpdate::s_iMethod: + Env::DocAddText("method", "ValidatorUpdate"); + if (nArg >= sizeof(PBFT_DPOS::Method::ValidatorUpdate)) + { + auto* p = (const PBFT_DPOS::Method::ValidatorUpdate*) pArg; + Env::DocGroup gr("params"); + On_PBFT_ValidatorAddr(p->m_Validator); + if (PBFT_DPOS::State::ValidatorPlus::s_CommissionTagTomb == p->m_Commission_cpc) + Env::DocAddText("Action", "Tomb"); + else + On_PBFT_Commission(p->m_Commission_cpc); + } + break; + } +} + +static void OnState_DPOS(const ContractID& cid) +{ + Env::Key_T k; + _POD_(k.m_Prefix.m_Cid) = cid; + k.m_KeyInContract = PBFT_DPOS::State::Tag::s_Global; + + PBFT_DPOS::State::Global g; + if (!Env::VarReader::Read_T(k, g)) + return; + + g.FlushRewardPending(); + + const Amount nProbeOnePercent = 100000000; + + PBFT_DPOS::State::Global g2; + _POD_(g2) = g; + g2.m_RewardPending = nProbeOnePercent * 100; + g2.FlushRewardPending(); + + struct ValidatorPlus + { + PBFT_DPOS::State::ValidatorPlus m_Validador; + PBFT_DPOS::Address m_Address; + + bool HasVotingPower() const { + return m_Validador.m_Status < I_PBFT::State::Validator::Status::Suspended; + } + + void operator = (const ValidatorPlus& x) { _POD_(*this) = x; } + + bool operator < (const ValidatorPlus& x) const { + if (m_Validador.m_Weight > x.m_Validador.m_Weight) return true; + if (m_Validador.m_Weight < x.m_Validador.m_Weight) return false; + if (m_Validador.m_Status < x.m_Validador.m_Status) return true; + if (m_Validador.m_Status > x.m_Validador.m_Status) return false; + return _POD_(m_Address).Cmp(x.m_Address) < 0; + } + }; + + Utils::Vector vVals; + Amount totalStake = 0; + uint64_t totalPower = 0; + + { + Env::Key_T vk0, vk1; + _POD_(vk0.m_Prefix.m_Cid) = cid; + _POD_(vk1.m_Prefix.m_Cid) = cid; + _POD_(vk0.m_KeyInContract.m_Address).SetZero(); + _POD_(vk1.m_KeyInContract.m_Address).SetObject(0xff); + + for (Env::VarReader r(vk0, vk1); ; ) + { + auto& x = vVals.emplace_back(); + if (!r.MoveNext_T(vk0, x.m_Validador)) + { + vVals.m_Count--; + break; + } + _POD_(x.m_Address) = vk0.m_KeyInContract.m_Address; + totalStake += x.m_Validador.m_Weight; + if (x.HasVotingPower()) + totalPower += x.m_Validador.m_Weight; + } + } + + { + Env::DocGroup gr("Settings"); + On_PBFT_Settings(g.m_Settings); + } + + DocAddAmount("Total stake", totalStake); + + vVals.Prepare(vVals.m_Count * 2); + auto* pVals = MergeSort::Do(vVals.m_p, vVals.m_p + vVals.m_Count, vVals.m_Count); + + { + Env::DocGroup gr2("Validators/Delegators"); + + DocSetType("table"); + Env::DocArray gr3("value"); + + { + Env::DocArray gr4(""); + DocAddTableHeader("Validator"); + DocAddTableHeader("Delegator"); + DocAddTableHeader("Status"); + DocAddTableHeader("Commission"); + DocAddTableHeader("Voting Power %"); + DocAddTableHeader("Stake"); + DocAddTableHeader("Reward Pending"); + DocAddTableHeader("Reward %"); + } + + Env::Key_T dk0, dk1; + _POD_(dk0.m_Prefix.m_Cid) = cid; + _POD_(dk1.m_Prefix.m_Cid) = cid; + + for (uint32_t iV = 0; iV < vVals.m_Count; iV++) + { + auto& x = pVals[iV]; + auto& vp = x.m_Validador; + + PBFT_DPOS::State::ValidatorPlus vp2; + _POD_(vp2) = vp; + vp2.FlushRewardPending(g2); + vp.FlushRewardPending(g); + + _POD_(dk0.m_KeyInContract.m_Validator) = x.m_Address; + _POD_(dk0.m_KeyInContract.m_Delegator) = vp.m_Self.m_Delegator; + + auto weight = x.HasVotingPower() ? vp.m_Weight : 0; + + PBFT_DPOS::State::Delegator dp, dp2; + Amount dpStake = 0; + + bool bFoundSelf = Env::VarReader::Read_T(dk0, dp); + if (bFoundSelf) + { + _POD_(dp2) = dp; + dp2.Pop(vp2, g2); + dp2.m_RewardRemaining += vp2.m_Self.m_Commission; + + dpStake = dp.Pop(vp, g); + dp.m_RewardRemaining += vp.m_Self.m_Commission; + } + else + { + _POD_(dp).SetZero(); + _POD_(dp2).SetZero(); + } + + { + Env::DocArray gr4(""); + DocAddMonoblob("", x.m_Address); + DocAddMonoblob("", vp.m_Self.m_Delegator); + On_PBFT_Status("", vp.m_Status); + On_PBFT_Commission(vp.m_Commission_cpc, true); + DocAddFixedPoint("", weight * 100, totalPower, 4); + DocAddAmount("", dpStake); + DocAddAmount("", dp.m_RewardRemaining); + DocAddFixedPoint("", dp2.m_RewardRemaining - dp.m_RewardRemaining, nProbeOnePercent, 4); + } + + _POD_(dk1.m_KeyInContract.m_Validator) = x.m_Address; + _POD_(dk0.m_KeyInContract.m_Delegator).SetZero(); + _POD_(dk1.m_KeyInContract.m_Delegator).SetObject(0xff); + + for (Env::VarReader r2(dk0, dk1); ; ) + { + if (!r2.MoveNext_T(dk0, dp)) + break; + if (_POD_(vp.m_Self.m_Delegator) == dk0.m_KeyInContract.m_Delegator) + continue; + + _POD_(dp2) = dp; + dp2.Pop(vp2, g2); + dpStake = dp.Pop(vp, g); + + Env::DocArray gr4(""); + Env::DocAddText("", ""); + DocAddMonoblob("", dk0.m_KeyInContract.m_Delegator); + Env::DocAddText("", ""); + Env::DocAddText("", ""); + Env::DocAddText("", ""); + DocAddAmount("", dpStake); + DocAddAmount("", dp.m_RewardRemaining); + DocAddFixedPoint("", dp2.m_RewardRemaining - dp.m_RewardRemaining, nProbeOnePercent, 4); + } + } + } +} + +// ---------- PBFT_STAT ---------- + +static void OnMethod_STAT(uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + switch (iMethod) + { + case 0: Env::DocAddText("method", "Create"); break; + case 1: Env::DocAddText("method", "Destroy"); break; + + case I_PBFT::Method::ValidatorStatusUpdate::s_iMethod: + Env::DocAddText("method", "ValidatorStatusUpdate"); + if (nArg >= sizeof(I_PBFT::Method::ValidatorStatusUpdate)) + { + auto* p = (const I_PBFT::Method::ValidatorStatusUpdate*) pArg; + Env::DocGroup gr("params"); + On_PBFT_ValidatorAddr(p->m_Address); + On_PBFT_Status("Status", p->m_Status); + } + break; + + case PBFT_DPOS::Method::AddReward::s_iMethod: + Env::DocAddText("method", "AddReward"); + break; + } +} + +static void OnState_STAT(const ContractID& cid) +{ + Env::DocGroup gr2("Validators"); + + DocSetType("table"); + Env::DocArray gr3("value"); + + { + Env::DocArray gr4(""); + DocAddTableHeader("Validator"); + DocAddTableHeader("Status"); + DocAddTableHeader("Weight"); + } + + Env::Key_T vk0, vk1; + _POD_(vk0.m_Prefix.m_Cid) = cid; + _POD_(vk1.m_Prefix.m_Cid) = cid; + _POD_(vk0.m_KeyInContract.m_Address).SetZero(); + _POD_(vk1.m_KeyInContract.m_Address).SetObject(0xff); + + for (Env::VarReader r(vk0, vk1); ; ) + { + I_PBFT::State::Validator vp; + if (!r.MoveNext_T(vk0, vp)) + break; + + Env::DocArray gr4(""); + DocAddMonoblob("", vk0.m_KeyInContract.m_Address); + On_PBFT_Status("", vp.m_Status); + DocAddAmount("", vp.m_Weight); + } +} + +// ---------- ABI ---------- + +BEAM_EXPORT uint32_t Method_3(ShaderID* out_buf, uint32_t out_cap) +{ + return ParserModule_FillSids(out_buf, out_cap, s_pSid, _countof(s_pSid)); +} + +BEAM_EXPORT void Method_0(const ShaderID& sid, const ContractID&, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); + Env::DocAddText("kind", KindFor(sid)); + if (_POD_(sid) == PBFT_DPOS::s_SID) + OnMethod_DPOS(iMethod, pArg, nArg); + else + OnMethod_STAT(iMethod, pArg, nArg); +} + +BEAM_EXPORT void Method_1(const ShaderID& sid, const ContractID&) +{ + Env::DocGroup gr(""); + Env::DocAddText("kind", KindFor(sid)); +} + +BEAM_EXPORT void Method_2(const ShaderID& sid, const ContractID& cid) +{ + Env::DocGroup gr(""); + Env::DocAddText("kind", KindFor(sid)); + { + Env::DocGroup grSt("State"); + if (_POD_(sid) == PBFT_DPOS::s_SID) + OnState_DPOS(cid); + else + OnState_STAT(cid); + } +} diff --git a/bvm/Shaders/pbft/parser.wasm b/bvm/Shaders/pbft/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..e4a7929d1622fc806eb88e48d84c6cfdcafcb31b GIT binary patch literal 21895 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 QF$ZhxNHH!R!dpcD8!z8|j{pDw literal 0 HcmV?d00001 diff --git a/bvm/Shaders/perpetual/app.wasm b/bvm/Shaders/perpetual/app.wasm old mode 100644 new mode 100755 index fdf2d41b9b4eedcad06d5044fffd6a7883bd73d9..d00debace71de9fba74f8effb416fa72d01a01b5 GIT binary patch literal 3714 zcma)9U2Ggz6+ZWlyfAK8;O@b}{QDPUH<%73FT6rU=qRZTWdyk7uv#{hJwP zW*u9K>TR=04Y-Yq3PnPKz5t?CABu#Uhdv}oZGjge!4m>Oc>o?F3KXf4h=6nMo!y;X zs{&ivd+xdC?|$dpd(VI!HW&b~<*^mE11o$7e*jieJL-?^tQbfT|0!4*A|A5F)SCJM zwT?VgWIOyFe#nsSW@g!QM7ew}@R~jVamF;~Nx2mPBgO^;om9cmjrrGpbCTb(;-H(R@tJRS4SGfe zz>ehSWZ=p=jF437ylgoBHl%5iUY0>+Q(mlTALR6$jMSdgdg_TNa2h_0D*Jj>g``)} zR45~DiV#9wjPLk@mhW*e;!$HH#W5?44-GS)F*a;4;Hfm*VWQO<%8V=wr5du~1=}2^ zN~JKeom$EFDsChL1JdVZwBeOYN8wP1JO7Cv|C`d@DIeDR*$}$pnvsr zkAH_~@ja#Ww9@*H;@nX3ieo;b_^qCWnDgr%N4!61N6W;LdkM+w3GWBA#2-jfTvhTq zo;Q`{Bmo-}!__W1rP#*+ZJXrR-m!eOXMr4OKByo#Do5oWK&S;qX&f zTS)9Oewv@QAj@NMYGCSzWWqupm!y^E<#U$$>j4lOQb%xfemeyrvcVwZJ8vvRO#KC5J2=`c=d zh6ZmO-92k?zQdl1v1=u;`$Zpih>nk&LewmaSzvxEj`9{Dpt$fC91#+v-bK;NIHni* zmVy&;K~?13gQ|rviMyDGgE(GB%^1clk&Z!38Y6%|)DS_Z^Wo1@b}+=RQiwe~TRl7} znw+sQYZOmjvy5Wv-^P_<_F9|B*1eG{#c9QDweC(`DWRO>Q-i78{_EQ3oQwl4ldX1b1!paPY4f{U2r zaq(vvd1f)@76n0ZzDvX;jpi=JLPf;I?M@~#SCgBDflXgPQQSN2`3M%yz<&DXOo=H$ zF@poToY5X<(PtVt>8kl6MPS8sfvnpQAF#|1Q^`Yc6VZqG0!du61Ta4>enXcMMuXbI zG@m1z6Cn2JfGIRlEDoth!d_N|S7WlVg@??R( zjHg|Ymo{E|4-u{YzuRiJkTSnUmd6b`bUJMPZp2}Ww+RsQn}b67DN#aLFygfs6OLx| z(-Qj|*eHe2zfbG%c7yy=Ayy_AjJ`deU$K%dw+D_##L7+#@S0FGhNn7vTFk9maG4UW-Yy06#%e zV98&`0W-dZ3cO(WWMq-oNgb^%@(nc#jsxNM862@B1S#WfEwBe6bh@cz8SxLwEuLca zAZPR=fzmg-=QZ;lXCSC|`4iu)$V(s^Uek@Bv0btqN0E=p%KAnGP9U)fvo6ZOmr>KM zTaM>Of$c=l#Qx^^LMeh+BZSUU2xPP5t*yx*1Y4OdO1lw4;MHXaG6=i?8n$b%%K*-h zhl;yyDS17W7f2V}^LDUaaZA|6p~s5nLdD&*>y@%4^i=>*( zQGCAk)|cP#-}&>afB)mpPyX(&A7t;`|MEYdYYn~f`n}u>@LOZZwHp#f)3)!=U!qR` zN5;n?*_^XPU(WkmawC>gUG`9aBR<>}Rja8)`#ln?sm?pyYr01h{r1>EtDT9v?D1}c zJ(1|GC*!tyD&|o~ZIT8y(;w+|&Bqt+>rECN{JFZD0}$R76zG{?l$Zr_pt-5{pc8jk@>(Y+mQ`NMt!83 z4puxHN79jDD9icPZ8rI+*O04$ykt3b+g(pBEX*I9KLIbYsR*lEMx`~Z|7IY=^jv1O zS+C{wr^MV;Vv_g#Xzl^WuGjMww_FLN6Xo$UEU0_#`rKHfS&u4sE}C*~s?m(>)w;~D tV_p!;xkIk1U*E?QmS6KD`YM^53M3vc={hnWZTm8uONW(pH;*56{{@rpJG1}* literal 3421 zcmai0U1(fI6h1RI*=(|nUVo~wFWy8gyW&rpO11{kPMTOn)0VdWyd}50(_}Zh_pbNu z#srGHwK0vY|J2$CmHHrB#fMTv5QVlN#Rs82Ct!4IW2;t@9y1nz=%>wVk}!pRALPHrJj zD-vq7;O~Nth})J*arhqSYzeMIso>oz)VNnELQI8GbF~DW>#EJtlYv{7kI2B21?VEH z*n})*N(&IDNqkHOxjDIQR_CRfHp{ZAN$F!d%0Z@Bf^HRGYt=Hf7DI)ytV0n)=!5PMoK=~)aG)d6S-ho?y~^u-g`8+2_OlBAOd%?=K~6Oh z@s;w5#L+g!^6QA@_YwIrFY%L#^M|t0>-pz0WdHND=7>!+S5!{?jf_@rQEL`Q+3Wzj zRm(>xg1wLGa+o*^dC{Nm=hjA?zzCH1MkStxVg4pV>=X(|m;*^}%n^H&Oa4WzU%6Ymwr=J%9-t#baqDtO3h*94yg3Y$BZkWCRsI z;RuG1^Ju(>svhR^R2n+s>>}hH;^i--v6Y5B;(VQjc@bB9I4ot&3|ONZmK{~>j&j2eA?88}H&o11&Z;_PoWwQS3YEt!)e6dS8B~kv@B6P#@;^Jc3nrUHL z^%yek7^YXKe6@@g79o+~8&y#QxQl>HAlo%)Qd?_K`!l|v^{zUL#BxnJ=0FygnI0V+ zkUIg$f&B`FT7!s927DuBq9j~AuiD754;l;Og+6rzyC>hzaF-o^Wu>^pu((DF>}0fM zQ54f*@0JEsPG$;oC_Sz4JPDW(-?N(P1}@GvYJDzJ>k72h`XoAH$%8m-z#hO=G!|{Q z&6zS&hN2$_oBCX39Kf7$MB;h-5UrrjJVGmwH{JYAjN@5Y@8*+8I%rLFtBF^!q_!8- zOKsaPQp8>muhFX`4yw*q#|rX^#%~+rlSo6m@w;utSRWk}`XGHt$0cF~IqM^}feLl3 zqRz=9DKC?;a2}+tB7}(2+m%3oC>QF`#mNQ8+pm)O8l1di(bXQAk^T z`Wu7xeR=ye!!;>vp*}UJuv-;zp}sh%z#gr85TW&)FHjUsd3=DS;T^+&UmA`X(N4p0 z6a~HqdvL%_pGOClwn`Lam>0+$D;VZ8Y7`s?BJW-tu`2{Q)7#3#pKW`0MG6i0Ws}#0 z{#;;~la04K@f&BDCZ70_L*N%=2u0U(r)2<{K;qR1{J_l=By94%GD_u#$H1F#gXx?% ziT9pL&MU7Unk>UyPCl(3lm71AG6*4)%R+Hs(#>T2idTkBD%e)ifmV8Znexym=q)?rC0yd)jWn33CBn)wuiiMy|bA znH%rb2BV}ldEh96K-Kv1`VT;5puoU z^!C(^cW=d})!jWw4QqP!a@)0cIJn4EU-Ndow!0Mg*-8dmo2^1IBg0T;@7%S(Ix_{= Mn~tp;ybJ&T0bRoFr~m)} diff --git a/bvm/Shaders/perpetual/contract.wasm b/bvm/Shaders/perpetual/contract.wasm old mode 100644 new mode 100755 index 315c439852f85183ecab329208604515a1cdb9de..1a76d6b6c70d28c7554a6466a7e549b291781668 GIT binary patch delta 502 zcmZWmL5tHs6rP!M)3h<0vVseOFfEF9v#IW)bU_czMHKNSdeSmUUqiZ+nJ}5`+KUY= zd*3Dd3qce#65n@z5DTxIPo(*b zpY697(KqzhWax7b8K+T^DSGFdR+mgD9-^bBMV>YjvKJ3JZ#-l~n|9tB|JHiYrOtZb zzVt9{t!aDx%BWrHzV@)&Gb3t5(GU&$Y%cYo-F?wLY8lxivMn4#%M-)Z<&HCm$ zxwBj2mS8!cZ7-2RE0*ZdDJ%2l7kRg8@8JKUqlcYB$yt?vD)9|N6DUiVh4B(^zmPe^ z3QlRlnMm!!!_mR$F}lLOW-0|eodeUAg3<}xxZ=m*pYsO(KSd}D9o$M7=VA6<%rXUu z4&@0bE=3x2^NQ>2gz*XjKd&^4IfN;fG2>-$Q)~hhMJCd4Ug+yr1-^ngC=dyRdRagj LIAxZK5I*YPeR+(v delta 292 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 literal 2821 zcmZ`*&2Jk;6n``OVJ926%SWMv1LJ_I1eMSa2vr0$lhCH9YC%eAxuqL>NbK5Pv%8M) zr3oa2w3Kfsg};CU;(`Q~+C%A$L#5sjxAulOAjAPx0yVrhv$i*-wdI|e_kQo=H}l5( zAc*S>0NAm@NxrlMC#@xVGW@wX!w*|R#c89!IRN2s(r?uCBs{6`XVbbf0{@F|vs7cT z|D~`b%jIM0tpp$=n5>0!z)0X3gp8t~4V)x}<3SY99tjuKQ8KeKsOczdH4Q4YJKCy` zJp(pj+#{-9YPP}APSEXCEsT{haY@#%9cyVCsRJ_6HHiF9s|5Y--2*u?+cK>hDhd*H zSVaw0gS_@-V48;xNYP`JnCSh7RM4E2wOUw$K7#jY!NEu=6WKo$#0yiALa#Fm!JcQw zpx?kyd?KnO%52U6!7!WSL9LaF@+9gx>eHMKG+K4=teori!2ok@hcy{vj>Ukxc|0Py zeAf1I!gA}X9!6~r`6DV>2+Om(U|VOp8wUHo^W5(pZZEOZk1yi~}g32Oq^H__-aDe`0dB96o40+*LrRd5_HvZ@4sg}fXnX#Hh|M$-iZ4Wot3 z>#2YdYhlQq+_xs|$>Ft0#N+462CS^2V0$XKv3~_ud9(WSv6WR)=GO^*Yb&X?)BN9@ zHX6qHZHuJ))>l_opR*R^51Q^O!a@G1w}W-J;*!}OOv8Vd0GRtNs0sqC(Rxr=l2wbA z{~oOd!1FlrN4i7&0FvQ8+Ao9WpP>O&7BQqP1$ouD_RnfR#*B{XXOhcn^h}S5dlGFn zegDxQ@ZTrnG%0=Bgz_)wpq)VHF*sttcfA5b7U*UL7gaaMTf%w zK zy$LBXl=uYDmxk$slV`A0GsnzRE3`=uo=aW*c!{v2jmtZfa)TV0y+cG1?+Rv_mGTKw zEIKAjiv?+R+~EX$eop-87IJyLyNSQzKSqbEe`?4!RQ-?jo;mUly|H=!6Iu&LQ_*wU zcwrS?3~k9}Mg@>cP@2QrYfBHASA~n(XdD1dvBH_i$&C#-T+HJnw>ab$b0S~Bdhg*0 z>!eFG>4xTbM4dFKm_DVHFuX$>?f9S3lHB;6`nblJo1tcHqGrn*n%WlQ6O(rY*K~N7 zj+UU5=vYL@$a92tb4tWbRjRyEQDulL;Ul#u>Gzmu)`IptzMvar(MbcMR)a!_N-To< zTxGr$w&GFoYE1<(CZ(E~R2#@pR2mrvfQh9{Mhz2~Tdb$kQB0XulsbHF+l`>E*g5-A z$TS-)ozwf7XIl(wb9Z5byd25=+Cwe-W^@T040QP za!RO>_6l1vZNk=Ghv5IOIk>NnUi!K(xPMbi@Ibd4c(B(9bl>Q^9@_a@QmMt`@Ot55Lk3-fXGo_wH%ExMSqukrP4fl!~U(oku(BE3zOu*f@D| zWc$or98XosS?rFTBIDjzqHHn5axiXoidG}8%r_L)McNsTMTm-QBxJ@%tZqDiWLk diff --git a/bvm/Shaders/playground/contract.wasm b/bvm/Shaders/playground/contract.wasm old mode 100644 new mode 100755 index 1d68333f715362beb125250d3c1d0e3fcb31eeac..af2b2dc602780aa762c867ad5ef746391e99bf2b GIT binary patch literal 371 zcmZXQOHRW;5JbCeCou_N2_)FEA59Pu9DvV)4QDXpamQGhk2TXy$SOGm2PPkckdR91 zs>M^O8dS6h064&R+(4S8yD&%*aG2u;AGh0VGI|&cEmv8y0e;Mq*_*MJb(3;sz9q7ZIo+*_X;X6cs{jCYL~+um@yRHi3U*q&8oNH)e-%0zML4x75Jb&Z^Ny#I_S V0?jFq(8zZfyVn delta 73 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 LG=(oKu>ksitPf1m literal 19055 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

gEC~a)+s#IT6 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 G2mb@zrOFrp literal 5663 zcmd5=O>A6O6~6br-}$p&z=ffy#C@-*vLzRlwz$HrjNhaU=})MeG^KRY4E7`S^LWM` zkD~_JGl8UuflyVV0ydN`kh*F1VMP|*B6Wk*Wj8EfkGkjrzVF`mX2xlX5G%&=-1pAC z=iGC?^LOWp_U^V6LdX|p&U+(%_l`?hJ(DWA#+l-g!0c zbb9N;F@y`*;MG&v=7rY=!X=@8ZfB!C$j-jj-pKmGBdKDTPWH3R%4?A4M7z_;`X@Fw z?3#e@C!vf_4*ztvy}rF8g7M4FCHqo2x!2v;eXh5@CBkxYHyhZ=nwdP;g?5~-RV6-^ zs;t!;t|xc!;yF?%KLmp5x;;JlEblb z;t}zs^6^n|PxZ6=tAF&QJG%ceJ|g`j+)Cs(%(Gfmt6DrLL^{e7mC9!u!jROA5>nK( zOh0uWmmh~%CDV_?JXNXSU-VN-0!ILj=n7xB*sRbhx@u+}jn#JLy=pajlSJ(-2=U72 zcnYalaar7}oixnB`$isJvpmstj;X*FVICbCqD;k-_)`dyS{AoBQauc}FnXzse$Hie zRXf6#O1r`eF=k;e%cP@UkmaedcGj@EG&rco<*hIkv0JR>R@mtS&(K%cK`+2wcey{Q*hfEIYG5d_A_m4Q zaVJmfx!E+0qhDH9P8Y08DuQjJoFZgx5*u{OG-h^Fiv1+aZ8X-dAnwa3)l)%A(P1HT zD%?JWPnrB6Lu`5T&xzQ|RARXjsv%93;p;~|oy9>I-jebp_rrvLuccT;qPKjdxywgmZ z9l$)T;Cszd!+$!;8>wND&e2xll-aD+S_63!yZHAQI@Y5%nu*Uy6ls*l0q31n9i;m? z)srV13NKB}XkRlt6SoLPKfNpwirPoi`>}^iu>PbSH=41>iCRmx#kjXKzZ`rm!FAt5%nd6;0^ z{Y16oVT(a!KBKFcQ@ZkE5*$bJf(NLf#%MsdmH3uB)IPY40e9sNUrc;*gNNL(--qU* z$uX^n9ktW}aH^p`M5WvR;ka@rN6t`otzbC-QJm@LNr=#bB4K)4 zAa1mb9oiJ8tEh8`?AtzijxyD4Q z#4cC6y0T@Q;Ar_G$Znd_X1pC}8T}R^Bkl;FSdkA4>@1?dH8`2rUlL3tMnLVez*9(Z zcSMhueS7haN(8KdFaK}N-K`3JxX9^c@%9|Xx3NU_Q3A@Mt%dDKrbyWN#H=feS)yoa zAs&$ImCxYhRqWFEc$CP!4_D-lBY7i6zB)pg>8&1tlI+P@h}gnnT0`69r=8vINQWqs5#} z8wM1WD5M}m#{-24BmftDw8-2xs>B|WKAoc?ij|iI7cdVm4&) zH&hmX^eDp45@eMSX> z21z0~t0Nr&!H5VNDiMqzfw)FQ&`^nBNyQuyESBhq2pTCs&@2Xm+z1HHJcTMZQ=r!% zY%@@G3+DMy@mlQHbOWv0UrUZ1k7uYo9DfXEnpnqF9?yW{7wBQn>JTPDz1naen&Huy z=<^+$TaY2VifPX5^ThB&2&57a#(+k@zXrCiAGYL`tH2A;VW!p^AxRyi@=Pk8L9VM+ zR28ZVPX1ze)ARuAF$78+8d*fz^5Iy(nAPD+$L%SBzO-jU`qG{kA-{$?=ObPaEk_)S zBtR{~%zomqBRJZBr6DK3(?DVO)OA+VIx-D`_B`ONFu@sUs3k~66EiF?wLdsMeqkfQ z?8&O=wD|3z?2%e4=;YuRjTS4a$$`=0yq~yB>OQ>Mv)773he@R%93&7hXJuZ;KGskBxzKLF8ed{P^5vDae(%SdgSB3-v%Jjj)9p9bI(xgz%eelV-|Oyf zUg%~Udb2xN)Z@2KuX{oBYhmu}7xL4}bi23L9sI!D4Q5l~#scmt^qx}bN567nTKu`) ztPk~;m(Sq7?qW7SJvXKL15-kw_rh17Ilb2zY_9dQ_08SQUUzxVU_m@k+3EK-_SUohuB_v6J=@*QHXi)ZCF!kq+T9EOw;uW?{{9V^^|XTk diff --git a/bvm/Shaders/roulette/app.wasm b/bvm/Shaders/roulette/app.wasm old mode 100644 new mode 100755 index 57b4da1a9889b1d6d9512489c46275d9ebb2a745..e904b4d67c3a96b04e736ee1bc59da3efba2e123 GIT binary patch literal 7044 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 G-~R(YpDe=w diff --git a/bvm/Shaders/vault_anon/contract.wasm b/bvm/Shaders/vault_anon/contract.wasm old mode 100644 new mode 100755 index 9a4ae79f9cb9096661dbbc063cfe00ea69379ba3..43287e5f773bc6ddc4b0fd9debf2ca7764a924c9 GIT binary patch delta 515 zcmZXR-)q!B5XWb-NiH^R6BLR+UiJ=^)|e|6!G|JT?m>JI#a9uIy|@>0-E6{U)7l5Q zC@4ONRMP*zcR|oU$Une;KoH!fAc8RLFvEO5-(mLK;HP(TdfOog=z6%qq-||~Fmc_2 z7o|G3AehZ+&C-KeRpwH2MLvDMx%S1jE$~gW-7kEykI984g=Bq6NpfQuzHZwVu2PHQ zw)Nh;iI+h5=Bzm+6e;cyn1UJg9$XuBD|}A2A?|+QW&5*b+1+n^Hq)$ delta 320 zcmaFMv4wrY6h#(R#sWr0MpkA<1|~KR#(GA_h7J~Pc0E?M+|=CsqDrQT2h_NZvam2Q za0Aigi68tqnH(9j6c`+NvL^d5=?k;)FmgLFD6%LpIx(0tGjJ;~Don0ojFETL&C+0C zP+-txU=V0&XlP(iV04_ol%)b>HZX86$1unj-5@3h1s0%oW(FnJC|(8uus$$fkyU{a zD6Gf=vWrE5wN{A*Xt4sL22%%= sizeof(VaultAnon::Method::Deposit)) + { + auto* p = (const VaultAnon::Method::Deposit*) pArg; + Env::DocAddText("method", "Deposit"); + Env::DocGroup gr("params"); + DocAddPk("User", p->m_Key.m_pkOwner); + } + break; + + case VaultAnon::Method::Withdraw::s_iMethod: + Env::DocAddText("method", "Withdraw"); + break; + } +} + +BEAM_EXPORT void Method_0(const ShaderID&, const ContractID&, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); OnKind(); + OnMethod_Inner(iMethod, pArg, nArg); +} + +PARSER_MODULE_EXPORT_SIDS(s_pSid) +PARSER_MODULE_EXPORT_KIND_ONLY(OnKind) diff --git a/bvm/Shaders/vault_anon/parser.wasm b/bvm/Shaders/vault_anon/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..57e41f78187a78b5784d5c9cefdb8bd5b8ea2221 GIT binary patch literal 1105 zcma)5&ubGw6n-?JbSS>FW$U(=zk!BC;b-$XEsep6~tM1`^`7+&6|1e8=y&m003RhZ=)2p zaVm|LDhmUE(rrV|6(bi>iZ>07g$L$J4Hmd@4|L7YjT}O{fntP^p&`Jz0!k6-_jNPBmdgb!h_+Y8EEq#L54j<1Kz<14piumY^;4N3C8z!4K2-a10Qsyid6zK{Gv-9$ znt>OGpM@uN4G`8%d7^BsgiT8)jrB4npR)L8WAQIDJlOrs82*@fei`$8udt<&(jKW* zAF1Tk$A8+2NuDUTnqdxdSw=NGr#bL7*X51yq6Ih0V4=(qSgm35HH$);T(S_cs>f>Q zX$ALc$O82P3zKy3GA@H@5@cS1e^=%#;eWcBPZ5Hwg?+Tb62YS$YSq%$E@m{QV|<2{gthbP z)z5@GQrzrFaPuR*H3}o;<)_eJ%AF`8$k%z)rh>xEL@ZI)WjsM830;;XtnIXVXmTwI zSc|hm%k^p4$<58x8}$Wvjw*uk4in8CS)wjyNx?Q-U4P#hycD}KHgTd@*cV;u`;M%h z$C)df=zwuQ3OjZ&kTv(RdfSztD`?ASPDkFE`iXr(_CjzP$6nZRc4DC(on7H_XyoLPtLR-!1=3<^TWy literal 0 HcmV?d00001 diff --git a/bvm/Shaders/voting/app.wasm b/bvm/Shaders/voting/app.wasm old mode 100644 new mode 100755 index edb90b1a106ee22e8aa51422d1f41644753af00e..7ee7bd373ca044522c9b0749e4679d5934fb534f GIT binary patch literal 8498 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 literal 8101 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 C%I!4( diff --git a/bvm/Shaders/voting/contract.wasm b/bvm/Shaders/voting/contract.wasm old mode 100644 new mode 100755 index 487ce60e2a631ca82003d94f91f17d5641982287..24ec9bfae8002624839ff46679db98c688bb53cb GIT binary patch delta 472 zcmZXR!E4k&7{%wyr0KfJHcK0-cyU-LxTaZaQF`&v+=O2AB8bQ`$$lHMolN3n(z+mR z6ugLnGM@bh#G?mKUcGt~Fa81k1)l1zdJu%~@P6;`;Jxo{_lNuH-j`b)&HEgl^J^!|2a|q5ls=Wu?Q-lnW8%59B0QnChrJLM2L> zh25eNIzQr~!O$-n%@cu9Cd!11I^2-I3shAuvuIlB0f2{jN1SJ delta 296 zcmaFOJ&$X`PDK`0#sWr0MpkA<1|~KR#(GA_h7J~Pb{BTG+|=CsqDrQTPi=Tlv9U2R za0AhLMkc1o4;e)#J2MI;I%;HTGB7AHhw(BfFbgyQ0YeCo$)Let;#i;M*udz?%g8Oz z2omR3V07fjQebiv5oiMOrNDegkt|23dgc-(CV^(K6qADjgQEgS!Q?HBs*H~&-(u_) z2P#!!QDD(z2HK~xS20KPC^4BcOE5VA z4PpwI{E*pTvI0;-k|mgZA|p#)Vs7f>W|kfe1~txtqWqN7 whitelist; uint32_t logCleanupPeriod; - ByteBuffer m_RichParser; - bool m_RichParserChanged = false; + std::string m_RichParserFolder; + bool m_RichParserFolderDryRun = false; bool m_LogTrafic = false; bool m_PeersPersistent; }; +using StagedParserModules = std::vector>; + static bool parse_cmdline(int argc, char* argv[], Options& o, Rules&); static void setup_node(Node& node, const Options& o); +static bool load_parser_modules(const Options& o, StagedParserModules& staged); +static bool apply_parser_modules(Node& node, const StagedParserModules& staged, bool dryRun); thread_local const beam::Rules* beam::Rules::s_pInstance = nullptr; @@ -56,6 +60,10 @@ int main(int argc, char* argv[]) { return 1; } + StagedParserModules stagedModules; + if (!load_parser_modules(options, stagedModules)) + return 1; + r.UpdateChecksum(); const auto path = boost::filesystem::system_complete(LOG_FILES_DIR); @@ -76,6 +84,8 @@ int main(int argc, char* argv[]) { setup_node(node, options); explorer::IAdapter::Ptr adapter = explorer::create_adapter(node); node.Initialize(); + if (!apply_parser_modules(node, stagedModules, options.m_RichParserFolderDryRun)) + return 1; adapter->Initialize(); explorer::Server server(*adapter, *reactor, options.explorerListenTo, options.accessControlFile, options.whitelist); BEAM_LOG_INFO() << "Node listens to " << options.nodeListenTo << ", explorer listens to " << options.explorerListenTo; @@ -110,7 +120,8 @@ bool parse_cmdline(int argc, char* argv[], Options& o, Rules& r) { (cli::IP_WHITELIST, po::value()->default_value(""), "IP whitelist") (cli::LOG_CLEANUP_DAYS, po::value()->default_value(5), "old logfiles cleanup period(days)") (cli::CONFIG_FILE_PATH, po::value()->default_value("explorer-node.cfg"), "path to the config file") - (cli::CONTRACT_RICH_PARSER, po::value(), "Optional shader to parse contract invocation info") + (cli::CONTRACT_RICH_PARSER_FOLDER, po::value(), "Optional folder of per-contract parser modules (*.wasm)") + (cli::CONTRACT_RICH_PARSER_FOLDER_DRYRUN, po::bool_switch(&o.m_RichParserFolderDryRun)->default_value(false), "Scan parser folder, print SID->module map and exit") (cli::LOG_LEVEL, po::value(), "set log level [error|warning|info(default)|debug|verbose]") (cli::NODE_PEERS_PERSISTENT, po::value()->default_value(false), "Keep persistent connection to the specified peers, regardless to ratings") (g_szTraficLog, po::value()->default_value(false), "Log trafic") @@ -177,25 +188,9 @@ bool parse_cmdline(int argc, char* argv[], Options& o, Rules& r) { } } - auto& vArg = vm[cli::CONTRACT_RICH_PARSER]; - if (!vArg.empty()) - { - o.m_RichParserChanged = true; - - auto sPath = vArg.as(); - if (!sPath.empty()) - { - std::FStream fs; - fs.Open(sPath.c_str(), true, true); - - o.m_RichParser.resize(static_cast(fs.get_Remaining())); - if (!o.m_RichParser.empty()) - fs.read(&o.m_RichParser.front(), o.m_RichParser.size()); - - bvm2::Processor::Compile(o.m_RichParser, o.m_RichParser, bvm2::Processor::Kind::Manager); - } - - } + auto& vFolder = vm[cli::CONTRACT_RICH_PARSER_FOLDER]; + if (!vFolder.empty()) + o.m_RichParserFolder = vFolder.as(); o.m_LogTrafic = vm[g_szTraficLog].as(); @@ -238,6 +233,116 @@ bool parse_cmdline(int argc, char* argv[], Options& o, Rules& r) { return false; } +// Step 1 of folder load (runs at CLI-parse time): read+compile every *.wasm +// in the folder. SID discovery is deferred to apply_parser_modules() because +// querying Method_3 needs a NodeProcessor instance. +bool load_parser_modules(const Options& o, StagedParserModules& staged) +{ + if (o.m_RichParserFolder.empty()) + return true; + + namespace fs = boost::filesystem; + fs::path dir(o.m_RichParserFolder); + if (!fs::is_directory(dir)) + { + BEAM_LOG_ERROR() << "Parser folder not a directory: " << o.m_RichParserFolder; + return false; + } + + std::vector wasms; + for (const auto& entry : fs::directory_iterator(dir)) + { + if (!fs::is_regular_file(entry.status())) + continue; + if (entry.path().extension() != ".wasm") + continue; + wasms.push_back(entry.path()); + } + std::sort(wasms.begin(), wasms.end()); // deterministic for stable error output + + for (const auto& p : wasms) + { + std::FStream fs1; + fs1.Open(p.string().c_str(), true, true); + + ByteBuffer raw; + raw.resize(static_cast(fs1.get_Remaining())); + if (!raw.empty()) + fs1.read(&raw.front(), raw.size()); + + ByteBuffer compiled; + try + { + bvm2::Processor::Compile(compiled, raw, bvm2::Processor::Kind::Manager); + } + catch (const std::exception& e) + { + BEAM_LOG_ERROR() << "Failed to compile parser module " << p.filename().string() << ": " << e.what(); + return false; + } + staged.emplace_back(p.filename().string(), std::move(compiled)); + } + return true; +} + +// Step 2 of folder load (runs after node.Initialize()): for each staged +// module, ask it for its supported SIDs via Method_3, populate +// node.get_Processor().m_RichParserModules keyed by SID, and refuse to start +// if two modules claim the same SID. Returns false on conflict. +bool apply_parser_modules(Node& node, const StagedParserModules& staged, bool dryRun) +{ + if (staged.empty() && !dryRun) + return true; + + auto& proc = node.get_Processor(); + std::map sidToName; // for conflict reporting + + bool conflict = false; + for (const auto& m : staged) + { + const std::string& name = m.first; + const ByteBuffer& compiled = m.second; + Blob bb(compiled.data(), static_cast(compiled.size())); + + std::vector sids; + if (!proc.ParserModule_GetSupportedSids(bb, sids) || sids.empty()) + { + BEAM_LOG_WARNING() << "Parser module " << name << " reported no SIDs; skipping"; + continue; + } + + for (const auto& sid : sids) + { + auto it = sidToName.find(sid); + if (it != sidToName.end()) + { + BEAM_LOG_ERROR() << "SID " << sid << " claimed by multiple parser modules: " << it->second << " and " << name; + conflict = true; + } + else + { + sidToName[sid] = name; + proc.m_RichParserModules[sid] = compiled; + } + } + } + + if (conflict) + { + BEAM_LOG_ERROR() << "Refusing to start: duplicate parser module SIDs."; + return false; + } + + if (dryRun) + { + std::cout << "Parser module SID -> module map:\n"; + for (const auto& kv : sidToName) + std::cout << " " << kv.first << " " << kv.second << "\n"; + std::exit(0); + } + return true; +} + void setup_node(Node& node, const Options& o) { BEAM_LOG_INFO() << "Beam Node Explorer " << PROJECT_VERSION << " (" << BRANCH_NAME << ")"; BEAM_LOG_INFO() << "Rules signature: " << Rules::get().get_SignatureStr(); @@ -256,9 +361,4 @@ void setup_node(Node& node, const Options& o) { address.resolve(o.nodeConnectTo.c_str()); node.m_Cfg.m_ProcessorParams.m_RichInfoFlags = NodeProcessor::StartParams::RichInfo::On; - if (o.m_RichParserChanged) - { - node.m_Cfg.m_ProcessorParams.m_RichInfoFlags |= NodeProcessor::StartParams::RichInfo::UpdShader; - node.m_Cfg.m_ProcessorParams.m_RichParser = o.m_RichParser; - } } diff --git a/node/processor.cpp b/node/processor.cpp index 538f5a40c3..2e5dc7a6a4 100644 --- a/node/processor.cpp +++ b/node/processor.cpp @@ -185,14 +185,6 @@ void NodeProcessor::Initialize(const char* szPath, const StartParams& sp, ILongA } } - if (StartParams::RichInfo::UpdShader & sp.m_RichInfoFlags) - { - m_DB.ParamSet(NodeDB::ParamID::RichContractParser, nullptr, &sp.m_RichParser); - - if (!bRebuildNonStd && m_DB.ParamIntGetDef(NodeDB::ParamID::RichContractInfo)) - bRebuildNonStd = true; - } - uint64_t nFlags1 = m_DB.ParamIntGetDef(NodeDB::ParamID::Flags1); if (bRebuildNonStd || (NodeDB::Flags1::PendingRebuildNonStd & nFlags1)) { @@ -5733,7 +5725,6 @@ struct NodeProcessor::ProcessorInfoParser NodeProcessor& m_Proc; Height m_Height; - ByteBuffer m_bufParser; std::ostringstream m_os; void SelectContext(bool /* bDependent */, uint32_t /* nChargeNeeded */) override { @@ -5844,15 +5835,18 @@ struct NodeProcessor::ProcessorInfoParser m_Height = p.m_Cursor.m_hh.m_Height; } - bool Init(uint32_t nStackBytesExtra) + bool Init(uint32_t nStackBytesExtra, const ECC::uintBig* pSid) { - m_Proc.m_DB.ParamGet(NodeDB::ParamID::RichContractParser, nullptr, nullptr, &m_bufParser); - if (m_bufParser.empty()) + if (!pSid) return false; - InitMem(nStackBytesExtra); - m_Code = m_bufParser; + auto it = m_Proc.m_RichParserModules.find(*pSid); + if (it == m_Proc.m_RichParserModules.end()) + return false; + const ByteBuffer& module = it->second; + InitMem(nStackBytesExtra); + m_Code = Blob(module.data(), static_cast(module.size())); m_pOut = &m_os; return true; } @@ -5892,7 +5886,7 @@ void NodeProcessor::BlockInterpretCtx::BvmProcessor::ParseExtraInfo(ContractInvo ProcessorInfoParser proc(m_Bic.m_Proc); proc.m_Height = m_Bic.m_Height - 1; - if (!proc.Init(m_Stack.AlignUp(args.n))) + if (!proc.Init(m_Stack.AlignUp(args.n), &sid)) return; proc.m_Stack.PushAlias(args); @@ -5919,7 +5913,7 @@ void NodeProcessor::get_ContractDescr(const ECC::uintBig& sid, const ECC::uintBi try { ProcessorInfoParser proc(*this); - if (!proc.Init(0)) + if (!proc.Init(0, &sid)) return; proc.PushArgBoth(sid); @@ -5935,6 +5929,56 @@ void NodeProcessor::get_ContractDescr(const ECC::uintBig& sid, const ECC::uintBi } } +bool NodeProcessor::ParserModule_GetSupportedSids(const Blob& moduleBytes, std::vector& outSids) +{ + try + { + ProcessorInfoParser proc(*this); + proc.InitMem(0); + + // moduleBytes is already-compiled BVM bytecode (compiled by stage_parser_modules). + proc.m_Code = moduleBytes; + proc.m_pOut = &proc.m_os; + + // First call: get count. + proc.m_Stack.Push((Wasm::Word) 0); // out_buf = nullptr + proc.m_Stack.Push((Wasm::Word) 0); // out_cap = 0 + proc.CallMethod(3); + while (!proc.IsDone()) + proc.RunOnce(); + + uint32_t nCount = proc.m_Stack.Pop(); + if (!nCount) + return true; + + // Second call: allocate aux buffer, write SIDs there, copy out. + const uint32_t nBytes = nCount * (uint32_t) sizeof(ECC::uintBig); + proc.m_Stack.AliasAlloc(nBytes); + Wasm::Word pBuf = proc.m_Stack.get_AlasSp(); + + proc.m_Stack.Push(pBuf); + proc.m_Stack.Push((Wasm::Word) nCount); + proc.CallMethod(3); + while (!proc.IsDone()) + proc.RunOnce(); + + uint32_t nWritten = proc.m_Stack.Pop(); + if (nWritten > nCount) + nWritten = nCount; + + const auto* pSids = (const ECC::uintBig*) proc.m_Stack.get_AliasPtr(); + for (uint32_t i = 0; i < nWritten; i++) + outSids.push_back(pSids[i]); + + return true; + } + catch (const std::exception& e) + { + BEAM_LOG_WARNING() << "parser module Method_3 error: " << e.what(); + return false; + } +} + BlobMap::Entry& NodeProcessor::BlockInterpretCtx::Storage::get_Var(const Blob& key) { auto* pE = m_Vars.Find(key); diff --git a/node/processor.h b/node/processor.h index 22ef8d255a..d210f718b2 100644 --- a/node/processor.h +++ b/node/processor.h @@ -267,10 +267,8 @@ class NodeProcessor struct RichInfo { static const uint8_t Off = 1; static const uint8_t On = 2; - static const uint8_t UpdShader = 4; }; uint8_t m_RichInfoFlags = 0; - Blob m_RichParser = Blob(nullptr, 0); }; void Initialize(const char* szPath); @@ -455,6 +453,17 @@ class NodeProcessor void ExtractTreasurykWithExtra(std::vector& vOuts); void get_ContractDescr(const ECC::uintBig& sid, const ECC::uintBig& cid, std::string&, bool bFullState); + // Per-SID parser modules. Loaded from --contract_rich_parser_folder before + // Initialize() is called. When a SID is not in this map, parsing is skipped. + std::map m_RichParserModules; + + // Ask a parser module for the list of SIDs it handles via Method_3 + // (two-call protocol). moduleBytes MUST be already-compiled BVM bytecode + // (the form produced by bvm2::Processor::Compile), not raw wasm. On success + // appends every reported SID to outSids and returns true. On any wasm error + // returns false. + bool ParserModule_GetSupportedSids(const Blob& moduleBytes, std::vector& outSids); + int get_AssetAt(Asset::Full&, Height, bool bFindAid); // Must set ID. Returns -1 if asset is destroyed, 0 if never existed. // if never existed and bFindAid - try to find next that ever existed diff --git a/node/unittests/CMakeLists.txt b/node/unittests/CMakeLists.txt index ffda386e8b..27bc1ce4dc 100644 --- a/node/unittests/CMakeLists.txt +++ b/node/unittests/CMakeLists.txt @@ -5,4 +5,3 @@ configure_file("../../bvm/Shaders/vault/app.wasm" "${CMAKE_CURRENT_BINARY_DIR}/v configure_file("../../bvm/Shaders/sidechain_pos/contract_l2.wasm" "${CMAKE_CURRENT_BINARY_DIR}/sidechain_pos/contract_l2.wasm" COPYONLY) configure_file("../../bvm/Shaders/pbft/pbft_dpos.wasm" "${CMAKE_CURRENT_BINARY_DIR}/pbft/pbft_dpos.wasm" COPYONLY) configure_file("../../bvm/Shaders/pbft/pbft_stat.wasm" "${CMAKE_CURRENT_BINARY_DIR}/pbft/pbft_stat.wasm" COPYONLY) -configure_file("../../bvm/Shaders/Explorer/Parser.wasm" "${CMAKE_CURRENT_BINARY_DIR}/Explorer/Parser.wasm" COPYONLY) diff --git a/node/unittests/node_test.cpp b/node/unittests/node_test.cpp index ad7399d793..73e77df42c 100644 --- a/node/unittests/node_test.cpp +++ b/node/unittests/node_test.cpp @@ -19,12 +19,12 @@ #include "../processor.h" #include "../bridge.h" #include "../../core/fly_client.h" -#include "../../core/serialization_adapters.h" +#include "../../core/serialization_adapters.h" #include "../../core/treasury.h" #include "../../core/block_rw.h" #include "../../utility/test_helpers.h" -#include "../../utility/serialize.h" -#include "../../utility/blobmap.h" +#include "../../utility/serialize.h" +#include "../../utility/blobmap.h" #include "../../core/unittest/mini_blockchain.h" #include "../../bvm/bvm2.h" #include "../../bvm/ManagerStd.h" @@ -35,13 +35,13 @@ #endif #include "utility/logger.h" -namespace Shaders { -# define HOST_BUILD -# include "../bvm/Shaders/common.h" -# include "../bvm/Shaders/sidechain_pos/contract_l2.h" -# include "../bvm/Shaders/pbft/pbft_dpos.h" -# include "../bvm/Shaders/pbft/pbft_stat.h" -} // namespace Shaders +namespace Shaders { +# define HOST_BUILD +# include "../bvm/Shaders/common.h" +# include "../bvm/Shaders/sidechain_pos/contract_l2.h" +# include "../bvm/Shaders/pbft/pbft_dpos.h" +# include "../bvm/Shaders/pbft/pbft_stat.h" +} // namespace Shaders namespace ECC { @@ -175,35 +175,35 @@ namespace beam Treasury::Data BuildTreasuryData() { - PeerID pid; - ECC::Scalar::Native sk; - Treasury::get_ID(*g_pTreasuryKdf, pid, sk); - - Treasury tres; - Treasury::Parameters pars; - pars.m_Bursts = 1; - pars.m_MaturityStep = 4; - Treasury::Entry* pE = tres.CreatePlan(pid, Rules::get().Emission.Value0 / 5, pars); - - pE->m_pResponse.reset(new Treasury::Response); - uint64_t nIndex = 1; - verify_test(pE->m_pResponse->Create(pE->m_Request, *g_pTreasuryKdf, nIndex)); - - Treasury::Data data; - data.m_sCustomMsg = "test treasury"; - tres.Build(data); - - return data; + PeerID pid; + ECC::Scalar::Native sk; + Treasury::get_ID(*g_pTreasuryKdf, pid, sk); + + Treasury tres; + Treasury::Parameters pars; + pars.m_Bursts = 1; + pars.m_MaturityStep = 4; + Treasury::Entry* pE = tres.CreatePlan(pid, Rules::get().Emission.Value0 / 5, pars); + + pE->m_pResponse.reset(new Treasury::Response); + uint64_t nIndex = 1; + verify_test(pE->m_pResponse->Create(pE->m_Request, *g_pTreasuryKdf, nIndex)); + + Treasury::Data data; + data.m_sCustomMsg = "test treasury"; + tres.Build(data); + + return data; } void FinalizeTreasuryData(Rules& r, const Treasury::Data& td) { - beam::Serializer ser; - ser & td; - - ser.swap_buf(g_Treasury); - - ECC::Hash::Processor() << Blob(g_Treasury) >> r.TreasuryChecksum; + beam::Serializer ser; + ser & td; + + ser.swap_buf(g_Treasury); + + ECC::Hash::Processor() << Blob(g_Treasury) >> r.TreasuryChecksum; } uint32_t CountTips(NodeDB& db, bool bFunctional, NodeDB::StateID* pLast = NULL) @@ -228,27 +228,27 @@ namespace beam struct StoragePts { - ECC::Point::Storage m_pArr[18]; - - void Init() - { - for (size_t i = 0; i < _countof(m_pArr); i++) - { - m_pArr[i].m_X = i; - } - } - - bool IsValid(size_t i0, size_t i1, uint32_t n0) const - { - for (; i0 < i1; i0++) - { - if (m_pArr[i0].m_X != ECC::uintBig(n0++)) - return false; - } - - return true; - } - }; + ECC::Point::Storage m_pArr[18]; + + void Init() + { + for (size_t i = 0; i < _countof(m_pArr); i++) + { + m_pArr[i].m_X = i; + } + } + + bool IsValid(size_t i0, size_t i1, uint32_t n0) const + { + for (; i0 < i1; i0++) + { + if (m_pArr[i0].m_X != ECC::uintBig(n0++)) + return false; + } + + return true; + } + }; void TestNodeDB(const char* sz) { @@ -409,16 +409,16 @@ namespace beam sid.m_Row = pRows[sid.m_Number.v - 1]; db.MoveFwd(sid); - Merkle::Hash hv; - if (sid.m_Number.v < 1 + 50) // skip it for big heights, coz it's quadratic - { + Merkle::Hash hv; + if (sid.m_Number.v < 1 + 50) // skip it for big heights, coz it's quadratic + { for (Height h = 1; h < sid.m_Number.v; h++) { Merkle::ProofBuilderStd bld; smmr.get_Proof(bld, smmr.N2I(Block::Number(h))); - vStates[h - 1].get_Hash(hv); - Merkle::Interpret(hv, bld.m_Proof); + vStates[h - 1].get_Hash(hv); + Merkle::Interpret(hv, bld.m_Proof); verify_test(hvRoot == hv); } } @@ -426,7 +426,7 @@ namespace beam const Block::SystemState::Full& sTop = vStates[sid.m_Number.v - 1]; hv = hvRoot; - Merkle::Interpret(hv, hvZero, true); + Merkle::Interpret(hv, hvZero, true); verify_test(hv == sTop.m_Definition); sTop.get_Hash(hv); @@ -536,196 +536,196 @@ namespace beam verify_test(db.GetDummyHeight(kid) == MaxHeight); - db.InsertDummy(176, kid); - - kid.m_Idx = 346; - db.InsertDummy(568, kid); + db.InsertDummy(176, kid); + + kid.m_Idx = 346; + db.InsertDummy(568, kid); - kid.m_Idx = 345; + kid.m_Idx = 345; verify_test(db.GetDummyHeight(kid) == 176); - - Height h1 = db.GetLowestDummy(kid); - verify_test(h1 == 176); - verify_test(kid.m_Idx == 345U); - - db.SetDummyHeight(kid, 1055); - - h1 = db.GetLowestDummy(kid); - verify_test(h1 == 568); - verify_test(kid.m_Idx == 346U); - - db.DeleteDummy(kid); - - h1 = db.GetLowestDummy(kid); - verify_test(h1 == 1055); - verify_test(kid.m_Idx == 345U); - - db.DeleteDummy(kid); - - verify_test(MaxHeight == db.GetLowestDummy(kid)); - - // Kernels - db.InsertKernel(bBodyP, 5); - db.InsertKernel(bBodyP, 5); // duplicate - db.InsertKernel(bBodyP, 7); - db.InsertKernel(bBodyP, 2); - - verify_test(db.FindKernel(bBodyP) == 7); - verify_test(db.FindKernel(bBodyE) == 0); - - db.DeleteKernel(bBodyP, 7); - verify_test(db.FindKernel(bBodyP) == 5); - db.DeleteKernel(bBodyP, 5); - verify_test(db.FindKernel(bBodyP) == 5); - db.DeleteKernel(bBodyP, 2); - verify_test(db.FindKernel(bBodyP) == 5); - db.DeleteKernel(bBodyP, 5); - verify_test(db.FindKernel(bBodyP) == 0); - - // Shielded - TxoID nShielded = 16 * 1024 * 3 + 5; - db.ShieldedResize(nShielded, 0); - - StoragePts pts; - pts.Init(); - - db.ShieldedWrite(16 * 1024 * 2 - 2, pts.m_pArr, _countof(pts.m_pArr)); - - ZeroObject(pts.m_pArr); - - db.ShieldedRead(16 * 1024 * 3 + 5 - _countof(pts.m_pArr), pts.m_pArr, _countof(pts.m_pArr)); - verify_test(memis0(pts.m_pArr, sizeof(pts.m_pArr))); - - db.ShieldedRead(16 * 1024 * 2 -2, pts.m_pArr, _countof(pts.m_pArr)); - verify_test(pts.IsValid(0, _countof(pts.m_pArr), 0)); - - db.ShieldedResize(1, nShielded); - db.ShieldedResize(0, 1); - - ECC::uintBig k1 = 223U; - Blob val(nullptr, 0); - - verify_test(db.UniqueInsertSafe(k1, &val)); - db.UniqueDeleteStrict(k1); - verify_test(db.UniqueInsertSafe(k1, nullptr)); - verify_test(!db.UniqueInsertSafe(k1, nullptr)); - - - // Assets - Asset::Full ai1, ai2; - ZeroObject(ai1); - - for (uint32_t i = 1; i <= 5; i++) - { - ai1.m_ID = 0; - db.AssetAdd(ai1); - verify_test(ai1.m_ID == i); - } - - verify_test(db.AssetDelete(5) == 4); // should shrink - verify_test(db.AssetDelete(3) == 4); // should retain the same size - - ai2.m_ID = 3; - verify_test(!db.AssetGetSafe(ai2)); - ai2.m_ID = 2; - verify_test(db.AssetGetSafe(ai2)); - verify_test(ai2.m_Owner == ai1.m_Owner); - - ai1.m_Owner.Inc(); - ai1.m_Owner.Negate(); - ai1.m_ID = 0; - db.AssetAdd(ai1); - verify_test(ai1.m_ID == 3); - - AmountBig::Type assetVal1, assetVal2 = 1U; - ai2.m_ID = 3; - verify_test(db.AssetGetSafe(ai2)); - verify_test(ai2.m_Value == Zero); - - assetVal2 = 334U; - db.AssetSetValue(3, assetVal2, 18); - - verify_test(db.AssetGetSafe(ai2)); - verify_test(ai2.m_Value == assetVal2); - verify_test(ai2.m_LockHeight == 18); - - ai1.m_ID = db.AssetFindByOwner(ai1.m_Owner); - verify_test(ai1.m_ID == 3); - ai1.m_Value = Zero; - verify_test(db.AssetGetSafe(ai1)); - verify_test(ai1.m_Value == assetVal2); - - verify_test(db.AssetDelete(2) == 4); - verify_test(db.AssetDelete(3) == 4); - verify_test(db.AssetDelete(4) == 1); - verify_test(db.AssetDelete(1) == 0); - - // StreamMmr, test cache - struct MyMmr - :public NodeDB::StreamMmr - { - using StreamMmr::StreamMmr; - uint32_t m_Total = 0; - uint32_t m_Miss = 0; - - void LoadElement(Merkle::Hash& hv, const Merkle::Position& pos) const override - { - Cast::NotConst(this)->m_Total++; - if (!CacheFind(hv, pos)) - { - Cast::NotConst(this)->m_Miss++; - StreamMmr::LoadElement(hv, pos); - } - } - }; - - MyMmr myMmr(db, NodeDB::StreamType::ShieldedMmr, true); - - for (uint32_t i = 0; i < 40; i++) - { - Merkle::Hash hv = i; - myMmr.Append(hv); - myMmr.get_Hash(hv); - } - - // in a 'friendly' scenario, where we only add and calculate root - cache must be 100% effective - verify_test(!myMmr.m_Miss); - + + Height h1 = db.GetLowestDummy(kid); + verify_test(h1 == 176); + verify_test(kid.m_Idx == 345U); + + db.SetDummyHeight(kid, 1055); + + h1 = db.GetLowestDummy(kid); + verify_test(h1 == 568); + verify_test(kid.m_Idx == 346U); + + db.DeleteDummy(kid); + + h1 = db.GetLowestDummy(kid); + verify_test(h1 == 1055); + verify_test(kid.m_Idx == 345U); + + db.DeleteDummy(kid); + + verify_test(MaxHeight == db.GetLowestDummy(kid)); + + // Kernels + db.InsertKernel(bBodyP, 5); + db.InsertKernel(bBodyP, 5); // duplicate + db.InsertKernel(bBodyP, 7); + db.InsertKernel(bBodyP, 2); + + verify_test(db.FindKernel(bBodyP) == 7); + verify_test(db.FindKernel(bBodyE) == 0); + + db.DeleteKernel(bBodyP, 7); + verify_test(db.FindKernel(bBodyP) == 5); + db.DeleteKernel(bBodyP, 5); + verify_test(db.FindKernel(bBodyP) == 5); + db.DeleteKernel(bBodyP, 2); + verify_test(db.FindKernel(bBodyP) == 5); + db.DeleteKernel(bBodyP, 5); + verify_test(db.FindKernel(bBodyP) == 0); + + // Shielded + TxoID nShielded = 16 * 1024 * 3 + 5; + db.ShieldedResize(nShielded, 0); + + StoragePts pts; + pts.Init(); + + db.ShieldedWrite(16 * 1024 * 2 - 2, pts.m_pArr, _countof(pts.m_pArr)); + + ZeroObject(pts.m_pArr); + + db.ShieldedRead(16 * 1024 * 3 + 5 - _countof(pts.m_pArr), pts.m_pArr, _countof(pts.m_pArr)); + verify_test(memis0(pts.m_pArr, sizeof(pts.m_pArr))); + + db.ShieldedRead(16 * 1024 * 2 -2, pts.m_pArr, _countof(pts.m_pArr)); + verify_test(pts.IsValid(0, _countof(pts.m_pArr), 0)); + + db.ShieldedResize(1, nShielded); + db.ShieldedResize(0, 1); + + ECC::uintBig k1 = 223U; + Blob val(nullptr, 0); + + verify_test(db.UniqueInsertSafe(k1, &val)); + db.UniqueDeleteStrict(k1); + verify_test(db.UniqueInsertSafe(k1, nullptr)); + verify_test(!db.UniqueInsertSafe(k1, nullptr)); + + + // Assets + Asset::Full ai1, ai2; + ZeroObject(ai1); + + for (uint32_t i = 1; i <= 5; i++) + { + ai1.m_ID = 0; + db.AssetAdd(ai1); + verify_test(ai1.m_ID == i); + } + + verify_test(db.AssetDelete(5) == 4); // should shrink + verify_test(db.AssetDelete(3) == 4); // should retain the same size + + ai2.m_ID = 3; + verify_test(!db.AssetGetSafe(ai2)); + ai2.m_ID = 2; + verify_test(db.AssetGetSafe(ai2)); + verify_test(ai2.m_Owner == ai1.m_Owner); + + ai1.m_Owner.Inc(); + ai1.m_Owner.Negate(); + ai1.m_ID = 0; + db.AssetAdd(ai1); + verify_test(ai1.m_ID == 3); + + AmountBig::Type assetVal1, assetVal2 = 1U; + ai2.m_ID = 3; + verify_test(db.AssetGetSafe(ai2)); + verify_test(ai2.m_Value == Zero); + + assetVal2 = 334U; + db.AssetSetValue(3, assetVal2, 18); + + verify_test(db.AssetGetSafe(ai2)); + verify_test(ai2.m_Value == assetVal2); + verify_test(ai2.m_LockHeight == 18); + + ai1.m_ID = db.AssetFindByOwner(ai1.m_Owner); + verify_test(ai1.m_ID == 3); + ai1.m_Value = Zero; + verify_test(db.AssetGetSafe(ai1)); + verify_test(ai1.m_Value == assetVal2); + + verify_test(db.AssetDelete(2) == 4); + verify_test(db.AssetDelete(3) == 4); + verify_test(db.AssetDelete(4) == 1); + verify_test(db.AssetDelete(1) == 0); + + // StreamMmr, test cache + struct MyMmr + :public NodeDB::StreamMmr + { + using StreamMmr::StreamMmr; + uint32_t m_Total = 0; + uint32_t m_Miss = 0; + + void LoadElement(Merkle::Hash& hv, const Merkle::Position& pos) const override + { + Cast::NotConst(this)->m_Total++; + if (!CacheFind(hv, pos)) + { + Cast::NotConst(this)->m_Miss++; + StreamMmr::LoadElement(hv, pos); + } + } + }; + + MyMmr myMmr(db, NodeDB::StreamType::ShieldedMmr, true); + + for (uint32_t i = 0; i < 40; i++) + { + Merkle::Hash hv = i; + myMmr.Append(hv); + myMmr.get_Hash(hv); + } + + // in a 'friendly' scenario, where we only add and calculate root - cache must be 100% effective + verify_test(!myMmr.m_Miss); + tr.Commit(); - // Contract data - NodeDB::Recordset rs, rs2; - Blob blob1; - ECC::Hash::Value hvKey = 234U, hvVal = 1232U, hvKey2; - verify_test(!db.ContractDataFind(hvKey, blob1, rs)); - - blob1 = hvKey; - verify_test(!db.ContractDataFindNext(blob1, rs)); - - db.ContractDataInsert(hvKey, hvVal); - verify_test(!db.ContractDataFindNext(blob1, rs)); - - hvVal.Inc(); - db.ContractDataUpdate(hvKey, hvVal); - - verify_test(db.ContractDataFind(hvKey, blob1, rs)); - verify_test(Blob(hvVal) == blob1); - - verify_test(db.ContractDataFind(hvKey, blob1, rs2)); // test the same query simultaneously - - blob1 = hvKey2; - hvKey2 = hvKey; - hvKey2.Inc(); - verify_test(!db.ContractDataFindNext(blob1, rs)); - - hvKey2 = hvKey; - hvKey2.Negate(); - hvKey2 += ECC::Hash::Value(2U); - hvKey2.Negate(); - verify_test(db.ContractDataFindNext(blob1, rs)); - verify_test(Blob(hvKey) == blob1); - - db.ContractDataDel(hvKey); + // Contract data + NodeDB::Recordset rs, rs2; + Blob blob1; + ECC::Hash::Value hvKey = 234U, hvVal = 1232U, hvKey2; + verify_test(!db.ContractDataFind(hvKey, blob1, rs)); + + blob1 = hvKey; + verify_test(!db.ContractDataFindNext(blob1, rs)); + + db.ContractDataInsert(hvKey, hvVal); + verify_test(!db.ContractDataFindNext(blob1, rs)); + + hvVal.Inc(); + db.ContractDataUpdate(hvKey, hvVal); + + verify_test(db.ContractDataFind(hvKey, blob1, rs)); + verify_test(Blob(hvVal) == blob1); + + verify_test(db.ContractDataFind(hvKey, blob1, rs2)); // test the same query simultaneously + + blob1 = hvKey2; + hvKey2 = hvKey; + hvKey2.Inc(); + verify_test(!db.ContractDataFindNext(blob1, rs)); + + hvKey2 = hvKey; + hvKey2.Negate(); + hvKey2 += ECC::Hash::Value(2U); + hvKey2.Negate(); + verify_test(db.ContractDataFindNext(blob1, rs)); + verify_test(Blob(hvKey) == blob1); + + db.ContractDataDel(hvKey); verify_test(!db.ContractDataFind(hvKey, blob1, rs)); // contract logs @@ -1352,27 +1352,27 @@ namespace beam if (!bTampered) { - Deserializer der; - der.reset(bbP); - - Block::BodyBase bbb; - TxVectors::Perishable txvp; - der & bbb; - der & txvp; - - verify_test(txvp.m_vInputs.empty()); // may contain only treasury, but we don't spend it in the test - - if (!txvp.m_vOutputs.empty()) - { - txvp.m_vOutputs.pop_back(); - - Serializer ser; - ser & bbb; - ser & txvp; - ser.swap_buf(bbP); - - bTampered = true; - } + Deserializer der; + der.reset(bbP); + + Block::BodyBase bbb; + TxVectors::Perishable txvp; + der & bbb; + der & txvp; + + verify_test(txvp.m_vInputs.empty()); // may contain only treasury, but we don't spend it in the test + + if (!txvp.m_vOutputs.empty()) + { + txvp.m_vOutputs.pop_back(); + + Serializer ser; + ser & bbb; + ser & txvp; + ser.swap_buf(bbP); + + bTampered = true; + } } Block::SystemState::ID id; @@ -1399,22 +1399,22 @@ namespace beam if (!bTampered) { - Deserializer der; - der.reset(bbP); - - Block::BodyBase bbb; - TxVectors::Perishable txvp; - der & bbb; - der & txvp; - - bbb.m_Offset.m_Value.Inc(); - - Serializer ser; - ser & bbb; - ser & txvp; - ser.swap_buf(bbP); - - bTampered = true; + Deserializer der; + der.reset(bbP); + + Block::BodyBase bbb; + TxVectors::Perishable txvp; + der & bbb; + der & txvp; + + bbb.m_Offset.m_Value.Inc(); + + Serializer ser; + ser & bbb; + ser & txvp; + ser.swap_buf(bbP); + + bTampered = true; } Block::SystemState::ID id; @@ -1440,32 +1440,32 @@ namespace beam if (!bTampered) { - Deserializer der; - der.reset(bbP); - - Block::BodyBase bbb; - TxVectors::Perishable txvp; - der & bbb; - der & txvp; - - for (size_t j = 0; j < txvp.m_vOutputs.size(); j++) - { - Output& outp = *txvp.m_vOutputs[j]; - if (outp.m_pConfidential) - { - outp.m_pConfidential->m_P_Tag.m_pCondensed[0].m_Value.Inc(); - bTampered = true; - break; - } - } - - if (bTampered) - { - Serializer ser; - ser & bbb; - ser & txvp; - ser.swap_buf(bbP); - } + Deserializer der; + der.reset(bbP); + + Block::BodyBase bbb; + TxVectors::Perishable txvp; + der & bbb; + der & txvp; + + for (size_t j = 0; j < txvp.m_vOutputs.size(); j++) + { + Output& outp = *txvp.m_vOutputs[j]; + if (outp.m_pConfidential) + { + outp.m_pConfidential->m_P_Tag.m_pCondensed[0].m_Value.Inc(); + bTampered = true; + break; + } + } + + if (bTampered) + { + Serializer ser; + ser & bbb; + ser & txvp; + ser.swap_buf(bbP); + } } Block::SystemState::ID id; @@ -1500,33 +1500,33 @@ namespace beam if (!bTampered) { - Deserializer der; - der.reset(bbP); - - Block::BodyBase bbb; - TxVectors::Perishable txvp; - der & bbb; - der & txvp; - - for (size_t j = 0; j < txvp.m_vOutputs.size(); j++) - { - Output& outp = *txvp.m_vOutputs[j]; - if (outp.m_pConfidential || outp.m_pPublic) - { - outp.m_pConfidential.reset(); - outp.m_pPublic.reset(); - bTampered = true; - break; - } - } - - if (bTampered) - { - Serializer ser; - ser & bbb; - ser & txvp; - ser.swap_buf(bbP); - } + Deserializer der; + der.reset(bbP); + + Block::BodyBase bbb; + TxVectors::Perishable txvp; + der & bbb; + der & txvp; + + for (size_t j = 0; j < txvp.m_vOutputs.size(); j++) + { + Output& outp = *txvp.m_vOutputs[j]; + if (outp.m_pConfidential || outp.m_pPublic) + { + outp.m_pConfidential.reset(); + outp.m_pPublic.reset(); + bTampered = true; + break; + } + } + + if (bTampered) + { + Serializer ser; + ser & bbb; + ser & txvp; + ser.swap_buf(bbP); + } } Block::SystemState::ID id; @@ -1562,33 +1562,33 @@ namespace beam if (!hTampered.v) { - Deserializer der; - der.reset(bbP); - - Block::BodyBase bbb; - TxVectors::Perishable txvp; - der & bbb; - der & txvp; - - for (size_t j = 0; j < txvp.m_vOutputs.size(); j++) - { - Output& outp = *txvp.m_vOutputs[j]; - if (outp.m_pConfidential || outp.m_pPublic) - { - outp.m_pConfidential.reset(); - outp.m_pPublic.reset(); - hTampered = h; - break; - } - } - - if (hTampered.v) - { - Serializer ser; - ser & bbb; - ser & txvp; - ser.swap_buf(bbP); - } + Deserializer der; + der.reset(bbP); + + Block::BodyBase bbb; + TxVectors::Perishable txvp; + der & bbb; + der & txvp; + + for (size_t j = 0; j < txvp.m_vOutputs.size(); j++) + { + Output& outp = *txvp.m_vOutputs[j]; + if (outp.m_pConfidential || outp.m_pPublic) + { + outp.m_pConfidential.reset(); + outp.m_pPublic.reset(); + hTampered = h; + break; + } + } + + if (hTampered.v) + { + Serializer ser; + ser & bbb; + ser & txvp; + ser.swap_buf(bbP); + } } Block::SystemState::ID id; @@ -1757,8 +1757,8 @@ namespace beam Key::IPKdf::Ptr m_pOwner2; uint32_t m_nUnrecognized = 0; - bool OnUtxo(Height h, const Output& outp) override - { + bool OnUtxo(Height h, const Output& outp) override + { CoinID cid; bool b1 = outp.Recover(h, *m_pOwner1, cid); bool b2 = outp.Recover(h, *m_pOwner2, cid); @@ -1768,9 +1768,9 @@ namespace beam m_nUnrecognized++; verify_test(m_nUnrecognized <= 1); } - - return true; - } + + return true; + } } parser; parser.m_pOwner1 = node.m_Keys.m_pOwner; parser.m_pOwner2 = node2.m_Keys.m_pOwner; @@ -1798,138 +1798,138 @@ namespace beam struct PbftTreasuryBuilderBase { - Treasury::Data::Group& m_Tg; - PbftTreasuryBuilderBase(Treasury::Data::Group& tg) - :m_Tg(tg) - { - } - - void FixOffset(ECC::Scalar::Native& sk, bool isOutp) - { - if (isOutp) - sk = -sk; - m_Tg.m_Data.m_Offset = ECC::Scalar::Native(m_Tg.m_Data.m_Offset) + sk; - } + Treasury::Data::Group& m_Tg; + PbftTreasuryBuilderBase(Treasury::Data::Group& tg) + :m_Tg(tg) + { + } + + void FixOffset(ECC::Scalar::Native& sk, bool isOutp) + { + if (isOutp) + sk = -sk; + m_Tg.m_Data.m_Offset = ECC::Scalar::Native(m_Tg.m_Data.m_Offset) + sk; + } }; - struct PbftTreasuryBuilder_Dpos - :public PbftTreasuryBuilderBase - { - ContractID m_Cid; - Shaders::PBFT_DPOS::Settings m_Settings; - - PbftTreasuryBuilder_Dpos(Treasury::Data::Group& tg) - :PbftTreasuryBuilderBase(tg) - { - ZeroObject(m_Settings); - } - - void Init() - { - m_Tg.m_Aid = m_Settings.m_aidStake; - - auto pKrn = std::make_unique(); - beam::bvm2::Compile(pKrn->m_Data, "pbft/pbft_dpos.wasm", beam::bvm2::Processor::Kind::Contract); - - pKrn->m_Args.resize(sizeof(Shaders::PBFT_DPOS::Method::Create)); - auto& args = *(Shaders::PBFT_DPOS::Method::Create*) &pKrn->m_Args.front(); - ZeroObject(args); - - args.m_Settings.m_aidStake = ByteOrder::to_le(m_Settings.m_aidStake); - args.m_Settings.m_hUnbondLock = ByteOrder::to_le(m_Settings.m_hUnbondLock); - args.m_Settings.m_MinValidatorStake = ByteOrder::to_le(m_Settings.m_MinValidatorStake); - - ECC::Scalar::Native sk; - sk.GenRandomNnz(); - ECC::Point::Native ptFunds(beam::Zero); - pKrn->Sign(&sk, 1, ptFunds, nullptr); - - bvm2::get_Cid(m_Cid, pKrn->m_Data, pKrn->m_Args); - - m_Tg.m_Data.m_vKernels.push_back(std::move(pKrn)); - FixOffset(sk, true); - } - - void AddValidator(const Block::Pbft::Address& addr, const ECC::Point& pkDelegator, Amount stake) - { - auto pKrn = std::make_unique(); - pKrn->m_Cid = m_Cid; - - pKrn->m_Args.resize(sizeof(Shaders::PBFT_DPOS::Method::ValidatorRegister)); - auto& args = *(Shaders::PBFT_DPOS::Method::ValidatorRegister*)&pKrn->m_Args.front(); - pKrn->m_iMethod = args.s_iMethod; - - ZeroObject(args); - args.m_Commission_cpc = 500; - args.m_Stake = ByteOrder::to_le(stake); - args.m_Validator = Cast::Down(addr); - args.m_Delegator = pkDelegator; - - ECC::Point::Native ptFunds(Zero); - CoinID::Generator(m_Settings.m_aidStake).AddValue(ptFunds, stake); - - ECC::Scalar::Native sk; - sk.GenRandomNnz(); - pKrn->Sign(&sk, 1, ptFunds, nullptr); - - m_Tg.m_Data.m_vKernels.push_back(std::move(pKrn)); - FixOffset(sk, true); - - m_Tg.m_Value += MultiWord::From(stake); - } + struct PbftTreasuryBuilder_Dpos + :public PbftTreasuryBuilderBase + { + ContractID m_Cid; + Shaders::PBFT_DPOS::Settings m_Settings; + + PbftTreasuryBuilder_Dpos(Treasury::Data::Group& tg) + :PbftTreasuryBuilderBase(tg) + { + ZeroObject(m_Settings); + } + + void Init() + { + m_Tg.m_Aid = m_Settings.m_aidStake; + + auto pKrn = std::make_unique(); + beam::bvm2::Compile(pKrn->m_Data, "pbft/pbft_dpos.wasm", beam::bvm2::Processor::Kind::Contract); + + pKrn->m_Args.resize(sizeof(Shaders::PBFT_DPOS::Method::Create)); + auto& args = *(Shaders::PBFT_DPOS::Method::Create*) &pKrn->m_Args.front(); + ZeroObject(args); + + args.m_Settings.m_aidStake = ByteOrder::to_le(m_Settings.m_aidStake); + args.m_Settings.m_hUnbondLock = ByteOrder::to_le(m_Settings.m_hUnbondLock); + args.m_Settings.m_MinValidatorStake = ByteOrder::to_le(m_Settings.m_MinValidatorStake); + + ECC::Scalar::Native sk; + sk.GenRandomNnz(); + ECC::Point::Native ptFunds(beam::Zero); + pKrn->Sign(&sk, 1, ptFunds, nullptr); + + bvm2::get_Cid(m_Cid, pKrn->m_Data, pKrn->m_Args); + + m_Tg.m_Data.m_vKernels.push_back(std::move(pKrn)); + FixOffset(sk, true); + } + + void AddValidator(const Block::Pbft::Address& addr, const ECC::Point& pkDelegator, Amount stake) + { + auto pKrn = std::make_unique(); + pKrn->m_Cid = m_Cid; + + pKrn->m_Args.resize(sizeof(Shaders::PBFT_DPOS::Method::ValidatorRegister)); + auto& args = *(Shaders::PBFT_DPOS::Method::ValidatorRegister*)&pKrn->m_Args.front(); + pKrn->m_iMethod = args.s_iMethod; + + ZeroObject(args); + args.m_Commission_cpc = 500; + args.m_Stake = ByteOrder::to_le(stake); + args.m_Validator = Cast::Down(addr); + args.m_Delegator = pkDelegator; + + ECC::Point::Native ptFunds(Zero); + CoinID::Generator(m_Settings.m_aidStake).AddValue(ptFunds, stake); + + ECC::Scalar::Native sk; + sk.GenRandomNnz(); + pKrn->Sign(&sk, 1, ptFunds, nullptr); + + m_Tg.m_Data.m_vKernels.push_back(std::move(pKrn)); + FixOffset(sk, true); + + m_Tg.m_Value += MultiWord::From(stake); + } }; - struct PbftTreasuryBuilder_Stat - :public PbftTreasuryBuilderBase - { - typedef Shaders::PBFT_STAT::Method::Create::ValidatorInit ValidatorInit; - std::vector m_vInit; - - using PbftTreasuryBuilderBase::PbftTreasuryBuilderBase; - - void AddValidator(const Block::Pbft::Address& addr, const ECC::Point& /* pkDelegator */, Amount stake) - { - AddValidator(addr, stake); - } - - void AddValidator(const Block::Pbft::Address& addr, Amount stake) - { - auto& x = m_vInit.emplace_back(); - x.m_Address = Cast::Down(addr); - x.m_Weight = stake; - } - - void Export() - { - verify_test(!m_vInit.empty()); - - auto pKrn = std::make_unique(); - beam::bvm2::Compile(pKrn->m_Data, "pbft/pbft_stat.wasm", beam::bvm2::Processor::Kind::Contract); - - pKrn->m_Args.resize(sizeof(Shaders::PBFT_STAT::Method::Create) + sizeof(ValidatorInit) * m_vInit.size()); - auto& args = *(Shaders::PBFT_STAT::Method::Create*) &pKrn->m_Args.front(); - ZeroObject(args); - args.m_Count = ByteOrder::to_le(static_cast(m_vInit.size())); - - for (uint32_t i = 0; i < m_vInit.size(); i++) - { - const auto& src = m_vInit[i]; - auto& dst = args.get_VI()[i]; - - dst.m_Address = src.m_Address; - dst.m_Weight = ByteOrder::to_le(src.m_Weight); - } - - ECC::Scalar::Native sk; - sk.GenRandomNnz(); - ECC::Point::Native ptFunds(beam::Zero); - pKrn->Sign(&sk, 1, ptFunds, nullptr); - - m_Tg.m_Data.m_vKernels.push_back(std::move(pKrn)); - FixOffset(sk, true); - } - + struct PbftTreasuryBuilder_Stat + :public PbftTreasuryBuilderBase + { + typedef Shaders::PBFT_STAT::Method::Create::ValidatorInit ValidatorInit; + std::vector m_vInit; + + using PbftTreasuryBuilderBase::PbftTreasuryBuilderBase; + + void AddValidator(const Block::Pbft::Address& addr, const ECC::Point& /* pkDelegator */, Amount stake) + { + AddValidator(addr, stake); + } + + void AddValidator(const Block::Pbft::Address& addr, Amount stake) + { + auto& x = m_vInit.emplace_back(); + x.m_Address = Cast::Down(addr); + x.m_Weight = stake; + } + + void Export() + { + verify_test(!m_vInit.empty()); + + auto pKrn = std::make_unique(); + beam::bvm2::Compile(pKrn->m_Data, "pbft/pbft_stat.wasm", beam::bvm2::Processor::Kind::Contract); + + pKrn->m_Args.resize(sizeof(Shaders::PBFT_STAT::Method::Create) + sizeof(ValidatorInit) * m_vInit.size()); + auto& args = *(Shaders::PBFT_STAT::Method::Create*) &pKrn->m_Args.front(); + ZeroObject(args); + args.m_Count = ByteOrder::to_le(static_cast(m_vInit.size())); + + for (uint32_t i = 0; i < m_vInit.size(); i++) + { + const auto& src = m_vInit[i]; + auto& dst = args.get_VI()[i]; + + dst.m_Address = src.m_Address; + dst.m_Weight = ByteOrder::to_le(src.m_Weight); + } + + ECC::Scalar::Native sk; + sk.GenRandomNnz(); + ECC::Point::Native ptFunds(beam::Zero); + pKrn->Sign(&sk, 1, ptFunds, nullptr); + + m_Tg.m_Data.m_vKernels.push_back(std::move(pKrn)); + FixOffset(sk, true); + } + }; void TestNodeClientProto(Rules& r, bool bTestPbft, bool bTestBridge) { @@ -2216,13 +2216,13 @@ namespace beam if (!sdp.m_Output.m_Value) return false; - auto& fs = Transaction::FeeSettings::get(h + 1); + auto& fs = Transaction::FeeSettings::get(h + 1); Amount fee = fs.get_DefaultStd() + fs.m_ShieldedOutputTotal; sdp.m_Output.m_Value -= fee; m_Shielded.m_Cfg = Rules::get().Shielded.m_ProofMax; - + assert(msgTx.m_Transaction); { @@ -2246,17 +2246,17 @@ namespace beam // skip the voucher signature } - ECC::Oracle oracle; - oracle << pKrn->get_Msg(); + ECC::Oracle oracle; + oracle << pKrn->get_Msg(); // substitute the voucher pKrn->m_Txo.m_Ticket = voucher.m_Ticket; - sdp.m_Ticket.m_SharedSecret = voucher.m_SharedSecret; + sdp.m_Ticket.m_SharedSecret = voucher.m_SharedSecret; ZeroObject(sdp.m_Output.m_User); - sdp.m_Output.m_User.m_Sender = 165U; - sdp.m_Output.m_User.m_pMessage[0] = 243U; - sdp.m_Output.m_User.m_pMessage[1] = 2435U; + sdp.m_Output.m_User.m_Sender = 165U; + sdp.m_Output.m_User.m_pMessage[0] = 243U; + sdp.m_Output.m_User.m_pMessage[1] = 2435U; sdp.GenerateOutp(pKrn->m_Txo, h + 1, oracle); m_Shielded.m_SerialPub = pKrn->m_Txo.m_Ticket.m_SerialPub; @@ -2299,48 +2299,48 @@ namespace beam msgTx.m_Transaction = std::make_shared(); msgTx.m_Transaction->m_Offset = Zero; - Height h = m_vStates.back().get_Height(); - - TxKernelShieldedInput::Ptr pKrn(new TxKernelShieldedInput); - pKrn->m_Height.m_Min = h + 1; - pKrn->m_WindowEnd = nWnd1; - pKrn->m_SpendProof.m_Cfg = m_Shielded.m_Cfg; + Height h = m_vStates.back().get_Height(); + + TxKernelShieldedInput::Ptr pKrn(new TxKernelShieldedInput); + pKrn->m_Height.m_Min = h + 1; + pKrn->m_WindowEnd = nWnd1; + pKrn->m_SpendProof.m_Cfg = m_Shielded.m_Cfg; Lelantus::CmListVec lst; assert(nWnd1 <= m_Shielded.m_Wnd0 + m_Shielded.m_N); if (nWnd1 == m_Shielded.m_Wnd0 + m_Shielded.m_N) - lst.m_vec.swap(msg.m_Items); - else - { - // zero-pad from left - lst.m_vec.resize(m_Shielded.m_N); - for (size_t i = 0; i < m_Shielded.m_N - msg.m_Items.size(); i++) - { - ECC::Point::Storage& v = lst.m_vec[i]; - v.m_X = Zero; - v.m_Y = Zero; - } - std::copy(msg.m_Items.begin(), msg.m_Items.end(), lst.m_vec.end() - msg.m_Items.size()); - } - - Lelantus::Prover p(lst, pKrn->m_SpendProof); + lst.m_vec.swap(msg.m_Items); + else + { + // zero-pad from left + lst.m_vec.resize(m_Shielded.m_N); + for (size_t i = 0; i < m_Shielded.m_N - msg.m_Items.size(); i++) + { + ECC::Point::Storage& v = lst.m_vec[i]; + v.m_X = Zero; + v.m_Y = Zero; + } + std::copy(msg.m_Items.begin(), msg.m_Items.end(), lst.m_vec.end() - msg.m_Items.size()); + } + + Lelantus::Prover p(lst, pKrn->m_SpendProof); p.m_Witness.m_L = static_cast(m_Shielded.m_N - m_Shielded.m_Confirmed) - 1; p.m_Witness.m_R = m_Shielded.m_Params.m_Ticket.m_pK[0] + m_Shielded.m_Params.m_Output.m_k; // total blinding factor of the shielded element p.m_Witness.m_SpendSk = m_Shielded.m_skSpendKey; p.m_Witness.m_V = m_Shielded.m_Params.m_Output.m_Value; - ECC::SetRandom(p.m_Witness.m_R_Output); + ECC::SetRandom(p.m_Witness.m_R_Output); pKrn->m_NotSerialized.m_hvShieldedState = msg.m_State1; pKrn->Sign(p, 0); verify_test(m_Shielded.m_Params.m_Ticket.m_SpendPk == pKrn->m_SpendProof.m_SpendPk); - auto& fs = Transaction::FeeSettings::get(h + 1); + auto& fs = Transaction::FeeSettings::get(h + 1); Amount fee = fs.get_DefaultStd() + fs.m_ShieldedInputTotal; - msgTx.m_Transaction->m_vKernels.push_back(std::move(pKrn)); + msgTx.m_Transaction->m_vKernels.push_back(std::move(pKrn)); m_Wallet.UpdateOffset(*msgTx.m_Transaction, p.m_Witness.m_R_Output, false); m_Wallet.MakeTxOutput(*msgTx.m_Transaction, h, 0, m_Shielded.m_Params.m_Output.m_Value, fee); @@ -2349,12 +2349,12 @@ namespace beam ctx.m_Height.m_Min = h + 1; verify_test(msgTx.m_Transaction->IsValid(ctx)); - for (size_t i = 0; i < msgTx.m_Transaction->m_vKernels.size(); i++) - { - const TxKernel& krn = *msgTx.m_Transaction->m_vKernels[i]; - if (krn.get_Subtype() == TxKernel::Subtype::Std) - m_Shielded.m_SpendKernelID = krn.get_ID(); - } + for (size_t i = 0; i < msgTx.m_Transaction->m_vKernels.size(); i++) + { + const TxKernel& krn = *msgTx.m_Transaction->m_vKernels[i]; + if (krn.get_Subtype() == TxKernel::Subtype::Std) + m_Shielded.m_SpendKernelID = krn.get_ID(); + } msgTx.m_Fluff = true; OnBeingSpent(msgTx); @@ -2817,13 +2817,13 @@ namespace beam #pragma pack (push, 1) // copied from sidechain_pos/contract_l2.h - struct BridgeOp - { - Asset::ID m_Aid; - Amount m_Amount; - uint64_t m_Cookie; - ECC::Point m_pk; - }; + struct BridgeOp + { + Asset::ID m_Aid; + Amount m_Amount; + uint64_t m_Cookie; + ECC::Point m_pk; + }; #pragma pack (pop) TxKernelContractInvoke::Ptr pKrn(new TxKernelContractInvoke); @@ -2884,64 +2884,64 @@ namespace beam { } - void OnDone(const std::exception* pExc) override - { - m_Done = true; - m_Err = !!pExc; - + void OnDone(const std::exception* pExc) override + { + m_Done = true; + m_Err = !!pExc; + m_This.m_Contract.m_Done++; - - if (m_This.m_pMan) - { - if (!m_Err) + + if (m_This.m_pMan) + { + if (!m_Err) printf("manager shader: %s\n", m_Out.str().c_str()); - - //m_This.m_pMan.reset(); - } - } - - struct DelayedStart - :public io::IdleEvt - { - void OnSchedule() override - { - cancel(); - get_ParentObj().StartRun(1); - } - - IMPLEMENT_GET_PARENT_OBJ(MyManager, m_DelayedStart) - - } m_DelayedStart; - - std::map m_Slots; - - bool SlotLoad(ECC::Hash::Value& hv, uint32_t iSlot) override - { - auto it = m_Slots.find(iSlot); - if (m_Slots.end() == it) - return false; - - hv = it->second; - return true; - } - - void SlotSave(const ECC::Hash::Value& hv, uint32_t iSlot) override - { - m_Slots[iSlot] = hv; - } - - void SlotErase(uint32_t iSlot) override - { - auto it = m_Slots.find(iSlot); - if (m_Slots.end() != it) - m_Slots.erase(it); - } - - void SelectContext(bool /* bDependent */, uint32_t /* nChargeNeeded */) override - { - m_Context.m_Height = m_This.m_vStates.empty() ? 0 : m_This.m_vStates.back().get_Height(); - } - + + //m_This.m_pMan.reset(); + } + } + + struct DelayedStart + :public io::IdleEvt + { + void OnSchedule() override + { + cancel(); + get_ParentObj().StartRun(1); + } + + IMPLEMENT_GET_PARENT_OBJ(MyManager, m_DelayedStart) + + } m_DelayedStart; + + std::map m_Slots; + + bool SlotLoad(ECC::Hash::Value& hv, uint32_t iSlot) override + { + auto it = m_Slots.find(iSlot); + if (m_Slots.end() == it) + return false; + + hv = it->second; + return true; + } + + void SlotSave(const ECC::Hash::Value& hv, uint32_t iSlot) override + { + m_Slots[iSlot] = hv; + } + + void SlotErase(uint32_t iSlot) override + { + auto it = m_Slots.find(iSlot); + if (m_Slots.end() != it) + m_Slots.erase(it); + } + + void SelectContext(bool /* bDependent */, uint32_t /* nChargeNeeded */) override + { + m_Context.m_Height = m_This.m_vStates.empty() ? 0 : m_This.m_vStates.back().get_Height(); + } + }; std::unique_ptr m_pMan; @@ -2952,68 +2952,68 @@ namespace beam MyClient& m_This; MyNetwork(MyClient& me) :m_This(me) {} - void Connect() override {} - void Disconnect() override {} - void BbsSubscribe(BbsChannel, Timestamp, proto::FlyClient::IBbsReceiver*) override {} + void Connect() override {} + void Disconnect() override {} + void BbsSubscribe(BbsChannel, Timestamp, proto::FlyClient::IBbsReceiver*) override {} proto::FlyClient::Request::Ptr m_pReq; - void PostRequestInternal(proto::FlyClient::Request& r) override - { - switch (r.get_Type()) - { - case proto::FlyClient::Request::Type::ContractVars: - m_This.Send(Cast::Up(r).m_Msg); - break; - - case proto::FlyClient::Request::Type::ContractLogs: - m_This.Send(Cast::Up(r).m_Msg); - break; - - case proto::FlyClient::Request::Type::ContractVar: - m_This.Send(Cast::Up(r).m_Msg); - break; - - default: - return; - } - - m_pReq = &r; - } - - void OnComplete2() - { - auto pReq = std::move(m_pReq); - pReq->m_pTrg->OnComplete(*pReq); - } - + void PostRequestInternal(proto::FlyClient::Request& r) override + { + switch (r.get_Type()) + { + case proto::FlyClient::Request::Type::ContractVars: + m_This.Send(Cast::Up(r).m_Msg); + break; + + case proto::FlyClient::Request::Type::ContractLogs: + m_This.Send(Cast::Up(r).m_Msg); + break; + + case proto::FlyClient::Request::Type::ContractVar: + m_This.Send(Cast::Up(r).m_Msg); + break; + + default: + return; + } + + m_pReq = &r; + } + + void OnComplete2() + { + auto pReq = std::move(m_pReq); + pReq->m_pTrg->OnComplete(*pReq); + } + void OnMsg(proto::ContractVars&& msg) { - if (m_pReq && m_pReq->m_pTrg) - { - auto& x = Cast::Up(*m_pReq); - x.m_Res = std::move(msg); - OnComplete2(); + if (m_pReq && m_pReq->m_pTrg) + { + auto& x = Cast::Up(*m_pReq); + x.m_Res = std::move(msg); + OnComplete2(); } } void OnMsg(proto::ContractLogs&& msg) { - if (m_pReq && m_pReq->m_pTrg) - { - auto& x = Cast::Up(*m_pReq); - x.m_Res = std::move(msg); - OnComplete2(); + if (m_pReq && m_pReq->m_pTrg) + { + auto& x = Cast::Up(*m_pReq); + x.m_Res = std::move(msg); + OnComplete2(); } } void OnMsg(proto::ContractVar&& msg) { - if (m_pReq && m_pReq->m_pTrg) - { - auto& x = Cast::Up(*m_pReq); - x.m_Res = std::move(msg); - OnComplete2(); + if (m_pReq && m_pReq->m_pTrg) + { + auto& x = Cast::Up(*m_pReq); + x.m_Res = std::move(msg); + OnComplete2(); } } }; @@ -3362,7 +3362,7 @@ namespace beam if (!m_queProofsStateExpected.empty()) { const Block::SystemState::Full& s = m_vStates[m_queProofsStateExpected.front()]; - Block::SystemState::ID id; + Block::SystemState::ID id; s.get_ID(id); verify_test(m_vStates.back().IsValidProofState(id, msg.m_Proof)); @@ -3447,26 +3447,26 @@ namespace beam { if (!m_queProofsKrnExpected.empty()) { - const MiniWallet::MyKernel& mk = m_Wallet.m_MyKernels[m_queProofsKrnExpected.front()]; + const MiniWallet::MyKernel& mk = m_Wallet.m_MyKernels[m_queProofsKrnExpected.front()]; m_queProofsKrnExpected.pop_front(); if (!msg.m_Proof.empty()) { - TxKernelStd krn; - mk.Export(krn); - verify_test(m_vStates.back().IsValidProofKernel(krn, msg.m_Proof)); - - if (!m_Shielded.m_SpendConfirmed && (krn.get_ID() == m_Shielded.m_SpendKernelID)) - { - m_Shielded.m_SpendConfirmed = true; - - proto::GetProofShieldedInp msgOut; - msgOut.m_SpendPk = m_Shielded.m_Params.m_Ticket.m_SpendPk; - Send(msgOut); - + TxKernelStd krn; + mk.Export(krn); + verify_test(m_vStates.back().IsValidProofKernel(krn, msg.m_Proof)); + + if (!m_Shielded.m_SpendConfirmed && (krn.get_ID() == m_Shielded.m_SpendKernelID)) + { + m_Shielded.m_SpendConfirmed = true; + + proto::GetProofShieldedInp msgOut; + msgOut.m_SpendPk = m_Shielded.m_Params.m_Ticket.m_SpendPk; + Send(msgOut); + printf("Waiting for shielded input proof...\n"); - - } + + } } } else @@ -3496,17 +3496,17 @@ namespace beam MyClient& m_This; MyParser(MyClient& x) :m_This(x) {} - void OnEventBase(proto::Event::Base& evt) override - { - // log non-UTXO events - std::ostringstream os; - os << "Evt H=" << m_Height << ", "; - evt.Dump(os); - printf("%s\n", os.str().c_str()); - } - - void OnEventType(proto::Event::Utxo& evt) override - { + void OnEventBase(proto::Event::Base& evt) override + { + // log non-UTXO events + std::ostringstream os; + os << "Evt H=" << m_Height << ", "; + evt.Dump(os); + printf("%s\n", os.str().c_str()); + } + + void OnEventType(proto::Event::Utxo& evt) override + { ECC::Scalar::Native sk; ECC::Point comm; CoinID::Worker(evt.m_Cid).Create(sk, comm, *m_This.m_Wallet.m_pKdf); @@ -3514,24 +3514,24 @@ namespace beam if (evt.m_Cid.m_AssetID) { - verify_test(evt.m_Cid.m_AssetID == m_This.m_Assets.m_ID); - if (!m_This.m_Assets.m_Recognized) - { - m_This.m_Assets.m_Recognized = true; - printf("Asset UTXO recognized\n"); - } + verify_test(evt.m_Cid.m_AssetID == m_This.m_Assets.m_ID); + if (!m_This.m_Assets.m_Recognized) + { + m_This.m_Assets.m_Recognized = true; + printf("Asset UTXO recognized\n"); + } } else { if (proto::Event::Flags::Add & evt.m_Flags) m_This.m_Wallet.AddMyUtxo(evt.m_Cid, evt.m_Maturity); } - } - - void OnEventType(proto::Event::Shielded& evt) override - { - OnEventBase(evt); - + } + + void OnEventType(proto::Event::Shielded& evt) override + { + OnEventBase(evt); + // Restore all the relevent data verify_test(evt.m_TxoID == 0); @@ -3567,29 +3567,29 @@ namespace beam m_This.m_Shielded.m_EvtAdd = true; else m_This.m_Shielded.m_EvtSpend = true; - } - - void OnEventType(proto::Event::AssetCtl& evt) override - { - OnEventBase(evt); - - if (m_This.m_Assets.m_ID) { - // creation event may come before the client got proof for its asset - verify_test(evt.m_Info.m_ID == m_This.m_Assets.m_ID); - } - verify_test(evt.m_Info.m_Metadata.m_Value == m_This.m_Assets.m_Metadata.m_Value); - verify_test(evt.m_Info.m_Owner == m_This.m_Assets.m_Owner); - - if (proto::Event::Flags::Add & evt.m_Flags) - { - verify_test(!m_This.m_Assets.m_EvtCreated); - m_This.m_Assets.m_EvtCreated = true; - } - - if (evt.m_EmissionChange) - m_This.m_Assets.m_EvtEmitted = true; - } - + } + + void OnEventType(proto::Event::AssetCtl& evt) override + { + OnEventBase(evt); + + if (m_This.m_Assets.m_ID) { + // creation event may come before the client got proof for its asset + verify_test(evt.m_Info.m_ID == m_This.m_Assets.m_ID); + } + verify_test(evt.m_Info.m_Metadata.m_Value == m_This.m_Assets.m_Metadata.m_Value); + verify_test(evt.m_Info.m_Owner == m_This.m_Assets.m_Owner); + + if (proto::Event::Flags::Add & evt.m_Flags) + { + verify_test(!m_This.m_Assets.m_EvtCreated); + m_This.m_Assets.m_EvtCreated = true; + } + + if (evt.m_EmissionChange) + m_This.m_Assets.m_EvtEmitted = true; + } + } p(*this); uint32_t nCount = p.Proceed(msg.m_Events); @@ -3632,13 +3632,7 @@ namespace beam node.m_Keys.m_Accounts.m_vAdd.push_back(cl.m_Wallet2.m_pKdf); - ByteBuffer bufParser; - bvm2::Compile(bufParser, "Explorer/Parser.wasm", bvm2::Processor::Kind::Manager); - - node.m_Cfg.m_ProcessorParams.m_RichInfoFlags = - NodeProcessor::StartParams::RichInfo::On | - NodeProcessor::StartParams::RichInfo::UpdShader; - node.m_Cfg.m_ProcessorParams.m_RichParser = bufParser; + node.m_Cfg.m_ProcessorParams.m_RichInfoFlags = NodeProcessor::StartParams::RichInfo::On; node.Initialize(); @@ -3647,9 +3641,9 @@ namespace beam struct BridgeClient :public EventsExtractorForeign { - void OnEvent(Event::Base&&) override - { - } + void OnEvent(Event::Base&&) override + { + } } bc; @@ -3681,8 +3675,8 @@ namespace beam { MyClient* m_pOtherClient; - void OnConnectedSecure() override - { + void OnConnectedSecure() override + { SendLogin(); } @@ -3739,26 +3733,26 @@ namespace beam bc.Stop(); // stop it manually (rather than wait for stop in its d'tor) // we'll test various things, including manual rollback with forbidden state. As a result, the connected FlyClient may observe a decrease in tip chainwork - struct TxoRecover - :public NodeProcessor::ITxoRecover - { - uint32_t m_Recovered = 0; - + struct TxoRecover + :public NodeProcessor::ITxoRecover + { + uint32_t m_Recovered = 0; + bool OnTxo(const NodeDB::WalkerTxo&, Height hCreate, Output&, const CoinID&, const Output::User&) override { m_Recovered++; return true; } - }; - - TxoRecover wlk; - wlk.m_pKey = node.m_Keys.m_pOwner.get(); - node2.get_Processor().EnumTxos(wlk); + }; + + TxoRecover wlk; + wlk.m_pKey = node.m_Keys.m_pOwner.get(); + node2.get_Processor().EnumTxos(wlk); verify_test(wlk.m_Recovered); wlk.m_Recovered = 0; - wlk.m_pKey = node.get_Processor().m_vAccounts[1].m_pOwner.get(); - node2.get_Processor().EnumTxos(wlk); + wlk.m_pKey = node.get_Processor().m_vAccounts[1].m_pOwner.get(); + node2.get_Processor().EnumTxos(wlk); verify_test(wlk.m_Recovered); // Test recovery info. Check if shielded in/outs and assets can re recognized @@ -3776,35 +3770,35 @@ namespace beam typedef std::set PkSet; PkSet m_SpendKeys; - bool OnUtxoRecognized(Height, const Output&, CoinID& cid, const Output::User&) override - { - m_Utxos++; - if (cid.m_AssetID) - m_UtxosCA++; - return true; - } - - bool OnShieldedOutRecognized(const ShieldedTxo::DescriptionOutp& dout, const ShieldedTxo::DataParams& pars, Key::Index) override - { - verify_test(m_SpendKeys.end() == m_SpendKeys.find(pars.m_Ticket.m_SpendPk)); - m_SpendKeys.insert(pars.m_Ticket.m_SpendPk); - m_ShieldedOuts++; - return true; - } - - bool OnShieldedIn(const ShieldedTxo::DescriptionInp& din) override - { - if (m_SpendKeys.end() != m_SpendKeys.find(din.m_SpendPk)) - m_ShieldedIns++; - return true; - } - - bool OnAssetRecognized(Asset::Full&) override - { - m_Assets++; - return true; - } - + bool OnUtxoRecognized(Height, const Output&, CoinID& cid, const Output::User&) override + { + m_Utxos++; + if (cid.m_AssetID) + m_UtxosCA++; + return true; + } + + bool OnShieldedOutRecognized(const ShieldedTxo::DescriptionOutp& dout, const ShieldedTxo::DataParams& pars, Key::Index) override + { + verify_test(m_SpendKeys.end() == m_SpendKeys.find(pars.m_Ticket.m_SpendPk)); + m_SpendKeys.insert(pars.m_Ticket.m_SpendPk); + m_ShieldedOuts++; + return true; + } + + bool OnShieldedIn(const ShieldedTxo::DescriptionInp& din) override + { + if (m_SpendKeys.end() != m_SpendKeys.find(din.m_SpendPk)) + m_ShieldedIns++; + return true; + } + + bool OnAssetRecognized(Asset::Full&) override + { + m_Assets++; + return true; + } + }; MyParser p; @@ -4167,10 +4161,10 @@ namespace beam { Waiter m_W; - void OnComplete(proto::FlyClient::Request&) override - { - m_W.StopSafe(true); - } + void OnComplete(proto::FlyClient::Request&) override + { + m_W.StopSafe(true); + } }; MyHandler h; @@ -4209,12 +4203,12 @@ namespace beam } } - void get_Kdf(Key::IKdf::Ptr& pOut) override { - pOut = m_pKdf; - } - void get_OwnerKdf(Key::IPKdf::Ptr& pOut) override { - pOut = m_pKdf; - } + void get_Kdf(Key::IKdf::Ptr& pOut) override { + pOut = m_pKdf; + } + void get_OwnerKdf(Key::IPKdf::Ptr& pOut) override { + pOut = m_pKdf; + } }; @@ -4262,73 +4256,73 @@ namespace beam std::list m_lstCoins; std::vector m_vKrnIds; - void OnDone(const std::exception* pExc) override - { - m_Done = true; - m_Err = !!pExc; - - if (m_pW) - m_pW->StopSafe(!m_Err); - } - - void RunSync0(uint32_t iMethod) - { - m_Done = false; - m_Err = false; - - StartRun(iMethod); - } - - void RunSync1() - { - if (m_Done) - return; - - { - Waiter wt; - m_pW = &wt; - wt.Wait(); - m_pW = nullptr; - } - - if (!m_Done) - // propagate it - io::Reactor::get_Current().stop(); - } - - void RunSync(uint32_t iMethod) - { - RunSync0(iMethod); - RunSync1(); - } - - Transaction::Ptr BuildTx() - { + void OnDone(const std::exception* pExc) override + { + m_Done = true; + m_Err = !!pExc; + + if (m_pW) + m_pW->StopSafe(!m_Err); + } + + void RunSync0(uint32_t iMethod) + { + m_Done = false; + m_Err = false; + + StartRun(iMethod); + } + + void RunSync1() + { + if (m_Done) + return; + + { + Waiter wt; + m_pW = &wt; + wt.Wait(); + m_pW = nullptr; + } + + if (!m_Done) + // propagate it + io::Reactor::get_Current().stop(); + } + + void RunSync(uint32_t iMethod) + { + RunSync0(iMethod); + RunSync1(); + } + + Transaction::Ptr BuildTx() + { Height hTx = m_Context.m_Height + 1; auto pTx = std::make_shared(); pTx->m_Offset = Zero; - bvm2::FundsMap fm; - - for (uint32_t i = 0; i < m_InvokeData.m_vec.size(); i++) - { - const auto& cdata = m_InvokeData.m_vec[i]; - - Amount fee; - if (cdata.IsAdvanced()) - fee = cdata.m_Adv.m_Fee; // can't change! - else - fee = cdata.get_FeeMin(hTx); - - cdata.Generate(*pTx, *m_pKdf, hTx, fee); - - auto& krn = *pTx->m_vKernels.back(); - m_vKrnIds.push_back(krn.get_ID()); - - fm += cdata.m_Spend; - fm[0] += fee; - } + bvm2::FundsMap fm; + + for (uint32_t i = 0; i < m_InvokeData.m_vec.size(); i++) + { + const auto& cdata = m_InvokeData.m_vec[i]; + + Amount fee; + if (cdata.IsAdvanced()) + fee = cdata.m_Adv.m_Fee; // can't change! + else + fee = cdata.get_FeeMin(hTx); + + cdata.Generate(*pTx, *m_pKdf, hTx, fee); + + auto& krn = *pTx->m_vKernels.back(); + m_vKrnIds.push_back(krn.get_ID()); + + fm += cdata.m_Spend; + fm[0] += fee; + } ECC::Scalar::Native kOff(pTx->m_Offset); @@ -4375,7 +4369,7 @@ namespace beam pTx->m_Offset = kOff; pTx->Normalize(); return pTx; - } + } void BuildAndSend(proto::FlyClient::INetwork& net) { @@ -4643,7 +4637,7 @@ void TestAll() beam::DeleteFile(beam::g_sz2); } -thread_local const beam::Rules* beam::Rules::s_pInstance = nullptr; +thread_local const beam::Rules* beam::Rules::s_pInstance = nullptr; int main() { diff --git a/utility/cli/options.cpp b/utility/cli/options.cpp index 1ec70ae28d..bf5169fb81 100644 --- a/utility/cli/options.cpp +++ b/utility/cli/options.cpp @@ -118,7 +118,8 @@ namespace beam const char* MANUAL_ROLLBACK = "manual_rollback"; const char* MANUAL_SELECT = "manual_select"; const char* CONTRACT_RICH_INFO = "contract_rich_info"; - const char* CONTRACT_RICH_PARSER = "contract_rich_parser"; + const char* CONTRACT_RICH_PARSER_FOLDER = "contract_rich_parser_folder"; + const char* CONTRACT_RICH_PARSER_FOLDER_DRYRUN = "contract_rich_parser_folder_dryrun"; const char* CHECKDB = "check_db"; const char* VACUUM = "vacuum"; const char* CRASH = "crash"; @@ -442,7 +443,7 @@ namespace beam (cli::RECOVERY_AUTO_PATH, po::value(), "path and file prefix for recovery auto-generation") (cli::RECOVERY_AUTO_PERIOD, po::value()->default_value(30), "period (in blocks) for recovery auto-generation") (cli::CONTRACT_RICH_INFO, po::value(), "Set to save rich contract invocation info") - (cli::CONTRACT_RICH_PARSER, po::value(), "Optional shader to parse contract invocation info") + (cli::CONTRACT_RICH_PARSER_FOLDER, po::value(), "Optional folder of per-contract parser modules (*.wasm)") (cli::BRIDGE_NETWORK_L1, po::value(), "Bridge L1 network") (cli::BRIDGE_CID, po::value(), "Bridge L1 Contract ID") diff --git a/utility/cli/options.h b/utility/cli/options.h index 963e393d0d..dac840a6bb 100644 --- a/utility/cli/options.h +++ b/utility/cli/options.h @@ -84,7 +84,8 @@ namespace beam extern const char* MANUAL_ROLLBACK; extern const char* MANUAL_SELECT; extern const char* CONTRACT_RICH_INFO; - extern const char* CONTRACT_RICH_PARSER; + extern const char* CONTRACT_RICH_PARSER_FOLDER; + extern const char* CONTRACT_RICH_PARSER_FOLDER_DRYRUN; extern const char* CHECKDB; extern const char* VACUUM; extern const char* CRASH; From c5309872e742fb44ea96651a54531d12786d9e54 Mon Sep 17 00:00:00 2001 From: Max <63856008+Maxnflaxl@users.noreply.github.com> Date: Sun, 3 May 2026 01:51:56 +0200 Subject: [PATCH 2/2] rm .DS_Store --- bvm/Shaders/Explorer/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 bvm/Shaders/Explorer/.DS_Store diff --git a/bvm/Shaders/Explorer/.DS_Store b/bvm/Shaders/Explorer/.DS_Store deleted file mode 100644 index 70190956369e9a62f9a345f842273e776550278c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKy-ve05WXu#L}Ka4=!FO98-yx|2k6Fxk{}ooxl+|VFUH&l=({j6@ZArnp&5{n z5JGp7{hfVxKKqkm=ZJ_`yLL&mAff_IkVTmgnVvMw-1!{Hx<*Hjv~9OdSLca^{^FGE z{epVR)Y6WQ_Mbc1?iW+{v|Km2-{?vB20j^(`yrtTmX3p=ULEMP1OU!4tpZ(Y z35iLLrQ=`-3xq8cXrb&S23t7hllzs9gQ0~Jd-1`Z`J;GY&5rexx)Ya%(FX&;z?gwE z8!qJizr`mrS>%sHViXJn1OJQxo>%K?g+uw2ESuXG#?Wfhs%aA5ohC?U}W1HZt)JKh90g8%>k

&PZ1=apr^=)R7>)`h0N(R%Gl!3XU`XCr*ra2rAx|D z69viXaY*}-0@KdT%9VOjATsA5HXzNCFS1!Z1-Uyd9!<>=o}3zTy5P>;+Hu4MXJ_$x z3J!&5IUYldZMLb4Fe1mJ3mYVCFvk9jd0~c;5#!$#pt%&V#EC+)DBulrouI$aLC+!+Ja`dFOm z7z19UsMOxnLC)X<=ME^Y;>;le6|5?0EJ;bpp<5>s!Av0!o(`gBf~(M7y;HtL0-_;M z-Vx?JiNY|{^k$(uQ7OFiSZH8CmEjZ(mOK{O`sIYJk9Dm$IuoL@Cch8<&RX~rYD3N- zrHL;7KPO23N6&G%2o+SQq*dt8>XbHg@X7fN320%jbYh#NIF3~>2Wp{JjCu2W#C=} z@R;6;sGW=`q={yCA#>>fSG$jV3VV_??Mbkw%9$nWYl(TW5a<+Eq&0kS1}Umm34utV zRRR)eit>12RpNNT1}+~V8L;IORC;I|q*ucSV$nHaQ=zltg*#6BTLpqk?X4a0x zQG=|O&yYAMfsq~Ob{Z-QuIJ;CFg$4g*rDwq{7Vm^7N-v{N3=-zmq~quF$lh?cJ(ae z8eF-OGkC~wL`%6uUhWo{o>%Yq;V-kB?QsymrMo0vXeyU7i41}>0m;|Yo}uGV3l@P& zAEF{H^^r((3+I!hycCzxYC`fTwRD-z0eD;LUpQh_1&IOIh&71@VqrDy^+-x%G?n&v zW19*q4y)qZV}U;684I*OozJS6F(&F0-%1ln{~j9&T4AJM&OJ$akE(Oke24 zX$4T9R3qen87e#DP%%+W5d-s4GgU04D5BBU(fz<`aiI^*{||Mcr%n2G>G*Jujwf`! zKE_A7!%%&gkC3x~SqsK~X5ETChX~!ugNJK;4^-@q^QEW03Fh2;qGU0Xcz2vZIlZ}qiuXlZ(A=$Qj!Uj=?#46={JPs>jj~ss zb^}%kTwKwys@n1@^t3@@7{53V^i(hC+*(6>la7PfA*p2 zC(1vy&wcaQlMlZ%KW*+I1$gUj7`mcjEbN%QN)H(j!OD_hSP~<~A6vD#J6fhO57&A= zYboEW@no@Q(9!f^5=~ik}H3-2Z)_jji_3G)XdHc%sT2<&y*7oK+ z|2onMqM*qzc-!SVt9irCz@HA>R*TJ+D|5q5KV;Woa_QchO_ghPw<pF8=2H8lp8M>R6Ia=exy62m z!D#Sz5+Cla-$hDvuC1f1=k=$S=t^CB)vfJDv$)OMS1LiFtKmgA*tY-TFlf75)}1FP z(A^#0ls{f?wPXPE+N2%iU5ck&+WTFIN4?d^Fo$t2XT+5Gpg}V9R+? zV3ta1%q`l!)o3G)JGp6C)(yQEOp${+C8@QV!lw;gTdvQ!K}1wizFkTBfuYmSzsj31 zrEh|Yo2hFnY2kZ#b?A)YUIr>k$0dK?xggioZh}hMaS6|i{|{na9}=wEuDC&q_oG=s Ws=3wSJ@Y(WsiSOUHmv_3{{9IfU}jtZ diff --git a/bvm/Shaders/roulette/contract.wasm b/bvm/Shaders/roulette/contract.wasm old mode 100644 new mode 100755 index 3c18eeaa895a73ebca2eb570bd34790e7b6bee7e..673ca4e6f97747d84d557f2464c97fc6b75e4a09 GIT binary patch delta 1037 zcmZWoy>HV%6n}Si64NBLMWr^Og*c_HQn?OI)h4K_5FYp#KyOB}v~)@+ z<#S;$f`I{vl>r7emi`Gyh(CZ0CT1iCp6viewWYiF-o5wx{qEk~m;4*~JtZqCfdEZQ zWJrwBNX%yLNNI;To_|O|ZZ`YeZ0|LDUf1Q!7lMmqEAvfCza@kQt8{vpvkWk5$_PI= zrxIhaP764VM#m#CWaVBMpQm-2qgPd$2jwUXWL2Vq4(cXsh1N0@8gxCjlm=aiEvZ2l zVhb8{4l!XfEHtu~L2yFingKzPuHHTsRgNP$NJ%O*r#uL~1a}e%)#I<+j|vcWE_gv} zxkY>P|VxGo`Nw1qN_j-xDu?KPwuc~n}V zk}9AT_juaiUndK}`P9s8lKw9vo&wSa zw^Bt(oEJi;5ICugVh&XiO!qRAiDC3?+t9mIa4hhJs03R5na<^ zFqv69h6<-`g>{373L*>EdwmrsuGh&koeKZMvQG z+FG?%U5DpH=BD3ayt&IvKJZyz(z30Ay{E^IPLmUk?)A7f-8OAo@47o(pS8K}?K9u@ z+>SQk3~b)rH|+t_WM{z5md*5z?X^t1uT53mNO-T;bvycQkB1LflYO?!eCD>9&JTO6 NuSxxG$JNW-@NzD_r95ztsY} zzmZ@^$;j&^E^U*i1^>i8T#GL6poTU?T>`$yNTYq{>B27*{LmiQO{`7+bG&I~ z%pvvo)Re_!f-(*4J`3rWFg$v5Yst^OS91|@4evlxxTVtM6j)0>e!al0ux`8Kw@}&_ zer--_QhUx=d+1f8u!dj~8LF-E{f)u)_CUuxk4FIS(HpG~2Q~=a5-iwnL8Ii~*;pUl K4LZw9JpKR{@~8#? diff --git a/bvm/Shaders/sidechain/contract.wasm b/bvm/Shaders/sidechain/contract.wasm old mode 100644 new mode 100755 index 406d0da6f3f09a82abcd538d0cff248062830ce2..f4540660207d6ad6cbbaee4ca3fa786861312635 GIT binary patch literal 9553 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 sizeof(SidechainPos::L1::Method::Create)) + { + auto* p = (const SidechainPos::L1::Method::Create*) pArg; + Env::DocGroup gr("params"); + WriteSposSettings(p->m_Settings); + WriteUpgradeSettings(p->m_Upgradable); + if (nArg >= sizeof(*p) + sizeof(SidechainPos::L1::Validator) * p->m_Validators) + WriteSposValidators((const SidechainPos::L1::Validator*) (p + 1), p->m_Validators); + } + break; + + case Upgradable3::Method::Control::s_iMethod: + // Control method handling intentionally minimal — host emits wrapper info. + Env::DocAddText("method", "Upgradable3 Control"); + break; + + case SidechainPos::L1::Method::UserStake::s_iMethod: + if (nArg >= sizeof(SidechainPos::L1::Method::UserStake)) + { + auto* p = (const SidechainPos::L1::Method::UserStake*) pArg; + Env::DocAddText("method", "User stake"); + Env::DocGroup gr("params"); + DocAddAmount("Amount", p->m_Amount); + DocAddPk("Pk", p->m_pkUser); + } + break; + + case SidechainPos::L1::Method::BridgeExport::s_iMethod: + if (nArg >= sizeof(SidechainPos::L1::Method::BridgeExport)) + { + auto* p = (const SidechainPos::L1::Method::BridgeExport*) pArg; + Env::DocAddText("method", "Bridge Export"); + Env::DocGroup gr("params"); + OnSposBridgeOp(*p); + } + break; + + case SidechainPos::L1::Method::BridgeImport::s_iMethod: + if (nArg >= sizeof(SidechainPos::L1::Method::BridgeImport)) + { + auto* p = (const SidechainPos::L1::Method::BridgeImport*) pArg; + Env::DocAddText("method", "Bridge Import"); + Env::DocGroup gr("params"); + OnSposBridgeOp(*p); + WriteUpgradeAdminsMask(p->m_ApproveMask); + } + break; + } +} + +static void OnState_L1(const ContractID& cid) +{ + Env::Key_T k; + _POD_(k.m_Prefix.m_Cid) = cid; + k.m_KeyInContract = SidechainPos::L1::Tags::s_State; + + SidechainPos::L1::State s; + if (!Env::VarReader::Read_T(k, s)) + return; + + { + Env::DocGroup gr2("Settings"); + WriteSposSettings(s.m_Settings); + } + + { + k.m_KeyInContract = SidechainPos::L1::Tags::s_Validators; + Env::VarReader r(k, k); + + SidechainPos::L1::Validator pV[SidechainPos::L1::Validator::s_Max]; + uint32_t nKey = 0, nVal = sizeof(pV); + + if (r.MoveNext(nullptr, nKey, pV, nVal, 0) && (nVal >= sizeof(SidechainPos::L1::Validator)) && (nVal <= sizeof(pV))) + WriteSposValidators(pV, nVal / sizeof(SidechainPos::L1::Validator)); + } +} + +static void OnMethod_L2(uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + switch (iMethod) + { + case 0: Env::DocAddText("method", "Create"); break; + case 1: Env::DocAddText("method", "Destroy"); break; + + case SidechainPos::L2::Method::BridgeEmit::s_iMethod: + if (nArg >= sizeof(SidechainPos::L2::Method::BridgeEmit)) + { + auto* p = (const SidechainPos::L2::Method::BridgeEmit*) pArg; + Env::DocAddText("method", "Mint"); + Env::DocGroup gr("params"); + OnSposBridgeOp(*p); + } + break; + + case SidechainPos::L2::Method::BridgeBurn::s_iMethod: + if (nArg >= sizeof(SidechainPos::L2::Method::BridgeBurn)) + { + auto* p = (const SidechainPos::L2::Method::BridgeBurn*) pArg; + Env::DocAddText("method", "Burn"); + Env::DocGroup gr("params"); + OnSposBridgeOp(*p); + } + break; + } +} + +BEAM_EXPORT uint32_t Method_3(ShaderID* out_buf, uint32_t out_cap) +{ + uint32_t n = init_sids(); + return ParserModule_FillSids(out_buf, out_cap, g_Sids, n); +} + +BEAM_EXPORT void Method_0(const ShaderID& sid, const ContractID&, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); + Env::DocAddText("kind", KindFor(sid)); + if (_POD_(sid) == SidechainPos::L2::s_SID) + OnMethod_L2(iMethod, pArg, nArg); + else + OnMethod_L1(iMethod, pArg, nArg); +} + +BEAM_EXPORT void Method_1(const ShaderID& sid, const ContractID&) +{ + Env::DocGroup gr(""); + Env::DocAddText("kind", KindFor(sid)); +} + +BEAM_EXPORT void Method_2(const ShaderID& sid, const ContractID& cid) +{ + Env::DocGroup gr(""); + Env::DocAddText("kind", KindFor(sid)); + if (_POD_(sid) == SidechainPos::L2::s_SID) + return; // L2 has no state + Env::DocGroup grSt("State"); + OnState_L1(cid); +} diff --git a/bvm/Shaders/sidechain_pos/parser.wasm b/bvm/Shaders/sidechain_pos/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..a05ba4173d62184dc312d77069acb7b927c97da2 GIT binary patch literal 5288 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 M?soDhL-_`}fmjD0& delta 492 zcmbQpe~5R&dnFcD#sWr0MpkA<1|~KR#(GA_h7J~P_9Ki!Y`Lkq`9+mXlVuq1*0U=x zIkIOtG6E@%EXR)wjtl~g4Gj$pQcMmCOqvXZ0!<)Z7%u}*!9|8FMP`sVNU4HAGe`z3 z!I34<0^ta>f@p5A5(Q?UqBam8Y#0_z?G2MFnB)x$fy&X`&;iy4v5CnM=qg7>flj#5 zlTR?232|g8FgTuMfZCwI=*TfyfLTnW5Xkz@V8y@=q``)QB&?VX8965BFxy8U3#0fK zsvK+=g8;;SpkINyk^Bl3K=&=k3T75-9%REOd$Gt`F>BOB@iM>yg%K2jKu2pJ+zfLe v)G1JJgUnmVa*llq6H8uVZtCVXR((b$2DQnj*(7;clXDXD(%B3R^nefm9LjF& diff --git a/bvm/Shaders/upgradable2/Test/test_app.wasm b/bvm/Shaders/upgradable2/Test/test_app.wasm old mode 100644 new mode 100755 index 674f868ad1fba091162cc0fb8fb7e7d224593559..148a8cc4c46c86e0488bdf764183536d7f6d9c6e GIT binary patch literal 17278 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 N%!^Y9(u0kQ{{_oUV0-`o literal 15627 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 diff --git a/bvm/Shaders/upgradable2/Test/test_v0.wasm b/bvm/Shaders/upgradable2/Test/test_v0.wasm old mode 100644 new mode 100755 index 70e3d417e7ce3329d30871517cf0ff7bd7baea31..6e35aa60cbfb192bde8e6d0449e2542bc0dc8e9b GIT binary patch delta 302 zcmZXPy-ve06h>nb(m)H5Krpi#2Z)#vY&-)JvK;3ovg$wC*Daaakr4zh#S8E}fLM^& zzB3%@e9!r3@p5y%o0E)`71@xx?Y5ZDZp+euabeoYYR)4Hx#Zp{ixBcx{&Dh9SYaSL zSRh2?tIK9BqIqjbyO|x4e@b?-=Y#8$gb>N%drF8Ade%+k@ZK5d0<6!Z7IrM#wz+Dq zvv*RX2qPdLKwt_GD?0CzUb5dTTK@s&JknDsv}Wqj_9}ox=2j52vm@O%Nuyc`oq*OR rq3ATQQM*p)NRO?v7=-uAj%@JwbCK2o1_)p!Fq}L@T17Ql22c0}|6yeN delta 75 zcmcb{(!o5zPLYL`v4D}0k(HT|fr*WSv7XVfp@W5+U5}M5H#IlEsFG=7)=4&Vmb}E= d)X5%p3rhyhBfna7g4r;~50s|5QuYe-Qxv{MJPxf_6ruGq#VB;y+cqQHf z5DOC9cZMUK?=AnFK0jPcCnO_9Nw(y6x69|Vo1!paTp0JVs%au}v2MIm79mXD%^f)v zx#b43!v#XbW?0r69?i=Kx!%r>$v-E%-1otCNkE8X@jV5^2pwxja&+$uv;j8fLUSvN z)v8|BSJ^A6kOv9a^uRF%h$Wr3Nw3*&7p?vPa~|oL;94{FXgd`^Aaer*?X08+CTUay v*9mB467p69liIahM|xtN#lXE+R5EaQ;Uijd4SC1)Z*gQ6y2msM%Lt<#JqGiLjye^1OQKQ83_OY diff --git a/bvm/Shaders/upgradable2/contract.wasm b/bvm/Shaders/upgradable2/contract.wasm old mode 100644 new mode 100755 index aecf786413196cdc5462f0e9e521c44c3f057e3d..259de3246f07cd92aaad725b94e4ea8b21c9475e GIT binary patch delta 773 zcmZuvOKTKC5bnqHWaI411d?Ek^z6kA!z3{Tb5LPB_(W6$4b0DF-2 z`K{7(Q02EaDqan zdyIN4H$6Bst@M_`W##FAhv(o;CF}!_p+TseL6f6(P-jh#HLuGCvQOvu>Z2T50;n;F zsy-g7)ra|O43WSVO{y}vlUy&Nr1M`Q_43zpH!{7rkfY*ytT z#g1ZOO}LKl+nu}NdMDwou%j+d{3vW&$AZikov!0&+^Phba9TdM+kVt?{L~r`2OY$5 hCv4jrvB($Ksw8}aCp>hyEp}p_T7|UJ4sE_I{s6PW%dh|d delta 578 zcmZ8eziU)M5T2RceRufY3u{0V1&@6%QSOS92x5=~$pl1#8XJpX7c>Oc+-U>_8{hLM z(Ms6HGU)}8*a#LD)8O z_UY2Oe-T^%AsB@qFxqE-NAPFx(~`@)-wJhjq^?yC+JJ@Ptk7yfK30sI=krKfnw|Fc zdF*$@=nG2Y^Swej&4n*DziwX0Ar+KpYSYS<97c4ZE7BhLQZZeOf?_x|rT}RGfDRnD zFX}qn&~qBt_^_>KrQ0oyW<+A9P@;UmL~*g diff --git a/bvm/Shaders/upgradable3/Test/test_app.wasm b/bvm/Shaders/upgradable3/Test/test_app.wasm old mode 100644 new mode 100755 index ccc772cb4c1087cb72b1954e7c4a5b92064b3057..87e1f4c7acaedbfa74f1ce0cffb703112876d8c4 GIT binary patch literal 16222 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 literal 14660 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 RI*E~bxiOl&e*Ja${~w!onPC6` diff --git a/bvm/Shaders/upgradable3/Test/test_v0.wasm b/bvm/Shaders/upgradable3/Test/test_v0.wasm old mode 100644 new mode 100755 index 958ebdd31481554e6ecc468a655ef8928ca83c30..fd3be2f7b783bb17d6246ab4a871f9969e89ed5e GIT binary patch delta 695 zcmZWnU5nE|6rDRsx^dGl6c)NDwyrD-F;&+ua1lEXf*|UEeGWWykH{;FkbD9DKDmu)7&F8AI z(yLTL9>!uyNyD~N>9}J%iTy}&q2w*ty!lg8|EQqNHs<&cwy%%Rz}Y3Hy>hjQMF^XX z>XZOA+Q5FPJ7l5L9>PWb5<0NRKf)z^e+TPs^HrgPN8~E`tYf6t$=)&|-qS}+W6*qE zaH`Z`NGuB&l*eUOXcu|z(v2Hf&PYc+D5n@d;YRa$p|Q@Y9R+u)qmI@lTLd~(!M59! z!Q)#sRL{TA?uLH9Mw%}QzHw*@IZIp5Ms)>kDfvmI)gn(H91&5p^od}R-&3wtG*s;b z`CH{wS4U`%n0==P#(^->3U^2C;n%Re;&<)mKa|b&l784mp-y*59b-K|tzKFC3Totp zoYbn4r_!EW=O`99&$%!f~UG^^s``WmGfaX{z;A~1cBv0iUz*muC(F_ z7eO3(=4zM)(w{g%#?3~UNv9uh%M0SZ6Qt&eD2}9XlEjZZYnaGl*35?BLoRsaa!XDV No|<~Y5S^LZiyQ9}t`>w`l#mn&22nv%xP_otq}D>vcnD{{Ot1(jiHKl2ace=u zPJck`E&K`B>A%p@*<94dTevqn`{vEOd2{ZkZ@zqCV;d1|3xN_6`=|!j!kH@BiAK<9 zb$X=dF}Hb}5RW#B{@j2+P#^L*i}T}{)@eNhMF7+Q@2@sqNs!y?okz^LC zNDtA+NI&5s|KG8=qh#n^8%=(NWq6T{vvCC_$$Rd|GW9~?xwVy(DlCT{H4L*?q8HCy)h z)(=%?D}~Oa_df<$oDG=$e&|;#HxpO<3~SoZ8jiQ9g;<(;K+)W91iC8j@{mimJFUah dTF~jD%V90(c7wy>K@aU(eZP5>C@+-wd;@)adV&A| diff --git a/bvm/Shaders/upgradable3/Test/test_v0_migrate.wasm b/bvm/Shaders/upgradable3/Test/test_v0_migrate.wasm old mode 100644 new mode 100755 index 04e0b95927d4641c827c3c9cb753ec1d2e9c9cd7..64346bc5dd8cd29ca16a1e70388cc5f9138ed0d7 GIT binary patch delta 345 zcmZXQJx;?w6ohx3I0-SrKmdsbML@T#2@xD1qM_#i*4lZoO!miGKPRNh7EmIP!Z{F# zj)H=Q8_;kWKr~2nGtD>p=A-?xe0Ou;*C_ECEjp(I=juW8#BV52#?Cwv#&L-v9mj>q zHG-`@J)F`#cjd_7)nC1K&XF!1Jg!~re@91x;N7R>hw|L<-n^Y#TGv7W+1x-VF`o2d zm1kBUL{m|!#b^C|x4BOLtt_=EX-3uz1qyPw==t08l{2Ftu`unXQs}JF??*?`F}bH9 z3Y!7OBM?|wC|fK@DmmuA1}ywjxG9irr9w)c>tSvoMQ$cwrO_E{t4d-%5wZdnstQFS rfoIYrLYAx(X`|7KqR4f|M+N@8!9oiou%J`mI4huJtuoIvhfDkd)3&Xx*ub$_p6L)1TLep9Vs7f>|17~83~HPOMfoYE$*D!fj66VQa%ypLYKm@B SB_nHcPGVjjG!^D?RQ*r4=? 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 delta 96 zcmX@Z{)cr!pCSt@V*w*0BP%l_0}~quV?Co|Lk9~tyB;fBZfb6RQ6= sizeof(Vault::Deposit)) + { + auto* p = (const Vault::Deposit*) pArg; + Env::DocAddText("method", "Deposit"); + Env::DocGroup gr("params"); + DocAddPk("User", p->m_Account); + } + break; + + case Vault::Withdraw::s_iMethod: + Env::DocAddText("method", "Withdraw"); + break; + } +} + +BEAM_EXPORT void Method_0(const ShaderID&, const ContractID&, uint32_t iMethod, const void* pArg, uint32_t nArg) +{ + Env::DocGroup gr(""); OnKind(); + OnMethod_Inner(iMethod, pArg, nArg); +} + +PARSER_MODULE_EXPORT_SIDS(s_pSid) +PARSER_MODULE_EXPORT_KIND_ONLY(OnKind) diff --git a/bvm/Shaders/vault/parser.wasm b/bvm/Shaders/vault/parser.wasm new file mode 100755 index 0000000000000000000000000000000000000000..0fd20d83b574fd6a4eca5f5e1e88c557f8e2e5f6 GIT binary patch literal 1084 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 X%>Y;FN80nVL2GS_g255|hXMZ!I$h?o literal 15969 zcmcgzeUKc*b?@n!{kYpZF~W*bz%jFHqU^~6B)})U23viSkYpiCmI#nk%BN*_knU^u zvb!fFhe8L)SR{fdi5;+GK7)-Mi&#m32uvI~fKkehqwtSONGRbHwqlbqc2X5pnS}h_ z>zCrV#)K z^vE~Um$+eV+qs*<%H;5-N_o887#^9JtT$T1r3Qa>xw&{1nwd5 z4ULgjC{py@N8hW$*7fD_DFez9=$b|tiZu0@%QI}KkJMVjE4T9m8G>h5gpHAH;f67d zD7T_sQPrwyG|D^lzfCHPlgeZ=?*dR}vci#G%9(ULFXcKyrn9h6HGQv_ z%LHzEBAlo8&6GM+N>J^d9Kg#AqQEq%IaBaPf|3vxIl* zP{5y6G`j?SD!&HfG*Zm~SQ*VbXxTiPmwiqy7kGr)i7f8=!CzA5UuP7CYLaIMRZhIEFQhSEkX1*#oB&J^PeiVe$nUA znu4NdpbO5R+)paYYTyQ$AQhzjztq!0T}U%nZHv;I3+S|f-shCaJAE>Dnp`+PM=nV#9<_lg|9h=V+t<1x9r2OCKeqL-Nfyix5?C+51G(i7J8jyF?u6EOde4KW>bBL;Y z89iQwnaNd$L}ZR1giN(42H^mO{|D50P{K0>&VUe0Net{7W2^r|MkjKA?<6!H0gaYy zN$dPSqJA(C^(yRGsJofg&kztomN1?nu`zCasI3)?coDgP*eX5sqJZ261#7{e3`l#I zy7SQy#yn4dW$}RF`B*2iz4@bR2_A4p4*Z5tPtp{yyw4H|WLHOGA^gZqe9{p)R!D1~ z#5R7Gtboy!de(s}R)>iIEcYK10Y)nS(9U;S%fFBrl!xIp)Rm(u@b9Dk_&5v)LLjYk zMt`$G#;9EujsGExqA}@Ns6(XNdJ$f0o6ewc0z&e6p2YzYKT_6cN&vK)JJw``Tq`(D z{6aJ_-rtCpDoty2B_LqqWkjtWEKn+Pv@}o9gYU0u_8_MG=pe+ErX}rz%fw)?O-q{P zB_%xQ1x(b3*Yv0Mnt~vkY710tibFhA#HUWm#;0z_ON_%ObE&;L^GsD9F(zI2+H7sax)6bX;?rM zlqr~j4vP0DN4&BhTt>OWS&?#VavCBk=y2nd-up_diI9J?@ zgwEB@6FJ`#&S-%a8S6w!CWvD(;EJX0w1eh7Xio9MCc5gXX{auAjMt1p&wd%{DyJ*^ zA)MV9O;!NC-3~lZ+gkx}2Y_~|JE^@|-ZM{1y`=vI<3pY3jZ!k>zo7UAO35;`z{F~J zASA^4!+(Gf0>e2;4=z9kz5c@t5a`HJ{t@%(`j7J4 zNof39Ok+2BkOz|&2$MVXnrAvnRpLZqZYljM6omlG zou(kjc4rD{mc$aa